nginx关于并发的总结

一、环境

1.nginx版本

[root@node4 ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --prefix=/usr/local/nginx

2.操作系统

centos7

3.硬件配置

[root@node2 ~]# cat /proc/cpuinfo |grep process
processor	: 0
processor	: 1
processor	: 2
processor	: 3[root@node2 ~]# free -htotal        used        free      shared  buff/cache   available
Mem:           3.8G        446M        3.0G         12M        409M        3.1G
Swap:          1.5G          0B        1.5G

二、nginx配置

nginx 地址为192.168.1.18,其他地址为客户端

1.默认配置

# nginx 启动一个work进程来处理请求
worker_processes  1;events {# 一个work进程同时并发处理1024个请求worker_connections  1024;
}

查看 worker process 进程是master process 的子进程

[root@node4 ~]# ps -lef |grep nginx |grep -v "grep"
1 S root      11250      1  0  80   0 -  5141 sigsus 01:35 ?        00:00:00 nginx: master process nginx
5 S nobody    11251  11250  0  80   0 -  5247 ep_pol 01:35 ?        00:00:00 nginx: worker process

2.worker_connections

通过修改配置来理解worker_connections配置的真正含义

2.1 修改为1

events {worker_connections  1;
}

语法测试直接报错:

[root@node4 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [emerg] 1 worker_connections are not enough for 1 listening sockets
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

2.2 修改为2

检测没有问题

[root@node4 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
2.2.1 使用telnet访问

使用telnet访问发现 服务端直接断开了。

[root@node4 ~]# netstat -antp |grep 80 -w
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11538/nginx: master 
tcp        0      0 192.168.1.18:80         192.168.1.1:64782       TIME_WAIT   - 
2.2.2 使用浏览器访问

发现浏览器无法返回网页内容,并且服务端出现了较多的TIME_WAIT.这是因为浏览器自己在不断的请求web服务器。(重试)
服务器又没有可用的连接,所以在不断的断开和重置连接,所有出现了大量的TIME_WAIT

[root@node4 ~]# netstat -antp |grep 80 -w
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11538/nginx: master 
tcp        0      0 192.168.1.18:80         192.168.1.1:64910       TIME_WAIT   -                   
tcp        0      0 192.168.1.18:80         192.168.1.1:64911       TIME_WAIT   -                   
tcp        0      0 192.168.1.18:80         192.168.1.1:64906       TIME_WAIT   -                   
tcp        0      0 192.168.1.18:80         192.168.1.1:64918       TIME_WAIT   -                   
tcp        0      0 192.168.1.18:80         192.168.1.1:64920       FIN_WAIT2   -                   
tcp        0      0 192.168.1.18:80         192.168.1.1:64908       TIME_WAIT   -                   
tcp        0      0 192.168.1.18:80         192.168.1.1:64904       TIME_WAIT   - 

nginx 错误日志中也出现大量的错误信息,如下:

2024/05/10 03:11:33 [alert] 11691#0: 2 worker_connections are not enough

2.3 修改为3

修改为3的时候,日志中不在报错。

2.3.1 使用telnet访问

这里使用两个不同的client 分别为192.168.1.16和192.168.1.20

1.先在1.16 访问nginx

[root@node4 logs]# netstat -antp |grep 80 -w 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11538/nginx: master 
tcp        0      0 192.168.1.18:80         192.168.1.16:56006      ESTABLISHED 13508/nginx: worker

2.在使用1.20 访问nginx

[root@node4 logs]# netstat -antp |grep 80 -w 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11538/nginx: master 
tcp        0      0 192.168.1.18:80         192.168.1.20:55248      ESTABLISHED 13508/nginx: worker 
tcp        0      0 192.168.1.18:80         192.168.1.16:56012      TIME_WAIT   - 

此时发现当1.20 连接上来的时候 1.16的连接被断开了。

2.3.2 使用浏览器访问

浏览器访问一次 会连接过来两次请求。

[root@node4 logs]# netstat -antp |grep 80 -w 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11538/nginx: master 
tcp        0      0 192.168.1.18:80         192.168.1.1:54287       ESTABLISHED 13508/nginx: worker 
tcp        0      0 192.168.1.18:80         192.168.1.1:54286       TIME_WAIT   - 

当修改为3的时候,说明worker进程只能接收一个请求

2.4 修改为4

这时候发现两个请求过来没有问题

[root@node4 conf]# netstat -antp |grep -w 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11538/nginx: master 
tcp        0      0 192.168.1.18:80         192.168.1.20:55294      ESTABLISHED 13908/nginx: worker 
tcp        0      0 192.168.1.18:80         192.168.1.16:56040      ESTABLISHED 13908/nginx: worker

在加一个请求,发现原来的请求就断开了

[root@node4 conf]# netstat -antp |grep -w 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11538/nginx: master 
tcp        0      0 192.168.1.18:80         192.168.1.20:55294      ESTABLISHED 13908/nginx: worker 
tcp        0      0 192.168.1.18:80         192.168.1.16:56040      TIME_WAIT   -                   
tcp        0      0 192.168.1.18:80         192.168.1.16:56042      ESTABLISHED 13908/nginx: worker 

2.5 结论

目前来看,worker_connections的连接数量是 值 - 2 是真正的连接数量

3.提高并发量500

3.1 修改为500

worker_connections  500;

3.2 批量建立请求

使用telnet批量进行请求

for i in {1..500};do telnet  192.168.1.18 80 & done

3.3 查看结果

可以看出建立了468个连接

[root@node4 ~]# ss -s
Total: 1026 (kernel 2796)
TCP:   508 (estab 471, closed 32, orphaned 0, synrecv 0, timewait 32/0), ports 0

这里手动统计发现468个连接,但是断开了32个连接。发现这个32连接都是 "FIN_WAIT2"状态的连接。
nginx的错误日志中也没有报错。

[root@node4 ~]# netstat -anpt |grep -w 80 |grep -i estab |wc -l
468
[root@node4 ~]# netstat -anpt |grep -w 80 |grep -i wait |wc -l
32

4.提高并发量1024

此时发现nginx的并发已经并占满了。但是在3中为什么有32个tw连接,暂时还不太清楚

[root@node2 conf]# ss -s
Total: 2418 (kernel 2856)
TCP:   1047 (estab 1028, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0Transport Total     IP        IPv6
*	  2856      -         -        
RAW	  1         0         1        
UDP	  10        7         3        
TCP	  1046      1038      8        
INET	  1057      1045      12       
FRAG	  0         0         0 

手动验证

[root@node2 ~]# netstat -anpt |grep -w 80 |grep -i estab |wc -l
1024

4.1 报错

此时发现日志开始报错,打开的文件太多了。

2024/05/12 16:13:55 [crit] 4736#0: accept4() failed (24: Too many open files)

为了解决当前报错,和以上nginx 接受请求要少两个连接的迷惑,这里要讲一下 “文件描述符”.见 “三 文件描述符号”

4.2 文件描述符限制

发现系统限制了单个进程打开文件描述的限制

[root@node2 ~]# ulimit -n
1024

4.3 查看进程描述符数量

[root@node2 ~]# ps aux |grep nginx
root       3403  0.0  0.0  20604  1408 ?        Ss   14:44   0:00 nginx: master process nginx
nobody     4736  0.0  0.0  23100  1760 ?        S    16:09   0:00 nginx: worker process[root@node2 ~]# cd /proc/4736/fd
[root@node2 fd]# ls |wc -l
1024

这里发现文件描述数量直接到达了文件系统的限制.

4.4 修改值

ulimit -n 10240

4.5 再次请求

发现错误日志中不在报错。

5.nginx打开文件限制

nginx 中也有参数限制了nginx打开文件的数量。

worker_processes  2;# 此参数就是控制单个进程打开系统文件的数量
worker_rlimit_nofile 100;events {worker_connections  4096;
}

有时候,系统的ulimit -n的值已经提高,但是nginx中依然报打开文件太多的错误。并发量也上不去。就是这个值太小。这个值配置文件中默认是没有的。需要手动添加

6.keepalive_requests

keepalive_requests指令用于设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭。默认是100。
是指一个keep alive建立之后,nginx就会为这个连接设置一个计数器,记录这个keep alive的长连接上已经接收并处理的客户端请求的数量。如果达到这个参数设置的最大值时,则nginx会强行关闭这个长连接,逼迫客户端不得不重新建立新的长连接。

6.1 测试配置

当用户请求3次之后,然后断开连接原链接,客户端会重新请求。

http {......keepalive_timeout  65;keepalive_requests 3;......}

6.1 请求建立连接

使用浏览器的无痕模式访问

#这是第一次建立连接
[root@node4 conf]# netstat -antp |grep 80 -w
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1784/nginx: master  
tcp        0      0 192.168.1.18:80         192.168.1.1:62952       ESTABLISHED 4122/nginx: worker  # 第二次
[root@node4 conf]# netstat -antp |grep 80 -w
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1784/nginx: master  
tcp        0      0 192.168.1.18:80         192.168.1.1:62952       ESTABLISHED 4122/nginx: worker  # 第三次断开
[root@node4 conf]# netstat -antp |grep 80 -w
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1784/nginx: master  
tcp        0      0 192.168.1.18:80         192.168.1.1:62952       TIME_WAIT   - 

三、文件描述符

1.概念

在linux系统中,“文件描述符” 是一个非负"整数".

2.作用

当进程使用open函数打开一个文件时,open函数返回的值就是 “文件描述符”。进程可以通过文件描述符对文件进行操作。
每一个进程在启动时候,都会产生3个默认的文件描述符 0,1,2.懂的都懂

3.程序验证

这里使用程序验证一下

[root@node4 ~]# cat a.py 
import time,os# 这里先打印程序的PID
print("pid = {}".format(os.getpid()))
time.sleep(20)# 打开两个文件,然后返回两个文件描述符
with open('/root/t1','a')as f1,open('/root/t2','a') as f2:print('f1 = {},f2 = {}'.format(f1.fileno(),f2.fileno()))f1.write("hello")f2.write("hello")time.sleep(10)print('--------------')
# 这里等待100是为了 验证with 函数会自动关闭文件,然后文件描述符消息
time.sleep(100)

3.1 默认文件描述符

查看进程默认的文件描述符.

[root@node4 ~]# cd /proc/13146/fd
[root@node4 fd]# ll
total 0
lrwx------. 1 root root 64 May 12 20:19 0 -> /dev/pts/0
lrwx------. 1 root root 64 May 12 20:19 1 -> /dev/pts/0
lrwx------. 1 root root 64 May 12 20:19 2 -> /dev/pts/0

3.2 生成的文件描述符

[root@node4 fd]# ll
total 0
lrwx------. 1 root root 64 May 12 20:19 0 -> /dev/pts/0
lrwx------. 1 root root 64 May 12 20:19 1 -> /dev/pts/0
lrwx------. 1 root root 64 May 12 20:19 2 -> /dev/pts/0# 这里生成了两个新的文件描述符,和程序中打印的文件描述符号一致
l-wx------. 1 root root 64 May 12 20:19 3 -> /root/t1
l-wx------. 1 root root 64 May 12 20:19 4 -> /root/t2

4.打开文件的限制

4.1 系统限制

linux系统能够打开的文件数量也是有限的,通过以下命令查看

[root@node2 ~]# cat /proc/sys/fs/file-max 
394628或者
[root@node2 ~]# sysctl -a |grep -i fs.file-max
fs.file-max = 394628

4.2 进程限制

系统对每个进程打开的文件数量也进行了限制。

[root@node2 ~]# ulimit -a |grep open
open files                      (-n) 1024或者
[root@node2 ~]# ulimit  -n
1024

5.修改ulimit值

5.1 临时修改

重启服务器后配置失效

[root@node2 ~]# ulimit -n 10240
[root@node2 ~]# ulimit -n
10240

5.2 永久修改

vim /etc/security/limits.conf#打开文件的软限制
*	soft	nofile	10240#打开文件的硬限制
*	hard	nofile	10240

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年最顶尖的AI驱动SEO工具|TodayAI

在当今数字营销的竞争环境中,获得搜索引擎的高排名至关重要,因为它直接关联到网站的有机流量和品牌的在线影响力。搜索引擎优化(SEO)是提高网站排名的关键方式,通过优化网站内容和结构来符合搜索引擎的算法要求。然而&…

win server服务器 关闭危险端口 135,137,138,139,445的方法

通过防火墙来控制 打开控制面板 选择检查防火墙状态 选择高级设置 选择入站规则,再新建规则 选择端口,下一步 选择端口应用于啥协议,再指定端口,再下一步 选择阻止连接,下一步 下一步 给规则别名一下,方便…

5.12学习总结

一.JAVA聊天室项目 文件发送 使用 Java Socket 实现聊天内容或文件的传输的原理如下: 服务器端启动:聊天室的服务器端在指定的端口上监听客户端的连接。它创建一个 ServerSocket 对象,并通过调用 accept() 方法等待客户端的连接请求。客户…

快速入门:利用Go语言下载Amazon商品信息的步骤详解

概述 在这篇文章中,我们将深入探讨如何利用Go语言这一强大的工具,结合代理IP技术和多线程技术,实现高效下载Amazon的商品信息。首先,让我们来看看为什么选择Go语言作为开发网络爬虫的首选语言。 Go语言在网络开发中的特点 简洁…

grep 整理

grep 整理 1. 正则表达式和通配符2. grep2.1 基本用法2.2 进阶使用2.3 配合正则表达式使用2.4 grep增强版 1. 正则表达式和通配符 首先,我们回顾下正则表达式和通配符相关内容,这有助于接下来的grep学习: 基础正则表达式 RE 字符意义与范例…

项目经理根本不需要考PMP证书,浪费?

我首先会考虑你是否有这方面的需求,这是肯定的。如果你只是为了跟风而考证,因为别人都在考,所以你也跟着考,这样做是毫无意义的。 那么如何判断自己是否有这方面的需求呢? 1、工作 在工作中要考虑三个条件&#xff…

内裤什么牌子的质量好男士?2024男士内裤排行榜出炉

换新内裤这件事情对很难男生来说都挺难的,因为现在的男士内裤品牌比较多,而且还有各种不同材质的区分。尤其是大多数男士对自己穿的内裤都不是特别在意,实际上如果长期不更换内裤,会使内裤的舒适性、透气性降低,而且还…

附录2 创建flask镜像

目录 1 python镜像 2 安装flask 3 把项目文件扔进去 3.1 创建git仓库 3.2 上传文件 3.3 获取git链接 3.4 在容器中git clone 4 启动flask服务 5 将容器保存为镜像 6 映射端口运行镜像 7 遇到的问题 8 Dockerfile创建镜像 1 python镜像 首先找一下fla…

【全开源】keep健身小程序基于FastAdmin+ThinkPHP+UniApp

基于FastAdminUniApp(目前仅支持微信小程序)开发的健身相关行业小程序,程序适用于健身房、瑜伽馆、游泳馆、篮球馆等健身培训场所。平台拥有课程售卖、课程预约、多门店管理、私教预约、教练端、会员卡办理、在线商城、分销模块、页面自定义装…

Charles客户端下载

1.Charles客户端下载: 官网地址:Download a Free Trial of Charles • Charles Web Debugging Proxy 2.下载安装完成后激活 激活网站地址:https://www.zzzmode.com/mytools/charles/ 3.help,选择第一个,激活

Docker基础复习

文章目录 基础Docker基础命令镜像操作命令容器操作命令 案例:安装MySql案例:查看DockerHub,拉取Nginx镜像,并运行容器Docker命令起别名 基础 Docker基础命令 启动Docker systemctl start docker镜像操作命令 从远程仓具下载镜像到本地 docker pull 镜像…

Linux开发--Linux字符设备驱动设计

Linux字符设备驱动设计 概述 驱动的定义与功能 计算机系统中存在着大量的设备, 操作系统要求能够控制和管理这些硬件, 而驱动就是帮助操作系统完成这个任务。 驱动相当于硬件的接口, 它直接操作、 控制着我们的硬件, 操作系统通…

五款商用加密软件推荐 | 商用加密软件排行榜

没有网络安全就没有国家安全。信息安全是国家经济社会稳定运行,广大人民群众利益的保障。 对于公司来讲,数据安全同样是企业可持续发展的重要保障,防止内部核心数据、知识产权的泄露是企业数据安全的重要工作。下面是五款企业常用的加密软件…

网络安全学习路线+自学笔记(超详细) 自学网络安全看这一篇就够了

一、什么是网络安全 网络安全是一种综合性的概念,涵盖了保护计算机系统、网络基础设施和数据免受未经授权的访问、攻击、损害或盗窃的一系列措施和技术。经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.1,2,3-GPIO中断控制实验

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

C--贪吃蛇

前言 贪吃蛇游戏是一个耳熟能详的小游戏,本次我们讲解他的简单的实现,需要掌握基本的API知识(http://t.csdnimg.cn/uHH6y),简单的C语言知识和基本的数据结构链表 简单的准备工作 蛇的节点 在游戏运⾏的过程中,蛇每次吃⼀个⻝物,蛇的⾝体就会变⻓⼀节&a…

力扣HOT100 - 45. 跳跃游戏 II

解题思路&#xff1a; 贪心 class Solution {public int jump(int[] nums) {int end 0;int maxPosition 0;int steps 0;for (int i 0; i < nums.length - 1; i) {maxPosition Math.max(maxPosition, i nums[i]);if (i end) {end maxPosition;steps;}}return steps;…

华为配置带反射器的iNOF功能实验

配置带反射器的iNOF功能示例 适用产品和版本 安装了SAN系列单板的CE16800系列交换机V300R020C10或更高版本。 安装了P系列单板的CE16800系列交换机V300R021C00或更高版本。 CE6866、CE6866K、CE8851-32CQ8DQ-P、CE8851K系列交换机V300R020C00或更高版本。 CE6860-SAN、CE8850-S…

2024OD机试卷-求满足条件的最长子串的长度 (java\python\c++)

题目:求满足条件的最长子串的长度 题目描述 给定一个 字符串 ,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求: 1、 只包含1个字母(a~z, A~Z),其余必须是数字; 2、 字母可以在子串中的任意位置; 如果找不到满足要…

9. 学习distribute by rand()

文章目录 1、rand()和rand(int seed)2、distribute by3、distribute by rand和生成文件数的关系set hive.exec.reducers.max 对比 set mapred.reduce.tasks 4、distribute by rand的风险5、hive 中什么场景下会使用 distirbute by rand() 呢&#xff1f;学习链接 1、rand()和ra…