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

╰+哭是因爲堅強的太久メ 2022-09-11 00:10 338阅读 0赞

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

单域名

  1. server {
  2. listen 80;
  3. listen 443 ssl;
  4. ssl_certificate /apps/nginx/certs/www.sunmy.pro.pem;
  5. ssl_certificate_key /apps/nginx/certs/www.sunmy.pro.key;
  6. ssl_session_cache shared:sslcache:20m;
  7. ssl_session_timeout 10m;
  8. root /data/nginx/html;
  9. }

自动跳转

  1. server {
  2. listen 80 default_server;
  3. server_name blog.sunmy.pro;
  4. rewrite ^(.*)$ https://$server_name$1 permanent;
  5. }
  6. server {
  7. listen 443 ssl;
  8. server_name blog.sunmy.pro;
  9. ssl_certificate /apps/nginx/certs/blog.sunmy.pro.pem;
  10. ssl_certificate_key /apps/nginx/certs/blog.sunmy.pro.key;
  11. ssl_session_cache shared:sslcache:20m;
  12. ssl_session_timeout 10m;
  13. location / {
  14. root "/data/nginx/html/mobile";
  15. }
  16. location /mobile_status {
  17. stub_status;
  18. }
  19. }
  20. server {
  21. listen 80;
  22. listen 443 ssl;
  23. ssl_certificate /apps/nginx/conf/conf.d/www.sunmy.pro.crt;
  24. ssl_certificate_key /apps/nginx/conf/conf.d/www.sunmy.pro.key;
  25. ssl_session_cache shared:sslcache:20m;
  26. ssl_session_timeout 10m;
  27. server_name www.sunmy.pro;
  28. error_log /apps/nginx/logs/sunmy.pro_error.log notice;
  29. access_log /apps/nginx/logs/sunmy.pro_access.log main;
  30. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"
  31. always;
  32. location / {
  33. root /data/nginx/html/pc;
  34. if ( $scheme = http ) {
  35. rewrite ^/(.*)$ https://www.sunmy.pro/$1 redirect;
  36. }
  37. }

设置开启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 {

    1. stub_status;
    2. auth_basic "auth login";
    3. auth_basic_user_file /apps/nginx/conf/.htpasswd;
    4. allow 192.168.0.0/16;
    5. allow 127.0.0.1;
    6. 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 {

    1. index index.html;
    2. valid_referers none blocked server_names *.sunmy.pro
    3. ~\.google\. ~\.baidu\. ~\.bing\. ~\.so\. ~\.dogedoge\. ; #定义有效的referer
    4. if ($invalid_referer) { #假如是使用其他的无效的referer访问
    5. return 403 "Forbidden Access"; #返回状态码403
    6. }

    ……
    }

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

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

配置404页面自动跳转到主页

  1. #404转为302
  2. #error_page 404 /index.html;
  3. error_page 404 =302 /index.html;
  4. error_page 500 502 503 504 /50x.html;
  5. location = /50x.html {
  6. }
  7. ##或者自动检测不存在的页面跳转到指定页面
  8. location / {
  9. root /data/nginx/html/pc;
  10. index index.html;
  11. #try_files $uri $uri.html $uri/index.html /about/default.html;
  12. try_files $uri $uri/index.html $uri.html =489;
  13. }

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

  1. client_max_body_size 100m; ##设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值报413错误
  2. client_body_buffer_size 1024k;用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;
  3. client_body_temp_path /apps/nginx/client_body_temp/ 1 2 2; #上传时临时存储路径及子目录结构和数量,Nginx会自动创建相关目录

设置下载限速

  • 避免大量下载占满带宽

    location / {

    1. limit_rate_after 500k;
    2. limit_rate 50k;

    }

设置开启文件缓存

  1. open_file_cache on; #是否缓存打开过的文件信息
  2. open_file_cache max=10000 inactive=60s; #最大缓存10000个文件,非活动数据超时时长60s
  3. open_file_cache_valid 60s; #每间隔60s检查一下缓存数据有效性
  4. open_file_cache_min_uses 5; #60秒内至少被命中访问5次才被标记为活动数据
  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 协议

  1. 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

发表评论

表情:
评论列表 (有 0 条评论,338人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Nginx优化

    针对CPU的配置优化 worker\_processes指令 worker\_processes指令用来设置Nginx服务的进程数。为了让多核CPU能够很好地并行处