Nginx 配置优化篇

Nginx 压缩传输

开启Gzip
gzip on;      

不压缩临界值,大于1K的才压缩,一般不用改
gzip_min_length 1k;   

设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k 代表以 16k 为单位,按照原始数据大小以 16k 为单位的4倍申请内存。
gzip_buffers 4 16k;

gzip_http_version 1.1;

范围为1~9。1 压缩比最小处理速度最快,9 压缩比最大但处理最慢。压缩越快越消耗cpu。
gzip_comp_level 2;

匹配MIME类型进行压缩,默认"text/html" 类型是会被压缩的。 此外,Nginx下的gzip默认不压缩javascript、图片等静态资源文件,可以通过gzip_types指定需要压缩的MIME类型,非设置值则不进行压缩 
text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持。因此,为避免浪费不支持的也压缩,需要根据客户端的HTTP头来判断,是否需要压缩。
gzip_vary on; 

使用curl命令测试gzip是否成功开启
curl -I -H "Accept-Encoding: gzip, deflate" "http://www.qcloud.com/example/"

fastCGI管理器配置

为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。levels参数设置缓存目录的目录分级以及子目录的数量。fastcgi_cache缓存目录,可以设置目录哈希层级,比如2:2会生成256*256个字目录,keys_zone是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先写在fastcgi_temp_path再移到fastcgi_cache_path,所以这两个目录最好在同一个分区,从0.8.9之后可以在不同的分区,不过还是建议放同一分区。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; 
fastcgi_temp_path /usr/local/nginx/fastcgi_temp_path

指定连接到后端FastCGI的超时时间
 fastcgi_connect_timeout 300;

向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
fastcgi_send_timeout 300;

接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。
fastcgi_read_timeout 300;

指定读取FastCGI应答第一部分 需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个 16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),但是你如果在fastcgi_buffers指令中指 定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存
fastcgi_buffer_size 16k;

指定本地需要用多少和多大的缓冲区来 缓冲FastCGI的应答,如上所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,如果大于256k,增大 于256k的部分会缓存到fastcgi_temp指定的路径中, 当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值 的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为 256k就可以把这个值设置为16 16k,或者4 64k 或者64 4k,但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用4 64k它会分配1个64k的缓冲区去缓存,而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理。
fastcgi_buffers 16 16k;

默认值是fastcgi_buffers的两倍。
fastcgi_busy_buffers_size 16k;

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。
fastcgi_temp_file_write_size 16k;

开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防止502错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求
fastcgi_cache TEST;

指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数,如上例,如果在5分钟内某文件1次也没有被使用,那么这个文件将被移除。
fastcgi_cache_min_uses 1;

哪些类型的缓存失效。
fastcgi_cache_use_stale error timeout invalid_header http_500;

nginx缓冲区优化(反向代理使用)
关于缓冲, 主要是合理设置缓冲区大小, 尽量避免缓冲到硬盘时的情况如果proxy_buffering关闭,那么nginx会立即把从后端收到的响应内容传送给客户端,每
次取的大小为proxy_buffer_size的大小,这样效率肯定会比较低。 proxy_buffering启用时,要提防使用的代理缓冲区太大。这可能会吃掉你的内存,限制代理能够支持的最大并发连接数。

后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 20s; 

#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 20s;  

后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 20s;

一次访问能写入的临时文件的大小,默认是 proxy_buffer_size 和 proxy_buffers 中设置的缓冲区大小的2倍,Linux下一般是8k。
proxy_temp_file_write_size 64k;

proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_cache_path 缓存文件路径
levels 设置缓存文件目录层次;levels=1:2 表示两级目录
keys_zone 设置缓存名字和共享内存大小
inactive 在指定时间内没人访问则被删除
max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
proxy_temp_path /xxx/proxy_temp_path;   缓存目录
proxy_cache_path 
  /xxx/proxy_cache_path 
  levels=1:2 
  keys_zone=cache_one:2000m
  inactive=1d
  max_size=5m;

proxy_buffering开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端(边收边传,不是全部接收完再传给客户端)。控制是否打开后端响应内容的缓冲区,如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。 但是无论proxy_buffering是否开启,对proxy_buffer_size都是生效的。
proxy_buffering on;

