Nginx常见优化项和优化参数设置详解

语言: CN / TW / HK

优化Ngxin提高安全性实现高并发
通过对Nginx的优化设置,使Nginx提高安全性的同时支持更多并发请求
过通对Nginx所在宿主机Linux内核参数进行调整,使其更符合用于支持高并发访问的Web服务器
Nginx配置优化
编辑nginx.conf配置文件
设置nginx多进程
通过设置nginx工作进程数量,可以实现更⾼的并发量
worker_processes 8; #启动工作进程数数量,建议设置成cpu逻辑核数相同值
设置nginx单个工作进程最大并发连接数
worker_connections 65536; #设置单个nginx工作进程可以接受的最大并发,默认1024,更改为10240或更高

设置nginxCPU亲缘性绑定(1.9版本以后才可以设为auto)
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ; #将Nginx工作进程绑定到指定的CPU核心

设置nginx进程打开文件数上限
实际的并发连接数不能超过系统级别的最大打开文件数的限制.与ulimit -n 或者limits.conf的值保持一致
worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限,
开启零拷贝
sendfile on; #作为web服务器的时候打开sendfile加快静态文件传输,俗称零拷贝,内核空间交换文件

设置长连接超时时长
keepalive_timeout 300; #长连接超时时间,单位是秒,超时时间设得长一些
keepalive_requests number; #在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500

设置开启使用epoll模型
use epoll; #使用epoll事件驱动

设置开启防惊群
accept_mutex on; #on为同一时刻一个请求轮流由work进程处理

设置开启同进程接受多连接
multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接

设置启用Gzip压缩,加快文件传输
gzip on; #开启文件压缩,来自默认模块ngx_http_gzip_module
gzip_static on ;#开启预压缩,来自于ngx_http_gzip_static_module模块

设置虚拟主机时修改默认字符集为utf-8
charset koi8-r; #设置编码格式,默认是俄语格式,建议改为utf-8

