美文网首页
Nginx 配置优化篇

Nginx 配置优化篇

作者: 散装咖啡 | 来源:发表于2017-09-16 14:49 被阅读359次

    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个子线程来处理并发连接。
    <value name="max_children">60</value>
    
    最多打开文件数。
    <value name="rlimit_files">65535</value>
    
    每个进程在重置之前能够执行的最多请求数。
    <value name="max_requests">65535</value>
    

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

    相关文章

      网友评论

          本文标题:Nginx 配置优化篇

          本文链接:https://www.haomeiwen.com/subject/acoysxtx.html