Nginx参数优化

来源:互联网 发布:奥运知识知多少 编辑:程序博客网 时间:2024/05/29 18:40

Nginx和Apache的初始差别

Nginx不同于Apahce服务器,当进行了大量优化设置之后会有魔术般的明显性能提升的效果.
Nginx在安装完成之后,大部分参数已经是最优化了,我们需要管理的东西并不多.

Nginx参数优化配置及原因

#阻塞和非阻塞网络模型的概念

同步阻塞模型,一请求一进程.细讲来说就是当一个请求到达之后,它要进行一些列的操作,当它进行每一个操作的时候,我们都让这个进程停下来进行等待,在等到结果之后,进行下一个操作,直到这个进程结束.当进程增加到一定程度之后,更多的CPU时间浪费到该进程,性能急剧下降,所以负载效率不高.

非阻塞模型跟以上是截然不同的.当一个请求到达之后,当请求的某一个事情正在进行但是需要很长时间才能完成,此时进程并不是停在这里进行等待,而是把当前正在做的事情抛到一个队列里,然后进程再去做别的事情,去响应下一个请求或者下一个事件.当等待的事件完成之后,它将进行下一个动作,当组进程轮循到下一个要进行的事件之后再把它接手过来去做.

一个进程在极端的时间内可以响应大量请求,但是这个数值不是越多越好.

建议值 <= cpu核心数量,一般高于cpu数量并不会带来好处,也许还有进程切换开销的负面影响,等于这个值可以使每个cpu充分工作,适当的小于这个值也可以有空闲cpu来做系统或者其他应用要做的事情.

#工作进程数

worker_process 4;
设置参照上面

#工作进程到CPU的绑定

worker_cpu_affinity 0001 0010 0100 1000;

工作进程worker_process绑定到特定的cpu上,避免进程在cpu间切换的开销,它是由若干组数组来做成(cpu有几个内核有几个内核,你就设置每一组就有几位数字,有几个工作进程就设置几组数字.如下:有一个4核4进程的cpu,所以下列每一组都是4位数字,然后有每一组数字代表绑定在cpu的哪一个位置.)

#8核4进程时的设置方法 worker_cpu_affinity 00000001 00000010 00000100 10000000;

#最大文件可打开描述符

worker_rlimit_nofile 65535;

每个进程可打开文件描述符数量(在linux上我们打开网络端口,设备,磁盘文件都会返回一个文件描述符),文件描述符在每个进程上的可打开的最大数量是有限制的,一旦超出这个限制就会产生错误,请求就会被拒绝.在nginx上如果我们发出一个请求,在系统当前进程中如果可使用文件描述符达到上限,那么就会返回一个502错误.因此应该使得nginx能够最大化的使用系统的最大可打开文件数,这个值越大越好.
理论值 = 系统可用的最大数 / 进程数.
但是因为各个进程之间工作量并不是平均分配的,所以这个值还可以设置的再大一点.这样充分保证每个进程不会因为文件描述符的限制来拒绝链接.当然系统的文件描述符的限制也可以调节的通过ulimit -a,在open file一项会显示,通过ulimit -a + 数值的方式来修改(具体参数根据linux优化来设置).

EVENT模块

#每个进程最大连接数

(并发响应能力的关键配置值)
worker_connections 2000;

指定每个工作进程最多能静同时进行多少用户的连接.这个值是直接影响到Nginx服务器最大负载量,它能够接受足够多的连接,才能承受足够多的负载.
每个进程允许的最大时间连接数(不等同于可响应的用户数).
worker_connections * worker_processes = maxConnection;
以下是Nginx最大连接数的计算:
1.作为静态服务器时,一般 maxClient = work_connections * worker_processes /2;
(除以2的原因是一般一个浏览器会开两条连接,所以说一个用户会占用两条连接)
2.作为反向代理服务器,maxClient = worker_connections * worker_processes /4;
(同上除以2的原因,另外的两条连接自然是Nginx到后端服务器的代理.)
以上两个配置不会出现在配置文件,只是方便在进行压力测试的时候预估最大连接数.比如在进行压力测试的时候,预计是最大连接数是5000.实测不够,这个时候借助该参数就知道该怎么调整了.

#指定事件处理网络模型

指明使用的是epoll还是kquene(*BSD)
use epoll;

具体的网络模型在本文章第一部分,Nginx使用的是非阻塞模型.对于非阻塞模型在不同的操作系统上具体实现有差异,一般linux下都是epoll,有些BSD类系统上使用的是kquene模型.实际上大多数时候不需要我们来配置,在进行安装的时候,Nginx会自动识别系统支持哪些模型,来进行合理的值的选择.
额外说明的是在Windows上,Nginx没有对对windows去进行非阻塞色网络模型优化的编程,所以在Windows上不能使用非阻塞网络模型,这就决定着Nginx在Windows比linux上性能低的原因,所以说在生产环境中如果在高负载的情况下不建议用Windows系统.