开启ssl功能支持https,配置rewrite实现http跳转到https
nginx 的https 功能基于模块ngx_http_ssl_module
单域名
server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /apps/nginx/certs/www.sunmy.pro.pem;
    ssl_certificate_key /apps/nginx/certs/www.sunmy.pro.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    root /data/nginx/html;
}
1
2
3
4
5
6
7
8
9
自动跳转
server {
    listen 80 default_server;
    server_name blog.sunmy.pro;
    rewrite ^(.*)$ https://$server_name$1 permanent;
}
server {
    listen 443 ssl;
    server_name blog.sunmy.pro;
    ssl_certificate /apps/nginx/certs/blog.sunmy.pro.pem;
    ssl_certificate_key /apps/nginx/certs/blog.sunmy.pro.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    location / {
        root "/data/nginx/html/mobile";
    }
    location /mobile_status {
        stub_status;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /apps/nginx/conf/conf.d/www.sunmy.pro.crt;
    ssl_certificate_key /apps/nginx/conf/conf.d/www.sunmy.pro.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    server_name www.sunmy.pro;
    error_log /apps/nginx/logs/sunmy.pro_error.log notice;
    access_log /apps/nginx/logs/sunmy.pro_access.log main;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"
    always;
    location / {
        root /data/nginx/html/pc;
    if ( $scheme = http ) {
    rewrite ^/(.*)$ https://www.sunmy.pro/$1 redirect;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
设置开启IP透传
配置文件中添加客户端IP和反向代理服务器IP到请求报文头部,实现反向代理客户端 IP 透传
#proxy_set_header X-Real-IP $remote_addr; #只添加客户端IP到请求报文头部,转发至后端服务器
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部
1
2
开启并隐藏状态页
基于nginx 模块 ngx_http_stub_status_module 实现
location /nginx_status {
    stub_status;
    auth_basic "auth login";
    auth_basic_user_file /apps/nginx/conf/.htpasswd;
    allow 192.168.0.0/16;
    allow 127.0.0.1;
    deny all;
}
1
2
3
4
5
6
7
8
后期可以通过编写脚本实现zabbix自定义监控项
curl http://sun:[email protected]/nginx_status 2>/dev/null |awk '/Reading/{print $2,$4,$6}'
3 27 185
1
2
隐藏nginx版本号
server_tokens off; #是否在响应报文的Server首部显示nginx版本

开启防盗链
nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效实现防盗链功能
server {
    index index.html;
    valid_referers none blocked server_names *.sunmy.pro
    ~\.google\. ~\.baidu\. ~\.bing\. ~\.so\. ~\.dogedoge\. ; #定义有效的referer
    if ($invalid_referer) { #假如是使用其他的无效的referer访问
        return 403 "Forbidden Access"; #返回状态码403
    }
......
}
1
2
3
4
5
6
7
8
9
配置location,根据请求文件后缀判断,实现动静分离
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {
root /data/nginx/static;
index index.html;
}
1
2
3
4
配置404页面自动跳转到主页
#404转为302
#error_page 404 /index.html;
error_page 404 =302 /index.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
##或者自动检测不存在的页面跳转到指定页面
location / {
    root /data/nginx/html/pc;
    index index.html;
    #try_files $uri $uri.html $uri/index.html /about/default.html;
    try_files $uri $uri/index.html $uri.html =489;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
设置放宽用户上传文件限制
client_max_body_size 100m; ##设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值报413错误
client_body_buffer_size 1024k;用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;
client_body_temp_path /apps/nginx/client_body_temp/ 1 2 2; #上传时临时存储路径及子目录结构和数量,Nginx会自动创建相关目录
1
2
3
设置下载限速
避免大量下载占满带宽
location / {
    limit_rate_after 500k;
    limit_rate 50k;
}
1
2
3
4
设置开启文件缓存
open_file_cache on; #是否缓存打开过的文件信息
open_file_cache max=10000 inactive=60s; #最大缓存10000个文件,非活动数据超时时长60s
open_file_cache_valid 60s; #每间隔60s检查一下缓存数据有效性
open_file_cache_min_uses 5; #60秒内至少被命中访问5次才被标记为活动数据
open_file_cache_errors on; #缓存错误信息
1
2
3
4
5
优化日志
禁用页面资源请求的日志记录
location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
access_log off;#做动静分离时禁用访问成功日志
}
1
2
3
将nginx日志转换为json日志,然后配合使用ELK做日志收集,统计和分析
  #注意:此指令只支持http块,不支持server块
  log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,' #总的处理时间
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",' #后端应用服务器处理时间
'"http_host":"$host",'
'"uri":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
access_log /apps/nginx/logs/access_json.log access_json;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Nginx1.9.5 及更高版启用 HTTP2 协议
listen 443 ssl http2;
1
Nginx宿主机内核优化
主要是对Nginx所在宿主机进程打开文件数量和tcp连接关参数进行优化
fs.file-max = 1000000
#表示单个进程较大可以打开的句柄数
net.ipv4.tcp_tw_reuse = 1
#参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重大,因为总有大量TIME_WAIT状态的链接存在
net.ipv4.tcp_keepalive_time = 600
#当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无效链接
net.ipv4.tcp_fin_timeout = 30
#当服务器主动关闭链接时,socket保持在FIN_WAIT_2状态的较大时间
net.ipv4.tcp_max_tw_buckets = 5000
#表示操作系统允许TIME_WAIT套接字数量的较大值,如超过此值,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为8000,过多的TIME_WAIT套接字会使Web服务器变慢
net.ipv4.ip_local_port_range = 1024 65000
#定义UDP和TCP链接的本地端口的取值范围
net.ipv4.tcp_rmem = 10240 87380 12582912
#定义了TCP接受缓存的最小值、默认值、较大值
net.ipv4.tcp_wmem = 10240 87380 12582912
#定义TCP发送缓存的最小值、默认值、较大值
net.core.netdev_max_backlog = 8096
#当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的较大值
net.core.rmem_default = 6291456
#表示内核套接字接受缓存区默认大小
net.core.wmem_default = 6291456
#表示内核套接字发送缓存区默认大小
net.core.rmem_max = 12582912
#表示内核套接字接受缓存区较大大小
net.core.wmem_max = 12582912
#表示内核套接字发送缓存区较大大小
注意:以上的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑
net.ipv4.tcp_syncookies = 1
#与性能无关。用于解决TCP的SYN攻击
net.ipv4.tcp_max_syn_backlog = 8192
#这个参数表示TCP三次握手建立阶段接受SYN请求列队的较大长度,默认1024,将其设置的大一些可使出现Nginx繁忙来不及accept新连接时,Linux不至于丢失客户端发起的链接请求
net.ipv4.tcp_tw_recycle = 1
#这个参数用于设置启用timewait快速回收
net.core.somaxconn=262114
#选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。
net.ipv4.tcp_max_orphans=262114
#选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
PAM 资源限制优化
设置宿主机接受高并发连接数nproc,对应nginx的worker_rlimit_nofile值
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
————————————————
版权声明:本文为CSDN博主「白-胖-子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/timonium/article/details/120213252