Nginx高并发优化+日志管理+配置参数详解

2022年9月10日13:17:22

前言


一、Nginx高并发

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

1.cpu核心数的优化

vim nginx.conf3 worker_processes  auto;#设定cpu核心自动分配3 worker_processes2;#设定只是用2个核心4 worker_cpu_affinity 0110;#进行cpu核心的绑定

2.最大连接数的优化

vim nginx.conf
events{14     worker_connections65535;#设定nginx的最大连接数15}vim /etc/security/limits.conf60 nginx   -       nofile65535#添加后即可生效使用热插拔模块在内存中立刻生效

切换到nginx用户查看最大打开文件数即可看到为65535
Nginx高并发优化+日志管理+配置参数详解

3.网络阻塞

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

三个指令都开启的好处是,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

该日志的采集格式暂时不支持自定义方式采集,但是可以分开存储方式集进行存储不同级别的日志
Nginx高并发优化+日志管理+配置参数详解

脚本示例

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

5.访问日志的控制方式

 location ~ .*\.(js|jpg|jpeg|png|css|bmp|gif)${
                access_log off;}
参数 作用
main 指定日志的采集格式
gzip 指定使用gzip的方式进行日志的压缩,压缩比率分为1-9默认为1压缩越高速度越慢
buffer=32k 指定日志写入时缓存数据为32K默认为64K
flush 设置缓存的有效时间。如果超过 flush 指定的时间,缓存中的内容将被清空
if if 条件判断。如果指定的条件计算为 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   建立连接和从上游服务器接收响应头的第一个字节之间的时间

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

1.平滑升级

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

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

Nginx高并发优化+日志管理+配置参数详解

2.版本回退

\cp -f objs/nginx /usr/local/nginx/sbin/nginx#将新版本的程序覆盖过去kill -HUP28120#唤醒原有进程kill -WINCH28149#停止新的进程kill -928121#新版本的worker已经没用了可以禁掉了

三、Nginx配置详解

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

https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http/
官方文档位置
http{
upstream westos{
        sticky;
        server172.25.254.92:80;
        server172.25.254.93:80;}
limit_conn_zone$binary_remote_addrzone=addr:10m;#在内存中开一个10M大小的区域使得访问数据可以被记录同时
server{
        listen80;
        server_name www.westos.com;
                location /{
                        limit_conn addr10;#限制最大的并发连接数为10
                        limit_rate 50k;#限制下载的带宽速度为50k
                        proxy_pass http://westos;}}}

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

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

http{
        upstream westos{
        server172.25.0.93:80;
        server172.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_addrzone=one:10mrate=1r/s;#限制了同一个IP对与该服务器每一秒只能访问一次#keepalive_timeout  0;
    keepalive_timeout10;gzip  on;
    server{
        listen80;
        server_name  localhost;

        charset utf-8;

        access_log logs/access.server.log. main;


        location /{
          proxy_pass http://westos;
          limit_reqzone=one;#开启访问频次限制他功能在RS上#limit_conn addr 1;										#以经限制访问频次最大连接数不必限制#limit_rate 50k;											#访问带宽不必限制}

3.nginx的访问控制

location ~ /\.ht{
            deny  all;#拒绝所有人访问
            allow127.0.0.1;#允许本地回环环访问
            allow172.25.0.90;#只允许某个IP访问固}}

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

location /status{
 				stub_status on;#开启监控模块
                deny all;
                allow127.0.0.1;
                access_log off;#禁止访问监控模块时还进行日志的统计
                error_log off;#禁止错误日志的统计}

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

server{
        listen443 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;}}


总结

  • 作者:秃顶_的技术博客
  • 原文链接:https://blog.csdn.net/b_______/article/details/122928197
    更新时间:2022年9月10日13:17:22 ,共 4545 字。