• Nginx配置参数详解一篇到底


    前言


    一、Nginx高并发

    Linux下高并发socket最大连接数所受的各种限制
    
    1.修改用户进程可打开文件数限制
      /etc/security/limits.conf
      nginx - nofile 65535
    2.Linux系统级的最大打开文件数限制
      fs.file-max = 188414		//和内存容量相关
    3.修改网络内核对TCP连接的有关限制
      net.ipv4.ip_local_port_range = 1024	
    4.限制接收新 TCP 连接侦听队列的大小
      net.core.somaxconn = 2048
    5.启用tcp连接timewait快速回收和重用
      net.ipv4.tcp_tw_recycle = 1
      net.ipv4.tcp_tw_reuse = 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.cpu核心数的优化

    vim nginx.conf
      3 worker_processes  auto;						#设定cpu核心自动分配
      3 worker_processes  2;						#设定只是用2个核心
      4 worker_cpu_affinity 01 10;					#进行cpu核心的绑定
    
    • 1
    • 2
    • 3
    • 4

    2.最大连接数的优化

    vim nginx.conf
    events {
     14     worker_connections  65535;				#设定nginx的最大连接数
     15 }
    vim /etc/security/limits.conf
    60 nginx   -       nofile  65535				#添加后即可生效使用热插拔模块在内存中立刻生效
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    切换到nginx用户查看最大打开文件数即可看到为65535
    在这里插入图片描述

    3.网络阻塞

    vim /usr/local/nginx.com
     28     sendfile        on;				#开启sendfile可以开启高效文件传输模式(zero copy 方式),避免内核缓冲区数据和用户缓冲区数据之间的拷贝。
     29     tcp_nopush     on;				#采用tcp_cork标准进行传输即客户的访问数据在Nginx的缓冲区域到达一定量的时候会进行发送有助于解决网络阻塞
     30     tcp_nodelay     on;				#此参数和tcp_nopush互斥可以开启nginx会自行兼容本身参数,表示将所有的数据有了不论是否填满缓冲区域立刻发送
     tcp_nopush,tcp_nodelay,开启前提必须开启sendfile
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三个指令都开启的好处是,sendfile可以开启高效的文件传输模式,tcp_nopush开启可以确保在发送到客户端之前数据包已经充分“填满”, 这大大减少了网络开销,并加快了文件发送的速度。 然后,当它到达最后一个可能因为没有“填满”而暂停的数据包时,Nginx会忽略tcp_nopush参数, 然后,tcp_nodelay强制套接字发送数据。所以三个都开启比开启单个效率更高

    4.erro日志存放位置设定

     7 error_log  logs/error.log info;	#设定日至的存放为位置以及日志级别日志输出级别有 debug,info,notice,warn,error,crit 可供选择,其中debug输出日志最为详细crit(严重)输出日志最少。默认是error
    
    • 1

    该日志的采集格式暂时不支持自定义方式采集,但是可以分开存储方式集进行存储不同级别的日志
    在这里插入图片描述

    脚本示例

    #!/bin/bash
    cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
    kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    写好后加入creoutab定时任务中定时执行一次即可,日志文件所在的目录不需要给nginx用户权限
    chmo -R 700 /usr/local/nginx/logs 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.访问日志的控制方式

     location ~ .*\.(js|jpg|jpeg|png|css|bmp|gif)$ {
                    access_log off;
            }
    
    • 1
    • 2
    • 3
    参数作用
    main指定日志的采集格式
    gzip指定使用gzip的方式进行日志的压缩,压缩比率分为1-9默认为1压缩越高速度越慢
    buffer=32k指定日志写入时缓存数据为32K默认为64K
    flush设置缓存的有效时间。如果超过 flush 指定的时间,缓存中的内容将被清空
    ifif 条件判断。如果指定的条件计算为 0 或空字符串,那么该请求不会写入日志。

    6.日志的采集格式设定

    日志采集格式的设定方式

    $remote_addr       客户端地址
    $remote_user       客户端用户名称 
    $time_local        访问时间和时区
    $request           请求的URI和HTTP协议
    $status            HTTP请求状态
    $body_bytes_sent   发送给客户端文件内容大小
    $http_referer      url跳转来源
    $http_user_agent   用户终端浏览器等信息
    $http_host         请求地址,即浏览器中你输入的地址(IP或域名)
    $request_time      处理请求的总时间,包含了用户数据接收时间
    $upstream_response_time 建立连接和从上游服务器接收响应主体的最后一个字节之间的时间
    $upstream_connect_time  花费在与上游服务器建立连接上的时间
    $upstream_header_time   建立连接和从上游服务器接收响应头的第一个字节之间的时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    二、平滑升级Nginx以及版本回退

    1.平滑升级

    重新制作一个新Nginx二进制程序

     \cp -f objs/nginx /usr/local/nginx/sbin/ngin		#复制nginx二进制文件到sbin目录下同时保证系统不会读取这一步复制过去的文件所以要加\进行转译
     ps ax | grep nginx									#获取主程pid
     kill -USR2 27867									#使得原来的主程序不再获得新的请求
     kill -WINCH 27867									#使新版本的主程序开始接受请求
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2.版本回退

    \cp -f objs/nginx /usr/local/nginx/sbin/nginx		#将新版本的程序覆盖过去
    kill -HUP 28120										#唤醒原有进程
    kill -WINCH 28149									#停止新的进程
    kill -9	28121										#新版本的worker已经没用了可以禁掉了
    
    • 1
    • 2
    • 3
    • 4

    三、Nginx配置详解

    1.Nginx对于访问流量的限制

    https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http/
    官方文档位置
    
    • 1
    • 2
    http {
    upstream westos{
            sticky;
            server 172.25.254.92:80;
            server 172.25.254.93:80;
    }
    limit_conn_zone $binary_remote_addr zone=addr:10m;			#在内存中开一个10M大小的区域使得访问数据可以被记录同时
    server{
            listen 80;
            server_name www.westos.com;
                    location / {
                            limit_conn addr 10;					#限制最大的并发连接数为10
                            limit_rate 50k;						#限制下载的带宽速度为50k
                            proxy_pass http://westos;
                    }
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    上传一张图片可以尝试进行压力测试可以看到的效果更加直观,测试后并发量为10时可以完成1000的并发数10次的访问量,限制带宽后明显很慢

    2.对于当个IP的高频次访问控制

    http {
            upstream westos {
            server 172.25.0.93:80 ;
            server 172.25.0.94:80 ;
            }
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log logs/access.log main;
        #limit_conn_zone $binary_remote_addr zone=addr:200m;
        sendfile        on;
        tcp_nopush     on;
        tcp_nodelay on;
        limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;		#限制了同一个IP对与该服务器每一秒只能访问一次
        #keepalive_timeout  0;
        keepalive_timeout  10;
        gzip  on;
        server {
            listen       80;
            server_name  localhost;
    
            charset utf-8;
    
            access_log logs/access.server.log. main;
    
    
            location / {
              proxy_pass http://westos ;
              limit_req zone=one;										#开启访问频次限制他功能在RS上
              #limit_conn addr 1;										#以经限制访问频次最大连接数不必限制
              #limit_rate 50k;											#访问带宽不必限制 
            }
    
    • 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

    3.nginx的访问控制

    location ~ /\.ht {
                deny  all;					#拒绝所有人访问
                allow 127.0.0.1 ;			#允许本地回环环访问
                allow 172.25.0.90 ;			#只允许某个IP访问固
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.监控模块的设开启以及设定

    location /status {
     				stub_status on;		#开启监控模块
                    deny all ;
                    allow 127.0.0.1 ;
                    access_log off;		#禁止访问监控模块时还进行日志的统计
                    error_log off;		#禁止错误日志的统计
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.nginx对https搭建方式、重定向功能以及php网页缓存的构建方式

    server {
            listen       443 ssl;
            server_name  localhost;
    
            ssl_certificate      cert.pem;
            ssl_certificate_key  cert.pem;
    
            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;
    
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers  on;
    
            location /westos.org/ {			#代理westos.org/后边的内容但是不会代理indx.php,直接代理index.php是有危险的
                    proxy_pass http://www.westos.org/index.php;
            }
    		
    		location ~ .*\.(gif|jpg|png)$ {	#将网站的数据缓存到站点上节省网站服务端的带宽
        		expires 365d;
        		root /www;
    		}
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    总结

  • 相关阅读:
    架构与思维:微服务架构的思想本质
    中国人民大学加拿大女王金融硕士项目——只有不断提升自己,才能立于不败之地
    【Spark NLP】第 13 章:构建知识库
    牛顿法,高斯牛顿法,列文伯格-马夸尔特(LM)法
    phpstrom 快速注释:
    界面控件DevExpress WPF地图组件,助力轻松搭建自己的地图数据服务器!
    ios 三方库的使用之 MJExtension
    基于粒子群优化算法在配电系统中优化电容器的配置以降低损耗(Matlab代码实现)
    mysql启动报错The server quit without updating PID file几种解决办法
    win11开机动画关闭教程
  • 原文地址:https://blog.csdn.net/b_______/article/details/122928197