目录
1、为什么是nginx而不是apache
2、nginx是如何做到高性能和高扩展的
3、Nginx运行工作线程数量优化
4、Nginx运行CPU亲和力优化
5、Nginx最大打开文件数优化
6、Nginx事件处理模型优化
7、Nginx开启高效传输模式
8、Nginx连接超时优化
9、fastcgi优化
10、gzip优化
11、expires缓存优化
12、内核参数优化
13、nginx防盗链
14、知识点总结
(1)轻量级,同样是启动web服务,比apache占用更少的内存和资源;nginx采用模块化事件驱动,以及异步单线程非阻塞式的架构,大量采用多路复用以及事件处理机制
(2)静态处理,nginx静态处理性能比apache高3倍
(3)高并发,nginx处理请求是异步非阻塞的,而tomcat是阻塞的,在高并发下,nginx能保持低资源低消耗高性能
(4)高度模块化的设计,编写模块相对简单
(5)社区活跃,各种高性能模块出品迅速
(1)事件驱动架构
(2)一个主进程和若干worker进程和helper进程
(3)每个worker进程以非阻塞的方式处理了多个连接,这减少了上下文切换的次数
(4)状态机的调用
nginx的安装:
(1)如何查看线程工作数
IO密集型:调整worker进程数 = CPU的核心数*2
查看CPU核心数
或者通过more /proc/cpuinfo查看CPU信息
调整之后查看进程数ps -ef|grep nginx |grep -v grep
(1)为什么要绑定nginx进程到不同的CPU上
CPU调度的时候两个进程有可能被分配达到一个CPU上,从而会导致一个非常的空闲,一个非常的忙,无法充分发挥CPU的运算能力
(2)如何分配不同的nginx进程给不同的CPU处理
(1)nginx报错打开文件数过多,原因是什么?
超过每个线程能够处理的最大连接数
如果上图中的65535改为1024,则会报错打开文件数过多,那为什么刚好1024也会报错呢,nginx内部的工作线程数也会占用,如果线程4个工作进程,则最大支持1020,如果现在是8个工作进程,则最大支持1016
(2)配置案例演示
安装ab 压测工具:yum -y install httpd-tools
安装后测每个worker 进程的并发数
ab -n 1024 -c 1024 http:/127.0.0.1/index.html
修改配置:worker_connections 1028;
ab -n 1028 -c 1028 http:/127.0.0.1/index.html
修改之后压测每个worker进程的并发数(实际上达不到1028,还是在1021就会报错,修改没有生效)
正确的修改(nginx文件中需修改这两个地方):
如下图所示:
修改nginx的这两个参数,重启nginx之后发现还是不生效
最后还需要修改操作系统的limits.conf
cat /etc/security/limits.conf
将如下两个参数修改为65535即可:
其中,*号表示任何用户
修改完之后查看操作系统支持的最大文件数:
使文件生效还必须执行:ulimit -n 65535
修改后查看生效情况:ulimit -a
修改完操作系统之后再进行压测,成功!
(1)常见的事件处理模型举例
select :
select库在是linux和windows平台都支持的事件驱动模型库,并且接口的定义也基本相同,只有部分参数的含义略有差异,最大并发限制1024,是最早期的事件驱动模型
poll:
Linux 的基本驱动模型,windows不支持此驱动模型,是select的升级版,取消了最大的并发限制,在编译nginx的时候可以使用--with-poll_module和--without-poll_module 这两个指定是否编译select库
epoll:
epoll库是nginx服务器支持的最高性能的事件驱动库之一。epoll 是 poll 的升级版,但是与poll的效率有很大的区别。epoll 的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核 ,返回的时候再去轮询检查这个表,以判断事件是否发生,epoll epoll 支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大数,同时epoll库的IO效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作
rtsig库:
一个不常用事件驱动模型,最大队列1024
kqueue:
用于支持BSD系列平台的高效事件驱动模型,主要用在FreeBSD 4.1reeBSD 4.1及以上版本,OpenBSD 2.0enBSD 2.0及以上版本,NetBSDetBSD及以上版本及MAC OS X平台上,该模型也是poll库的变种,因此和epollepoll没有本质上的区别,都是通过避免轮询操作提供效率
/dev/poll:
用于支持unix 衍生平台的高效事件驱动模型,主要是在solaris平台、HP/UX,该模型是Sun公司在开发Solaris系列平台提出的用于完成事件驱动机制的方案,它使用了虚拟的 /dev/poll设备,开发人员将要监视的文件描述符加入这个设备,然后通过ioctl()ioctl()调用来获取事件通知,因此,在运行以上平台的时候请使用/dev/pol事件驱动机制。
eventport:
该方案也是Sun公司在开发Solaris平台的时候提出的事件驱动库,支持Solaris10以上版本,该驱动库内有效防止内核崩溃等情况的发生
(2)不同的操作系统会采用不同的I/O模型
Linux下,Nginx采用epoll的I/O多路复用模型
Freebsd下,Nginx采用kqueue的I/O多路复用模型
solaris下,Nginx采用/dev/poll的I/O多路复用模型
Windows下,Nginx采用icop的IO多路复用模型
(3)Linux下指定最佳事件处理模型
(1)nginx中的“零拷贝”
本质上不经过用户态,直接在内核态完成传输,相当于少了几次内存之间的复制
(2)sendfile的参数详解
默认就是打开的
(3)tcp_nopush参数详解
防止网络阻塞,必须在sendfile参数开启之后才生效,把httpresponse header和文件的开始部分防止一个文件中进行发布,这样减少了网络报文段的数量,简而言之及时把http协议头放在一个文件中,从而减少网络阻塞
设置连接超时
keepalive_timeout:该参数用于设置客户端连接保持会话的超时时间,超过这个时间服务器会关闭该连接
client_header_timeout:该参数用于设置客户端请求头数据的超时时间,如果超时客户端还没有发送完整的header数据,服务器将返回“Request time out(408)错误”
client_body_timeout:该参数用于设置客户端请求主题数据的超时时间,如果超时客户端还没有发送完整的主体数据,服务器将返回“Request time out(408)错误”
send_timeout:用于制定响应客户端的超时时间,如果超时这个时间,客户端没有任何活动,nginx将会关闭连接
tcp_nodelay:默认情况下当数据发生时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O的性能,但是,在每次发生很少字节的业务场景中,使用tcp_nodelay等待的时间会比较长。
FastCGI各大配置项详解
fastcgi_connect_timeout 240; #Nginx服务器和后端FastCGI服务器连接的超时时间
fastcgi_send_timeout 240; #Nginx服务器允许FastCGI服务器返回数据的超时时间,即在规定的时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接
fastcgi_read_timeout 240; #Nginx服务器允许FastCGI服务器读取响应信息的超时时间,表示连接建立成功后,Nginx等待后端服务器的响应时间
fastcgi_buffer_size 64k; #Nginx FastCGI的缓冲区大小,用来读取从FastCGI服务器收到的第一部分响应信息的缓冲区大小
fastcgi_buffer 4 64k; #设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量
fastcgi_busy_buffers_size 128k; #用于设置系统很忙时可以使用的proxy_buffers大小
(1)Gzip压缩作用
将响应报文发送至客户端之前可启用压缩功能,这能够有效地节约贷款,并提高响应至客户端的速度。Gzip压缩可以配置http,server和location模块下
(2)Gzip修改配置
gzip on; #开启gzip压缩功能
gzip_min_length 10k; #设置允许压缩的页面最小字节数;这里表示如果文件小于10个字节,就不用压缩,因为没有意义,本来就很小
gzip_buffers 4 16k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存
gzip_http_version 1.1; #压缩版本
gzip_comp_level 2; #设置压缩比率,最小为1,处理速度快,传输速度慢;9位最大压缩比,处理速度慢,传输速度快;这里表示压缩级别,可以是0到9中的任一个,级别越高,压缩就越小,节省了带宽资源,但同时也消耗CPU资源,所以一般折中为6
gzip types text/css text/html application/javascript #制定压缩的类型,线上配置时尽可能配置多的压缩类型
gzip_disable "MSIE [1-6]\." ;#配置禁用gzip条件,支持正则。次数表示ie6及以下版本不启用gzip(因为ie低版本不支持)
gzip vary on; #选择支持vary header;该选项可以让前端的缓存服务器缓存结果gzip压缩的页面;这个可以不写,表示在传输数据时,跟客户端说明我使用了gzip压缩
(3)Gzip注意点
Nginx的gzipgzip压缩功能虽然好用,但是下面两类文件资源不太建议启用此压缩功能
a.图片类型资源(包括视频文件)
b.大文件资源
(1)expires注意点
nginx的缓存设置可以提高网站性能。对于网站的图片,尤其是新闻站,图片一旦发布,改动的可能性是非常小的,我们希望在用户访问一次后,图片缓存在用户的浏览器端,且时间比较长的缓存可以用到expires设置,nginx中设置过期时间。一般在location里面设置
(2)expires优点
a.expires可以降低带宽,节约成本
b.同时提升用户访问体验
c.减轻服务器的压力,节约服务器的成本,是web服务非常重要的功能
(3)expires缺点
a.被缓存的页面或数据更新了,用户看到的可能还是旧的内容
b.网站流量统计不准确
c.更新频繁的文件
(4)expires设置
(1) 修改/etc/sysctl.conf设置相关参数
更新完后执行sysctl -p生效
(1)防盗链的三种方法
a.水印,品牌宣传;你的带宽,服务器足够
b.防火墙直接控制,前提是知道ip来源
c.直接给404的错误提示
(2)设置防盗链的两种配置方案