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/