响应头的缓冲区,没有必要也跟着设置太大。最好单独设置,一般设置个4k就够了。
proxy_buffer_size 4k; 

proxy_buffers的缓冲区大小一般会设置的比较大,以应付大网页。当中单个缓冲区的大小是由系统的内存页面大小决定的,Linux系统中一般为4k。 proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。
proxy_buffers 8 1M;  // 高速传输
proxy_buffer 4 32k;  //  一般情况

proxy_busy_buffers_size不是独立的空间,它是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,
所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),
然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。
proxy_busy_buffers_size 2M;  // 高速传输
proxy_busy_buffers_size 64k; //  一般情况

proxy_max_temp_file_size指定当响应内容大于proxy_buffers指定的缓冲区时, 写入硬盘的临时文件的大小. 如果超过了这个值, Nginx将与Proxy服务器同步的传递内容, 而不再缓冲到硬盘。某些请求的响应过大,则超过buffers的部分将被缓冲到硬盘(缓冲目录由_temp_path指令指定), 当然这将会使读取响应的速度减慢, 影响用户体验. 可以使用proxy_max_temp_file_size指令关闭磁盘缓冲.
proxy_max_temp_file_size 0;

Nginx配置详解

使用的用户和组
user  www www;

指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍)
worker_processes 8;

前方高能,请注意!下面分别是开启了8个内核,8个进程(如果需要开启16进程,00000001 修改成00000001 00000010 代表第一个CPU内核处理第一个和第二个进程,有多少个进程就写多少个数,每个数的第几位代表对应的第几核)
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;

下面这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是系统的最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n(需要在Linux上调整这个数)的值保持一致。
worker_rlimit_nofile 204800;

使用epoll的I/O模型,用这个模型来高效处理异步事件
use epoll;

每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes * worker_connections。
worker_connections 204800;

限制用户上传文件的大小
client_max_body_size 300m;

客户端缓存文件的大小
client_body_buffer_size 128k;

客户端请求内容超时时间,1分钟
client_body_timeout  600;

客户端请求header头信息的超时时间,1分钟
client_header_timeout  600;

这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=65535 inactive=60s;

这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 80s;

指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件更改信息一直是在缓存中打开的
open_file_cache_min_uses 1;

URI过长或request header过大导致400错误
#start
servername的哈希表大小 -- 客户端请求头缓冲区大小
server_names_hash_bucket_size 128k;

请求头总长度大于128k时使用large_client_header_buffers设置的缓存区。指令参数4为个数,128k为大小,申请4个128k。默认是8k。,
large_client_header_buffers 4 128k;
#end
   
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得
client_header_buffer_size 2k;
 
可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效。
sendfile on;

告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。就是说数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。tcp_nopush 这个参数只有 sendfile on 的时候才有用。
tcp_nopush on;

告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,
就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。
tcp_nodelay 只在 keepalive 连接状态中使用。
tcp_nodelay on;

http连接超时时间,默认是60s,功能是使客户端到服务器端的连接在设定的时间内持续有效,当出现对服务器的后继请求时,该功能避免了建立或者重新建立连接。切记这个参数也不能设置过大!否则会导致许多无效的http连接占据着nginx的连接数,终nginx崩溃!在一般情况下,这个配置会减少网络流量的消耗,减少请求连接数,例如用户在浏览网页的时候保持连接,减少连接数的开销。但是在高并发下,这个配置会直接影响NGINX的性能。相反,这个数调小可以提高并发数。
keepalive_timeout 60;

下面这个参数将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=204800 inactive=20s;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,
文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除
open_file_cache_min_uses 1;
  
下面这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
  
隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息,这样对于安全性是有好处的。
server_tokens off;



另外,FastCGI自身也有一些配置需要进行优化,如果你使用php-fpm来管理FastCGI,可以修改配置文件中的以下值:
同时处理的并发请求数,即它将开启最多60个子线程来处理并发连接。
60

最多打开文件数。
65535

每个进程在重置之前能够执行的最多请求数。
65535

参考文章
http://blog.csdn.net/mary881225/article/details/70173907
http://www.vpsee.com/2009/06/64mb-vps-optimize-nginx/

你可能感兴趣的:(Nginx 配置优化篇)