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

Posted 白-胖-子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx常见优化项和优化参数设置详解相关的知识,希望对你有一定的参考价值。

优化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;
}

自动跳转

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

设置开启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到请求报文头部

开启并隐藏状态页

  • 基于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;
}
  • 后期可以通过编写脚本实现zabbix自定义监控项
curl http://sun:123456@www.sunmy.pro/nginx_status 2>/dev/null |awk '/Reading/{print $2,$4,$6}'
3 27 185

隐藏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
    }
......
}

配置location,根据请求文件后缀判断,实现动静分离

location ~* \\.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {
root /data/nginx/static;
index index.html;
}

配置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;
}

设置放宽用户上传文件限制

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会自动创建相关目录

设置下载限速

  • 避免大量下载占满带宽
location / {
    limit_rate_after 500k;
    limit_rate 50k;
}

设置开启文件缓存

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; #缓存错误信息

优化日志

  • 禁用页面资源请求的日志记录
location ~* \\.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
access_log off;#做动静分离时禁用访问成功日志
}
  • 将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;

Nginx1.9.5 及更高版启用 HTTP2 协议

listen 443 ssl http2;

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攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值

PAM 资源限制优化

  • 设置宿主机接受高并发连接数nproc,对应nginx的worker_rlimit_nofile值
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

以上是关于Nginx常见优化项和优化参数设置详解的主要内容,如果未能解决你的问题,请参考以下文章

Nginx配置文件优化详解

Nginx优化

优化linux的内核来提高nginx并发

Nginx优化---连接超时与进程管理

nginx之旅(第六篇):nginx优化--nginx优化目的工作进程优化长连接设置数据压缩客户端缓存

Nginx优化