如来神掌第一式第十二招----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;

 

 

 

 

posted on 2018-01-02 22:44  Mahavairocana  阅读(728)  评论(0编辑  收藏  举报

导航