PS:要达到超高负载下最好的网络响应能力,还有必要优化与网络相关的linux内核参数

HTTP模块

include        mime.type;default_type    application/octet-stream;

#访问日志

access_log off;

每个用户的每次请求都要进行记录,但是在高负载的情况下,大量的请求进来之后会进行大量的日志记录,会造成很大的开销,如果说关闭这层访问日志,可以减少很大的IO开销,这是从性能优化的角度来说的.但是从实际的运营角度来说,会失去用户行为比如访问频率和经常访问的页面.

#错误日志

error_log logs/error.log crit;

同访问日志,如果错误日志很多的话也会造成不小的压力,可以设置为off.但是在发生错的时候,可以设置为较高级别,只记录比较严重的错误,这样做可以适当减轻IO的压力.

#启用内核复制模式

启用内核复制模式的选项,应保持开启达到最快IO效率.(默认开启)
sendfile on;

关于内核复制,简单来说,一个磁盘文件通过nginx从网络上发送出去,在这个过程中如果采用普通的模式,它会从磁盘上读取到内存里,在内存里有系统级的内存,用户级的内存,还有 网络的内存.在内存里要经过一系列的复制才发送出去,会造成一系列的内存开销.如果开启了这一项,就是内核复制模式,直接从磁盘级IO级别复制到网络IO的级别,不经过用户层次,减少了复制过程加快速度,所以正常情况下保持开启状态就可以.

#设置链接超时时间

keepalive_timeout 30s;

这个时长的设置根据自己的使用场景,使得一个链接能够把一个页面的其他资源加载完就可以了.如果页面有大量的图片,可以设置大一点,如果是一些很精练的可以设置的小一点.针对于该数值设置过大情况,可以这么理解.假设如果这个在一台服务器只能接受100个链接,现在有100个请求到达,我们处理完了请求之后,我们让这个100链接存活下去,那么这100个链接很少或者根本不错任何事情,那现在有一个新用户想要请求,他已经进不来了.然而已经进来的链接还不做任何事情占用连接数,那么就会造成单位时间内可以可以相应的最大用户数降低,这是带来的负面影响,所以要适当设置这个值尽量低,这就是这个值的含义.

#启用内容压缩

启用内容压缩,可以有效降低网络流量
gzip on;
限制压缩文件的大小,即达对太小的文件不会压缩文件大小达到这个值才会进行压缩,避免内容过段压缩效果不佳,不仅如此还会对系统资源造成浪费.
gzip_min_length 1000;
选择的压缩级别,可选值为1-9,压缩级别越高压缩率越高,对系统性能要求较高,要根据服务器的性能来设定.
gzip_comp_level 4;
压缩类别的设定
gzip_type text/plain text/css application/json application/x-javascript text/xml application/x-httpd-PHP image/jpeg image/gif image/png;

指定哪些文件要压缩,哪些不被压缩.比如用户进行图片下载,文件下载这些二进制的,在压缩液压缩不了多少,但是对于一些文本,html页面,js这些,它可以达到很好的效果.指定压缩效果好的类型来压缩,压缩效果不好的排除掉,这样做也可以起到节约系统资源的.

#静态文件缓存

(默认未打开)
最大缓存数量,文件未使用存活期.
open_file_cache max=655350 inactive=20s;
验证缓存有效时间间隔
open_file_cache_valid 30s;
有效时间内文件最少使用次数
open_file_cache_min_use 2;

静态文件缓存的作用,如果我们经常访问一个网页文件的话,每次都要从磁盘上读取这个文件,这样会消耗大量的IO,显然性能不会太高.如果对于经常访问的这些把它加载到内存里,用户请求的时候直接从内存中取出,这样的话会极大地提高服务器的相应能力,也会提高服务器的负载量.通过open_file-cache可以开启缓存,max值指的是缓存中最大可以存放多少文件,inactive值为文件的存活期.因为缓存的数量是有限的,当超过这个限制时,要根据一定的算法把不经常使用的排除掉,把经常使用的放进来,提高缓存的命中率.而在这里我们是通过文件存活期和有效时间内文件使用次数来决定的.这两个结合起来的含义是当文件加载到缓存里之后,在单位时间内达到访问次数,才算是命中率有效的文件,如果达不到就算是命中率低的文件就会被释放.具体比如上面,30s验证时间内,如果一个文件在20s内使用低于2次就会被释放掉.