• 如来神掌第一式第十二招----Nginx详解


    ###############################################################################
    # Name : Mahavairocana                                                                                                                                           
    # Author : Mahavairocana                                                                                                                                         
    # QQ : 10353512                                                                                                                                                    
    # WeChat : shenlan-qianlan                                                                                                                                      
    # Blog : http://www.cnblogs.com/Mahavairocana/                                                                                                       
    # Description : You are welcome to reprint, or hyperlinks to indicate the                                                                        
    #                    source of the article, as well as author information.                                                                                ###############################################################################

     一、NGINX简介  (http://nginx.org/)

    二、术语详解

      1、编译知识储备

    PCRE库:PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx,因为Nginx的HTTP模块需要靠它来解析正则表达式。另外,pcre-devel是使用PCRE做二次开发时所需要的开发库,包括头文件等,这也是编译Nginx所必须使用的。ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
    zlib库:zlib库用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf中配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量,则在编译时就必须把zlib编译进Nginx。zlib-devel是二次开发所需要的库。 http://zlib.net/
    OpenSSL库:如果服务器不只是要支持HTTP,还需要在更安全的SSL协议上传输HTTP,那么需要拥有OpenSSL。另外,如果我们想使用MD5、SHA1等散列函数,那么也需要安装它。https://www.openssl.org/source/
    GD库:php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片)   

       2、编译参数套路

    --with- =启用该功能
    --without =禁用该功能
    其他均为路径指向,如配置文件,pid,日志文件等;

    关键参数说明
    ngx_http_ssl_module 使支持https请求,需已安装openssl
    ngx_http_realip_module 这个模块允许从请求标头更改客户端的IP地址值,默认为关
    ngx_http_addition_module 作为一个输出过滤器,支持不完全缓冲,分部分响应请求
    ngx_http_xslt_module 过滤转换XML请求
    ngx_http_image_filter_module 传输JPEG/GIF/PNG 图片的一个过滤器
    ngx_http_geoip_module 该模块创建基于与MaxMind GeoIP二进制文件相配的客户端IP地址的ngx_http_geoip_module变量
    ngx_http_sub_module 允许用一些其他文本替换nginx响应中的一些文本
    ngx_http_dav_module 增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法默认情况下为关闭,需编译开启
    ngx_http_flv_module 提供寻求内存使用基于时间的偏移量文件
    ngx_http_gzip_static_module 在线实时压缩输出数据流
    ngx_http_random_index_module 从目录中随机挑选一个目录索引
    ngx_http_secure_link_module 计算和检查要求所需的安全链接网址
    ngx_http_degradation_module 允许在内存不足的情况下返回204或444码
    ngx_http_stub_status_module 获取nginx自上次启动以来的工作状态
    ngx_http_charset_module 重新编码web页面,但只能是一个方向--服务器端到客户端,并且只有一个字节的编码可以被重新编码
    ngx_http_gzip_module 该模块同-with-http_gzip_static_module功能一样
    ngx_http_ssi_module 该模块提供了一个在输入端处理处理服务器包含文件
    ngx_http_userid_module 该模块用来处理用来确定客户端后续请求的cookies
    ngx_http_access_module 该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址
    disable ngx_http_autoindex_modue 该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。
    ngx_http_geo_module 创建一些变量,其值依赖于客户端的IP地址
    ngx_http_map_module 使用任意的键/值对设置配置变量
    ngx_http_split_clients_module 该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等
    disable ngx_http_referer_module 该模块用来过滤请求,拒绝报头中Referer值不正确的请求
    ngx_http_rewrite_module 该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。如果在server级别设置该选项,那么他们将在 location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。如果这个URI重写是因为location部分的规则造成的,那么 location部分会再次被执行作为新的URI。 这个循环会执行10次,然后Nginx会返回一个500错误。
    ngx_http_proxy_module 有关代理服务器
    ngx_http_fastcgi_module 该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 FastCGI一个常驻型的公共网关接口。
    ngx_http_uwsgi_module 该模块用来医用uwsgi协议,uWSGI服务器相关
    ngx_http_scgi_module 该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。
    ngx_http_memcached_module 该模块用来提供简单的缓存,以提高系统效率
    ngx_http_limit_zone_module 该模块可以针对条件,进行会话的并发连接数控制
    ngx_http_limit_req_module 该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件
    ngx_http_empty_gif_module 该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用
    ngx_http_browser_module 该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则$modern_browser等于modern_browser_value指令分配的值;如 果浏览器为old,则$ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1
    ngx_http_upstream_ip_hash_modul支 该模块用于简单的负载均衡
    ngx_http_perl_module 该模块使nginx可以直接使用perl或通过ssi调用perl
    ngx_google_perftools_module 调试用,剖析程序性能瓶颈
    ngx_cpp_test_module 测试程序中引用的头文件是否与C++兼容

     三、配置文件详解

    ######Nginx配置文件nginx.conf中文详解#####
    
    
    user www www;    #定义Nginx运行的用户和用户组
    worker_processes 8; ##nginx进程数,建议设置小于CPU总核心数。
    worker_cpu_affinity 0001 0010 0100 1000;    #绑定worker到CPU,提升缓存命中率
    error_log /usr/local/nginx/logs/error.log info;#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
    pid /usr/local/nginx/logs/nginx.pid;    #进程pid文件
    
    
    worker_rlimit_nofile 65535;    #最多可以打开文件数量;与ulimit -n 显示保持一致,如果需要调整,需要同时进行调整;文件数量被占满的时候,会出现502的情况
    
    
    events
    {
        accept_mutex {off|on} #是否打开Ningx的负载均衡锁;此锁能够让多个worker进轮流地、序列化地与新的客户端建立连接;而通常当一个worker进程的负载达到其上限的7/8,master就尽可能不再将请求调度此worker;
        
        use epoll;  [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
          
        worker_connections 65535;    #单个进程最大连接数(最大连接数=连接数*进程数)
        
        keepalive_timeout 60;    #keepalive超时时间。
    
        client_header_buffer_size 4k;    必须设置为“系统分页大小”的整倍数。执行getconf PAGESIZE可获取当前系统系统分页。
    
        open_file_cache max=65535 inactive=60s;   #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
    
        open_file_cache_valid 80s;   #检查一次缓存的有效信息。
    
        open_file_cache_min_uses 1;        inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
        
        open_file_cache_errors on;    #语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.
    }
     
     
     
    #设定http服务器,利用它的反向代理功能提供负载均衡支持
    http
    {
        include mime.types;  #文件扩展名与文件类型映射表
        default_type application/octet-stream; #默认文件类型
        charset utf-8;  #默认编码   #
        server_names_hash_bucket_size 128;#服务器名字的hash表大小
        client_header_buffer_size 32k;#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
      
        large_client_header_buffers 4 64k;#客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
        client_max_body_size 8m;  #设定通过nginx上传文件的大小
        sendfile on;#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
        #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    
        
        autoindex on;#开启目录列表访问,合适下载服务器,默认关闭。
        tcp_nopush on;#此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
        tcp_nodelay on;
        keepalive_timeout 120; #长连接超时时间,单位是秒
    
        
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 128k;
        #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    
        
        gzip on; #开启gzip压缩输出
        gzip_min_length 1k;    #最小压缩文件大小
        gzip_buffers 4 16k;    #压缩缓冲区
        gzip_http_version 1.0;    #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
        gzip_comp_level 2;    #压缩等级
        gzip_types text/plain application/x-javascript text/css application/xml;  
        #gzip模块设置    #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
        gzip_vary on;
    
        
        #limit_zone crawler $binary_remote_addr 10m;    #开启限制IP连接数的时候需要使用
    
        
        #nginx防盗链
            location ~* .(gif|jpg|png|swf|flv)$ {
            root html
            valid_referers none blocked *.nginxcn.com;   #允许该页面进行引用
            if ($invalid_referer) {
            rewrite ^/ www.nginx.cn            #重定向到警告页面    
            #return 404;
            }
            }
            
    
        #负载均衡配置
        upstream piao.Mahavairocana.com {
         
            #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
            server 192.168.80.121:80 weight=3;
            server 192.168.80.122:80 weight=2;
            server 192.168.80.123:80 weight=3;
    
            #nginx的upstream目前支持4种方式的分配
            #1、轮询(默认)
            #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
            #2、weight
            #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
            #例如:
            #upstream bakend {
            #    server 192.168.0.14 weight=10;
            #    server 192.168.0.15 weight=10;
            #}
            #2、ip_hash
            #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
            #例如:
            #upstream bakend {
            #    ip_hash;
            #    server 192.168.0.14:88;
            #    server 192.168.0.15:80;
            #}
            #3、fair(第三方)
            #按后端服务器的响应时间来分配请求,响应时间短的优先分配。
            #upstream backend {
            #    server server1;
            #    server server2;
            #    fair;
            #}
            #4、url_hash(第三方)
            #按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
            #例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
            #upstream backend {
            #    server squid1:3128;
            #    server squid2:3128;
            #    hash $request_uri;
            #    hash_method crc32;
            #}
    
            #tips:
            #upstream bakend{#定义负载均衡设备的Ip及设备状态}{
            #    ip_hash;
            #    server 127.0.0.1:9090 down;
            #    server 127.0.0.1:8080 weight=2;
            #    server 127.0.0.1:6060;
            #    server 127.0.0.1:7070 backup;
            #}
            #在需要使用负载均衡的server中增加 proxy_pass http://bakend/;
    
            #每个设备的状态设置为:
            #1.down表示单前的server暂时不参与负载
            #2.weight为weight越大,负载的权重就越大。
            #3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
            #4.fail_timeout:max_fails次失败后,暂停的时间。
            #5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
    
            #nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
            #client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
            #client_body_temp_path设置记录文件的目录 可以设置最多3层目录
            #location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
        }
         
         
         
        
        server    #虚拟主机的配置
        {
            
            listen 80;    #监听端口
    
            
            server_name www.Mahavairocana.com Mahavairocana.com;    #域名可以有多个,用空格隔开
                    
            #server_name可以跟多个主机名,名称中可以使用通配符和正则表达式(通常以~开头);当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较;比较方式:
            #    (1) 先做精确匹配;www.Mahavairocana.com 
            #    (2) 左侧通配符匹配;*.Mahavairocana.com
            #    (3) 右侧通配符匹配;www.abc.com, www.*
            #    (4) 正则表达式匹配: ~^.*.Mahavairocana.com$
            #
                4、server_name_hash_bucket_size 32|64|128;
                    为了实现快速主机查找,nginx使用hash表来保存主机名;
            
            index index.html index.htm index.php;
            root /data/www/Mahavairocana;
    
            #对******进行负载均衡
            location ~ .*.(php|php5)?$
            #location [ = | ~ | ~* | ^~ ] uri { ... }
            #location @name { ... }
            #功能:允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理;比如:http://www.Mahavairocana.com/images/logo.gif
            #
            #=:精确匹配;
            #~:正则表达式模式匹配,匹配时区分字符大小写
            #~*:正则表达式模式匹配,匹配时忽略字符大小写
            #^~: URI前半部分匹配,不检查正则表达式
            #
            #   http://www.Mahavairocana.com/index.html
            #   http://www.Mahavairocana.com/
            #   http://www.Mahavairocana.com/documents/index.html
            #   http://www.Mahavairocana.com/images/index.html
            #   http://www.Mahavairocana.com/images/a.png
            
            {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
            }
             
         
            location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$       #图片缓存时间设置
            {
                expires 10d;
            }
             
         
            location ~ .*.(js|css)?$       #JS和CSS缓存时间设置
            {
                expires 1h;
            }
             
            
            log_format access '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" $http_x_forwarded_for';
             #日志格式设定
            #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
            #$remote_user:用来记录客户端用户名称;
            #$time_local: 用来记录访问时间与时区;
            #$request: 用来记录请求的url与http协议;
            #$status: 用来记录请求状态;成功是200,
            #$body_bytes_sent :记录发送给客户端文件主体内容大小;
            #$http_referer:用来记录从那个页面链接访问过来的;
            #$http_user_agent:记录客户浏览器的相关信息;
            #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
             
           
            access_log  /usr/local/nginx/logs/host.access.log  main;     #定义本虚拟主机的访问日志
            access_log  /usr/local/nginx/logs/host.access.404.log  log404;
             
            #对 "/" 启用反向代理
            location / {
                proxy_pass http://127.0.0.1:88;
                proxy_redirect off;
                proxy_set_header X-Real-IP $remote_addr;                        
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP                      
                proxy_set_header Host $host;      #以下是一些反向代理的配置,可选。        
                client_max_body_size 10m;    #允许客户端请求的最大单文件字节数
                client_body_buffer_size 128k;    #缓冲区代理缓冲用户端请求的最大字节数,            
                proxy_intercept_errors on;    #表示使nginx阻止HTTP应答代码为400或者更高的应答。            
                proxy_connect_timeout 90;    #后端服务器连接的超时时间_发起握手等候响应超时时间
                #nginx跟后端服务器连接超时时间(代理连接超时)            
                proxy_send_timeout 90;    #后端服务器数据回传时间(代理发送超时)
                #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据            
                proxy_read_timeout 90;#连接成功后,后端服务器响应时间(代理接收超时)
                #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)            
                proxy_buffer_size 4k;#设置代理服务器(nginx)保存用户头信息的缓冲区大小
                #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
    
                #proxy_buffers缓冲区,网页平均在32k以下的设置            
                proxy_buffers 4 32k;    #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k           
                proxy_busy_buffers_size 64k;     #高负荷下缓冲大小(proxy_buffers*2)            
                proxy_temp_file_write_size 64k;    #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
                #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            }
            #配置ssl 站点
                    server {
                    listen               443;
                    server_name            www.a.com
                    ssl                  on;
                    ssl_certificate      /usr/local/nginx/conf/cert.pem;
                    ssl_certificate_key  /usr/local/nginx/conf/cert.key;
                    keepalive_timeout    70;
                    ssl_session_cache    shared:SSL:1m;
                    ssl_session_timeout    5m;
                    
                    ssl_ciphers        HIGH:!aNULL!MD5;
                    ssl_prefer_server_ciphers    on;
                    
                    location / {
                        root /vhosts/ssl1;
                        index    index.html;
                    }
                    
                    
                    
                }
                    ngx_http_ssl_module模块配置
        
            #ssl_certificate file; 
            #    证书文件路径;
            #ssl_certificate_key file;
            #    证书对应的私钥文件;
            #ssl_ciphers ciphers;
            #    指明由nginx使用的加密算法,可以是OpenSSL库中所支持各加密套件;
            #ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
            #    指明支持的ssl协议版本,默认为后三个;
            #ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
            #    指明ssl会话缓存机制;
            #        builtin:使用OpenSSL内置的ssl会话缓存,对机制为各worker私有;
            #        shared:在各worker之间使用一个共享的缓存;
            #            name:独有名称;
            #            size:缓存空间大小;
            #ssl_session_timeout time;
            #    ssl会话超时时长;即ssl session cache中的缓存有效时长;
            
            location /rewriteeg/ {
                root "/web/test"
                rewite    ^/web/rewite/(.*)$ /forum/$1 break
            }
            ngx_http_rewrite_module模块配置
            将请求的url基于正则表达式进行重写;
                http --> https,  domain1.tld --> domain2.tld, uri1 --> uri2, ...
            
            指令:
                rewrite  regex  replacement [flag];
                    regex:正则表达式,用于匹配用户请求的url;
                    replacement:重写为的结果;
                    [flag]:
                        last:重写完成之后停止对当前uri的进一步处理,改为对新url的新一轮处理;
                        break:重写完成之后停止当uri的处理,转向其后面的其它配置;
                        redirect:重写完成之后会返回客户端一个临时的重定向,由客户端对新的url重新发起请求(302);
                        permanent:重写完成之后会返回客户端一个永久的重定向,由客户端对新的url重新发起请求(301);
                
                        server {
                            ...
                            rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last;
                            rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra  last;
                            return  403;
                            ...
                        }                
                        
                        http://www.magedu.com/download/a/b/c/media/32.wmv  --> 
                            /download/a/b/c/mp3/32.mp3
                            
                    PCRE正则表达式元字符
                        字符匹配:., [ ], [^]
                        次数匹配:*, +, ?, {m}, {m,}, {m,n}
                        位置锚定:^, $
                        或者:|
                        分组:(), 后向引用, $1, $2, ...
                
                if (condition) { ... }
                    条件判断,引用新的配置上下文;
                    
                    condition:
                        比较表达式:
                            ==,!=
                            ~:模式匹配,区分字符大小写;
                            ~*:模式匹配,不区分字符大小写;
                            !~:模式不匹配,区分字符大小写;
                            !~*: 模式不匹配,不区分字符大小写;
                        文件及目录判断:
                            -f, !-f:是否存在且为普通文件;
                            -d, !-d: 是否存在且为目录;
                            -e, !-e:是否存在;
                            -x, !-x:是否存在且可执行;
                
                return code [text];
                return code URL;
                return URL;
                    立即停止对请求的uri的处理,并返回指定的状态码;
                    
                set $variable value;    
                    变量赋值;
                    
                rewrite_log on | off;
                    是否将重写日志记入error log中,默认为关闭;
                    
                调试方法:
                    错误日志debug;
                    开启rewrite_log;
            
            
            #设定查看Nginx状态的地址
            location /NginxStatus {
                stub_status on;
                access_log on;
                auth_basic "NginxStatus";
                auth_basic_user_file confpasswd;
                #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
            }
            Active connections: 当前处于打开连接的状态连接数;
            Reading: Writing: Waiting:
                Reading:正处于接收请求状态的连接数;
                Writing:请求以及接收完成,正处于处理请求或发送响应过程中的连接数;
                Waiting:保持链接模式,且处于活动状态的连接数;
                
            #缓存服务器
          /path/to/cache  #本地路径,用来设置Nginx缓存资源的存放地址  
            levels          #默认所有缓存文件都放在同一个/path/to/cache下,但是会影响缓存的性能,因此通常会在/path/to/cache下面建立子目录用来分别存放不同的文件。假设levels=1:2,Nginx为将要缓存的资源生成的key为f4cd0fbc769e94925ec5540b6a4136d0,那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/path/to/cache/0/6d目录中  
            key_zone        #在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key  
            max_size        #最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件  
            inactive        #未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件  
            use_temp_path   #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝  
            proxy_cache     #启用proxy cache,并指定key_zone。另外,如果proxy_cache off表示关闭掉缓存。 
    #本地动静分离反向代理配置 #所有jsp的页面均交由tomcat或resin处理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } #所有静态文件由nginx直接读取不经过tomcat或resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt| pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; } } }

    四、常用优化参数

        网络连接相关的设置:
        1、keepalive_timeout time;
            保持连接的超时时长;默认为75秒;
    
        2、keepalive_requests n;
            在一次长连接上允许承载的最大请求数;
    
        3、keepalive_disable [msie6 | safari | none ]
            对指定的浏览器禁止使用长连接;
    
        4、tcp_nodelay on|off
            对keepalive连接是否使用TCP_NODELAY选项;
    
        5、client_header_timeout time; 
            读取http请求首部的超时时长;
    
        6、client_body_timeout time;
            读取http请求包体的超时时长;
    
        7、send_timeout time;
            发送响应的超时时长;
    
    对客户端请求的限制:
        1、limit_except method ... { ... }
            指定对范围之外的其它方法的访问控制;
    
            limit_except GET {
                allow 172.16.0.0/16;
                deny all; 
            }
    
        2、client_max_body_size SIZE;
            http请求包体的最大值;常用于限定客户所能够请求的最大包体;根据请求首部中的Content-Length来检测,以避免无用的传输;
    
        3、limit_rate speed;
            限制客户端每秒钟传输的字节数;默认为0,表示没有限制;
    
        4、limit_rate_after time;
            nginx向客户发送响应报文时,如果时长超出了此处指定的时长,则后续的发送过程开始限速;
    
    文件操作的优化:
        1、sendfile on|off
            是否启用sendfile功能;
    
        2、aio on|off
            是否启用aio功能;
    
        3、open_file_cache max=N [inactive=time]|off
            是否打开文件缓存功能;
                max: 缓存条目的最大值;当满了以后将根据LRU算法进行置换;
                inactive: 某缓存条目在指定时长时没有被访问过时,将自动被删除;默认为60s; 
    
            缓存的信息包括:
                文件句柄、文件大小和上次修改时间;
                已经打开的目录结构;
                没有找到或没有访问权限的信息;
    
        4、open_file_cache_errors on|off
            是否缓存文件找不到或没有权限访问等相关信息;
    
        5、open_file_cache_valid time;
            多长时间检查一次缓存中的条目是否超出非活动时长,默认为60s; 
    
        6、open_file_cache_min_use #;
            在inactive指定的时长内被访问超此处指定的次数地,才不会被删除;
    
    对客户端请求的特殊处理:
        1、ignore_invalid_headers on|off
            是否忽略不合法的http首部;默认为on; off意味着请求首部中出现不合规的首部将拒绝响应;只能用于server和http; 
    
        2、log_not_found on|off
            是否将文件找不到的信息也记录进错误日志中;
    
        3、resolver address;
            指定nginx使用的dns服务器地址;
    
        4、resover_timeout time;
            指定DNS解析超时时长,默认为30s; 
    
        5、server_tokens on|off;
            是否在错误页面中显示nginx的版本号;
    
    内存及磁盘资源分配:
        1、client_body_in_file_only on|clean|off
            HTTP的包体是否存储在磁盘文件中;非off表示存储,即使包体大小为0也会创建一个磁盘文件;on表示请求结束后包体文件不会被删除,clean表示会被删除;
    
        2、client_body_in_single_buffer on|off;
            HTTP的包体是否存储在内存buffer当中;默认为off;
    
        3、cleint_body_buffer_size size;
            nginx接收HTTP包体的内存缓冲区大小;
    
        4、client_body_temp_path dir-path [level1 [level2 [level3]]];
            HTTP包体存放的临时目录;
            client_body_temp_path /var/tmp/client/  1 2
    
        5、client_header_buffer_size size;
            正常情况下接收用户请求的http报文header部分时分配的buffer大小;默认为1k;
    
        6、large_client_header_buffers number size; 
            存储超大Http请求首部的内存buffer大小及个数;
    
        7、connection_pool_size size;
            nginx对于每个建立成功的tcp连接都会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为256;
    
        8、request_pool_size size;
            nginx在处理每个http请求时会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为4k; 
    
    
    http核心模块的内置变量:
        $uri: 当前请求的uri,不带参数;
        $request_uri: 请求的uri,带完整参数;
        $host: http请求报文中host首部;如果请求中没有host首部,则以处理此请求的虚拟主机的主机名代替;
        $hostname: nginx服务运行在的主机的主机名;
        $remote_addr: 客户端IP
        $remote_port: 客户端Port
        $remote_user: 使用用户认证时客户端用户输入的用户名;
        $request_filename: 用户请求中的URI经过本地root或alias转换后映射的本地的文件路径;
        $request_method: 请求方法
        $server_addr: 服务器地址
        $server_name: 服务器名称
        $server_port: 服务器端口
        $server_protocol: 服务器向客户端发送响应时的协议,如http/1.1, http/1.0
        $scheme: 在请求中使用scheme, 如https://www.Mahavairocana.com/中的https;
        $http_HEADER: 匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部
        $sent_http_HEADER: 匹配响应报文中指定的HEADER,例如$http_content_type匹配响应报文中的content-type首部;
        $document_root:当前请求映射到的root配置;
    
    
            
    ngx_http_gzip_module模块配置
        
        gzip on | off;
            启用或禁用gzip压缩响应报文;
        gzip_comp_level level;
            压缩比,1-9,默认为1; 
        gzip_disable regex ...;
            regex是为用于匹配客户端响应器类型的正则表达式;
            表示对何种浏览器禁止使用压缩功能;
        gzip_min_length length;
            触发压缩功能的响应报文的最小长度;
        gzip_http_version 1.0 | 1.1;
            设定启用压缩功能时,协议的最小版本;
        gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
            定义对客户端请求的具有何种请求属性的资源启用压缩功能;如expired则表示对由于使用了expire首部而无法缓存的对象启用压缩功能;
        gzip_types mime-type ...;
            指明仅对哪些类型的资源执行压缩操作;即压缩过滤器;
        
        示例:
            gzip  on;
            gzip_http_version 1.0;
            gzip_comp_level 6;
            gzip_disable msie6;
            gzip_min_length 2;
            gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
  • 相关阅读:
    Java项目(非Web)整合lombok+slf4j1.7.x+log4j 2.x日志框架同时输出到文件和控制台
    2022年面试准备
    前端做微信支付(vue)
    手机端的宽度
    Kubernetes平台上更安全的构建容器镜像工具Kaniko
    软件开发方法论12 factors
    Mysql 优化记录
    微信端浏览器有两个相同名的cookie在shiro引发无法认证问题
    若依系统富文本编辑框内容保存到后台样式被过滤问题
    ts中的void和never类型
  • 原文地址:https://www.cnblogs.com/Mahavairocana/p/8166056.html
Copyright © 2020-2023  润新知