###############################################################################
#
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;