nginx配置文件详解优化
http 核心模块相关
性能优化
worker_processes
用于指定 worker 进程数, 定义规则 不大于CPU核心数, auto表示动态获取.
worker_processes auto;
worker_cpu_affinity
worker 进程绑定指定的 cpu ,如果机器单跑 nginx 可以绑定,如果不是不建议绑定.可以使用 cpu mask,或者 auto.
# 例如 四个 worker 进程绑定在 四个 cpu上. worker_cpu_affinity 0001 0010 0100 1000; # 使用 ps 命令 动态观测 watch -n.5 'PS axo comm,pid,psr | grep nginx'
worker_rlimit_nofile
定义能够打开的文件数量上限.同时要修改 系统打开文件数上限 /etc/security/limits.conf.
默认为 65535
worker_rlimit_nofile 65535;
调试定位相关
user
定义 nginx 运行的用户和组.
user nginx nginx;
daemon
定义 nginx 是否以守护进程方式运行,默认为 on.
daemon on;
master_process
是否以 master/worker 模式运行 Nignx,默认为 on.
master_process on|off;
error_log
定义 error 日志路径 及级别.
error_log /var/log/nginx/error.log crit; # 日志级别 [ debug | info | notice | warn | error | crit ]
事件驱动相关
worker_connections
每个 worker 进程打开文件的上限.
最大并发数: worker_processes * worker_connection
worker_connections 10240;
use
指明连接请求的处理方法.
use epoll;
accept_mutex
处理新的连接处理方式,默认为 off.
on: 表示由各 worker 轮流处理新的请求.
off: 表示每个新的请求到达会通知所有 worker 进程,那个worker 进程抢到交由那个worker 进程处理请求.推荐.
accept_mutex off;
套接字相关
server
server 段 用来配置虚拟主机.
Context: http
server { listen 80; server_name www.test.com; root /data/html; }
listen
用来定义 虚拟主机的监听地址及端口等信息.
Context: server
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; 参数说明: defaulr_server: 设定为默认虚拟主机. ssl: 限制仅能够通过ssl连接提供服务. backlog=number: 后援队列长度. rcvbuf=size: 接收缓冲区的大小; sndbuf=size: 发送缓冲区的大小; 例: listen *:80;
server_name
用来定义虚拟主机名称即域名; 支持*通配符,支持~起始字符做正则表达式匹配.
Context: server
匹配机制:
1) 首先是字符串的精确匹配
2) 左侧*通配符;
3) 右侧*通配符;
4) 正则表达式;
server_name www.text.com;
server_name ~^www\d+\.baidu.com$
tcp_nodelay
只有在保持连接长连接有效,即 keepalived 模式下有效.元数据如果很小则合并多个数据打包延迟到达.提高网络性能.
Context:http
, server
, location
tcp_nodelay on;
tcp_nopush
只有使用 sendfile 时起到作用.把响应报文首部和整合文件的起始内容放到一个报文中发送,利用完整的报文发送文件,而不是分开发送,等待用户空间打包好发送数据.
Context:http
, server
, location
tcp_nopush on;
sendfile
启用 sendfile 功能.
Context:http
, server
, location
, if in location
sendfile on;
路径相关
root
设置 WEB 资源路径映射,用于指明用户请求的 uri 所对应的本地文件系统上的文档目录.
root /data/heml;
location
根据请求的 uri 来做访问设置,
在一个 server 中 location 段可配置多个.从而实现从 uri 到文件系统的路径映射,nginx 会根据用户请求的 uri 来检查定义的所有location 并找出一个最佳匹配,而后应用其他配置.
匹配规则:
符号 | 说明 |
= | 对URI 做精确匹配 |
~ | 对 URI 做正则表达式匹配,区分字符大小写. |
~* | 对 URI 做正则表达式匹配,不区分字符大小写. |
^~ | 对 URI 的做半部分左匹配检查,不区分字符大小写. |
不带符号 | 匹配起始于此URI 的所有URL. |
匹配优先级:
= ,^~,~/~* 不带符号;
alias
设置别名.定义路径别名,文档映射的另一种机制,仅能在 location 上下文中设置.
注意:
location 中使用 root 指令和 alias 指令的意义不同
1) root 给定的路径对应于 location中的 /url/左侧的/;
2) alias 给定的路径对应于 location 中的 /url/右侧的;
location ^~ /images/ { alias /data/img/ } http://192.168.1.10/images/test1.jpg 相当于访问服务器 /data/img/ 目录下面的 test.jpg 文件 ocation ^~ /images/ { root /data/img/ } http://192.168.1.10/images/test1.jpg 相当于访问服务器 /data/img/images/ 目录下面的 test.jpg 文件
index
默认资源设置.
error_page
当客户端访问出错时定义返回的页面.
error_page 404 400 /notfound.html location = /notfound.html { root /data/nginx; }
客户端请求相关
keepalive_timeout
设置保持连接的超时时长, 0 表示禁止长连接,默认为75s.
keepalive_timeout 15s;
keepalive_requests
在一个长连接上请求的资源的最大值,默认为100;
keepalive_requests 100;
keepalive_disable
对于那种浏览器禁用使用长连接.
keepalive_disable msie6;
server_names_hash_bucket_size
服务器名字的hash表大小,
server_names_hash_bucket_size 128;
types_hash_max_size
为了快速寻找到相应MIME type,Nginx使用散列表来存储MIME type与文件扩展名。types_hash_bucket_size 设置了每个散列桶占用的内存大小。
types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升。
types_hash_max_size 2048;
send_timeout
向客户端发送响应报文的超时时长,此处值,两次写操作之间的间隔时长.
send_timeout 30s;
client_body_timeout
读取 HTTP 包体的超时时间.默认为60秒.超时向客户端返回408 ("Request timed out")响应。
client_header_timeout
读取 HTTP 头部的超时时间,默认为60秒.则认为超时,超时向客户端返回408 ("Request timed out")响应。
reset_timeout_connection
重置超时连接项默认为 off 关闭,一般不会开启.连接超时后将通过向客户端发送RST包来直接重置连接。连接超时后将通过向客户端发送RST包来直接重置连接。
client_body_buffer_size
用于接收客户端请求报文 body 部分的缓冲区大小,默认为16k, 1k 大约可缓存 500 汉字.
如果超出此大小时将被暂存到磁盘上由 client_body_temp_path 指令定义的位置中.
client_body_temp_path
用于储存客户端请求发送的body 部分的临时存储路径及目录结构的数量.方便定位和路由.
client_body_buffer_size /var/tmp/client_body 1 2 2;
client_max_body_size
此指令设置NGINX能处理的最大请求主体大小。 如果请求大于指定的大小,则NGINX发回HTTP 413(Request Entity too large)错误。 如果服务器处理大文件上传,则该指令非常重要。
client_max_body_size 1m;
client_header_buffer_size
此指令与client_body_buffer_size类似。 它为请求头分配一个缓冲区。 如果请求头大小大于指定的缓冲区,则使用large_client_header_buffers指令分配更大的缓冲区。
client_header_buffer_size 1m;
large_client_header_buffers
此指令规定了用于读取大型客户端请求头的缓冲区的最大数量和大小。 这些缓冲区仅在缺省缓冲区不足时按需分配。 当处理请求或连接转换到保持活动状态时,释放缓冲区。
large_client_header_buffers 4 8k;
客户端限制相关
limit_rate
限制响应给客户端的传输速率,单位是 bytes/cecond,0表示无限制.
limit_rate 0;
limit_execpt
限制对指定的请求方法.
limit_except GET { allow 192.168.1.0/32; deny all; }
文件操作优化
aio
异步I/O允许进程进行不受阻塞或不需要等待I/O完成的I/O操作。
aio on;
directio
在linux主机启用O_dirECT标记,此处以为文件大于等于给定的大小时使用aio,例如 directio 4m;
directio 512;
output_buffers
设置从磁盘读取缓冲区响应的数量和大小。如果可能,客户端数据传输将被延迟,直到 Nginx 汇集到适合的数据大小。
output_buffers 132k;
open_file_cache
open_file_cache 相关配置可以缓存静态文件的元信息,在这些静态文件被频繁访问时可以显着提升性能。
可缓存的元数据信息:
- 文件的描述符,文件大小和最近一次的修改时间.
- 打开的目录结构.
- 没有找到或者是没有权限访问的相关数据,
open_file_cache max=64 inactive=30d; 参数说明: max: 可以缓存的缓存项上限,达到上限后会使用 LRU (最近最少使用)算法实现缓存管理. inactive: 缓存项的非活动时长, 在此处指定的时长内未被命中的次数少于 openfile_cache_min_uses 指令所指定的次数的缓存项即为非活动项.
open_file_cache_valid
缓存项有效的检查频率,间隔时间,默认为 60s;
open_file_cache_errors
是否缓存查找时发生错误的文件一类的信息.
open_file_cache_errors on;
open_file_cache_min_user
在 open_file_cache 指令的 inactive 指定的参数的时长内, 至少应该被命中多少次访问可被归类为活动项,没达到则删除.
open_file_cache_min_uses 8;
http 常用的模块
ngx_http_access_module
基于 IP 的访问控制功能.
Context: http, server, location, limit_except
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; }
ngx_http_auth_basic_module
基于用户访问控制,使用 basic 机制进行用户认证.
1. authbasic on; 2. auth_basic_user_file file; location /admin/ { alias /fata/nginx; auth_basic "Admin Area"; # 提示性信息 auth_basic_user_file /etc/nginx/.ngxpasswd; # 密码文件所在路径 } 创建密码文件: yum -y install http-tools htpasswd -c -m /etc/nginx/.ngxpasswd tom 创建访问用户
ngx_http_stub_status_module
用于输出 nginx 的基本状态信息.
输出参数说明:
参数 | 说明 |
Active connections | 活动状态的连接数. |
accepts | 已经接受的客户端请求的总数. |
handled | 已经处理完成的客户端请求的总数, |
requests | 客户端发来的请求总数. |
Reading | 处于读取客户端请求报文首部的连接数. |
Writing | 处于向客户端请求报文首部的连接数. |
Waiting | 处于等待客户端发出请求的空闲连接数. |
location /status/ { stub_status; allow 192.168.1.0/24; deny all; } 输出信息如下: Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106
ngx_http_ssl_module
ssl 模块
参数说明:
ssl on; 开启ssl功能 ssl_certificate file; 当前虚拟主机使用PEM格式的证书文件/ ssl_certificate_key file; 当前虚拟主机上与其证书匹配的私钥文件; ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 支持ssl协议版本,默认后三个 ssl_session_cache off | none | [bulitin[:size]] [shared:name:size]; bulithin[:size]: 使用Openssl内奸的缓存,此缓存为每个worker 进程私有. [shared:name:size] 在个各worker之间使用一个共享缓存, 1M 可缓存4000会话. ssl_session_timeout time; 客户端一侧的连接可以复用 ssl session cache 中缓存的ssl参数的有效时长.

1 server { 2 listen 443 ssl; 3 server_name www.test.com; 4 access_log /var/log/nginx/test_ssl.log main; 5 6 ssl on; 7 ssl_certificate /etc/nginx/ssl/nginx.crt; 8 ssl_certificate_key /etc/nginx/ssl/nginx.key; 9 ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2; 10 ssl_session_cache shared:SSL:10m; #1M 缓存 4000 会话 11 } 12 13 创建ca证书 14 cd /etc/pki/CA 15 (umask 077;openssl genrsa -out private/cakey.pem 2048) 16 openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365 17 CN 18 BeiJing 19 BeiJing 20 baidu 21 devops 22 host.baidu.com 23 touch index.txt 24 echo 01 > serial 25 # 签署 26 openssl ca -in /tmp/nginx.csr -out /etc/pki/ca/certs/nginx.crt -days 365 27 ll certs/ 28 会生成 nginx.crt 文件 29 ll newcerts 30 会生成 01.pem文件 31 scp certs/nginx.crt ip:/etc/nginx/ssl/ 32 33 34 (umask 077; openssl genrs -out nginx.key 2048) 35 openssl req -new key nginx.key -out nginx.csr 36 CN Beijing Beijing baidu devops host.baidu.com 123@123.com 37 scp nginx.csr ip/tmp/
ngx_http_log_module
nginx 访问日志模块.

1 log_format json '{"@timestamp":"$time_iso8601",' 2 '"host":"$server_addr",' 3 '"clientip":"$remote_addr",' 4 '"size":$body_bytes_sent,' 5 '"responsetime":$request_time,' 6 '"upstreamtime":"$upstream_response_time",' 7 '"upstreamhost":"$upstream_addr",' 8 '"http_host":"$host",' 9 '"url":"$uri",' 10 '"xff":"$http_x_forwarded_for"' 11 '"referer":"$http_referer",' 12 '"agent":"$http_user_agent",' 13 '"status":"$status"}'; 14 @timestamp: 服务器时间的ISO 8610格式 (1.3.12, 1.2.7) 15 host: 服务器端地址 16 clientip: 客户端地址的二进制形式, 固定长度为4个字节 17 size: 传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的“%B”参数保持兼容 18 responsetime: 处理客户端请求使用的时间 (1.3.9, 1.2.6); 从读取客户端的第一个字节开始计时。 19 upstreamtime: 是指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间。 20 upstreamhost: 保存服务器的IP地址和端口或者是UNIX域套接字的路径。 21 http_host: 优先级如下:HTTP请求行的主机名>”HOST”请求头字段>符合请求的服务器名 22 uri: 请求的uri 23 xff: 真实的客户端地址 24 referer: 当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。 25 agent: 获取客户端浏览器信息 26 status: 请求的状态吗.
配置参数:
配置阶段: log_format name string..; string 可以使用 nginx 核心模块及其他模块内嵌的变量; # 调用阶段 access_log path [format] [buffer=size] [gzip=level] [flush=time] [if=condition] access_log off; 访问日志的文件路径格式,及相关的缓冲区配置 buffer=size flush=time 缓存相关: open_log_file_cache max=N [inactive=time] [min_user=N] [valid=time] open_log_file_cache off; 对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off),格式如下: 缓存各日志文件相关的元数据信息 max: 缓存的最大文件描述符数量; min_uses: 在 inactive 指定的时长内访问大于等于此值方可被当做活动项. inactive: 非活动时长 valid: 验证缓存中个缓存想是否为活动项的时间间隔. open_log_file_cache max=1000 inactive=60s;
ngx_http_gzip_module
压缩传输,占用 CPU 时间,解决网络传输带宽.
1) gzip on; 开启压缩功能. 2) gzip_buffers 16 8k; 压缩的缓冲区大小. 3) gzip_comp_level 6; 压缩级别,默认为1; 4) gzip_disable "MSIE [1-6]\.(?!.*SV1)"; 禁止那些浏览器压缩功能. 5) gzip_min_length 128; 小于128字节不压缩 6) gzip_http_version 1.1; 只对 那些http版本进行压缩 默认 1.1 7) gzip_proxied off | expired | no-cache | no-store | private | no_last_modifled | no_etag | auth | any....; Nginx作为反向代理的时候启用,根据某些请求和应答来决定是否在对代理请求的应答启用gzip压缩,是否压缩取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数,意义如下: expired - 启用压缩,如果header头中包含 "Expires" 头信息 no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息 no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息 private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息 no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息 no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息 auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息 any - 无条件启用压缩 8) gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon; 压缩过滤器,进队此处设置的MIME类型的内容启用压缩功能, 9) gzip_vary on; 增加响应头”Vary: Accept-Encoding”
ngx_http_rewrite_module
rewrite 地址重写模块, 将用户请求的 URI 基于 regex 所描述的模式进行检查, 然后完成替换,
rewrite
1) rewrite regex replacemen [flag] 将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的心URI; 注意: 如果在同一级配置块中存在多个 rewrite 规则,那么会自下而下逐个检查, 被某条件规则替换完成后,会重新一轮的替换匹配,因此隐含有循环机制;flag所表示的标志位控制此循环机制. 如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端.301 永久重定向. [flag] last: 重写完成后停止对当前URI在当前location中后续的其他重写操作,而后对新的URI启动新一轮重新检查,提前重新一轮循环. break: 重写完成后停止对当前URI在当前location 中后续的其他重写操作,二后直接跳转至重写规则配置块之后的其他配置,结束循环. redlrect: 重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端, 由客户端重新发起请求,不能以http://或https://开头; permanent: 重写完成后以永久冲顶向方式直接返回重写后生成新的URI给客户端,由客户端重新发起请求.
例:
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... } location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; } rewrite ^/users/(.*)$ /show?user=$1? last;
return
语法: return code [text]; return code URL; return URL; Context: server, location, if 该指令一般用于对请求的客户端直接返回响应状态码。在该作用域内return后面的所有nginx配置都是无效的。 可以使用在server、location以及if配置中。 除了支持跟状态码,还可以跟字符串或者url链接。
rewrite_log
是否开启重写日志.
rewrite_log off; Context: http, server, location, if
if
引入一个新的配置上下文,满足条件时候,执行配置块中的配置指令.
语法: if (condition) { ... } Context: server, location condition: 比较操作符号 == != ~ ~* 模式匹配 区分符大小写 ~! 模式匹配 不区分字符大小写 !~* 模式不匹配 不区分字符大小写 !~ 模式不匹配 区分字符大小写 文件及目录判存在性判断; -e,!e -f,!f -d, !d -x,!x
例:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }
ngx_http_referer_module
referer 模块主要配置防盗链功能.
ngx_http_referer_module模块允许拦截“Referer”请求头中含有非法值的请求,阻止它们访问站点。 需要注意的是伪造一个有效的“Referer”请求头是相当容易的, 因此这个模块的预期目的不在于彻底地阻止这些非法请求,而是为了阻止由正常浏览器发出的大规模此类请求。 还有一点需要注意,即使正常浏览器发送的合法请求,也可能没有“Referer”请求头。
valid_referers
定义referer 首部的合法的可用值
语法: valid_referers none | blocked | server_names | string ...; Context: server, location 参数说明: none: 请求报文首部没有referer首部. blocked: 请求报文的referer首部没有值. server_name: 参数,其可以由值作为主机名或主机名模式; arbitrary_sting: 直接字符串,但可使用* 作为通配符. regular expression: 被指定的正则表达式匹配的字符串;要使用~开头.例如 ~.*\.test\.com;
例:
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { valid_referers blocked www.a.com; if ($invalid_referer) { return 403; } } valid_referers none block server_names *.test.com www.test.* *~\.test\.*; if ($valid_referers) { return http://www.test.com; }
作者:闫世成
出处:http://cnblogs.com/yanshicheng