时间:2025-03-02 09:39
人气:
作者:admin
@
目录master-worker 工作原理图:
一个 master 管理多个 worker

[root@localhost ~]# cd /usr/local/nginx/
[root@localhost nginx]# ls
auto CHANGES.ru conf contrib html logs man proxy_temp sbin src
CHANGES client_body_temp configure fastcgi_temp LICENSE Makefile objs README scgi_temp uwsgi_temp
[root@localhost nginx]# ./sbin/nginx
[root@localhost nginx]# ps -aux | grep nginx
root 2610 0.0 0.0 20572 664 ? Ss 16:55 0:00 nginx: master process ./sbin/nginx
nobody 2611 0.0 0.0 23040 1416 ? S 16:55 0:00 nginx: worker process
root 2613 0.0 0.0 112812 976 pts/0 S+ 16:55 0:00 grep --color=auto nginx
[root@localhost nginx]#

争抢机制示意图:

上述示意图图解:
Client 客户端发送请求给了 Nginx 的 Master
Master 将请求信息,发送给所有的 worker,告知这些 worker ,有请求信息来了,大家快争抢,及时反馈
Master 下发请求了,所有的 worker 开始争抢,虽然所有的 worker 都会争抢但是,只有一个 worker 才可以争抢成功。
当其中一个 worker 争抢成功了,则就会通过 Nginx 反向代理,将请求转发给上游的Tomcat 服务器/其他微服务处理该请求。
Master-Worker 模式:

上述图解:Master-Worker 模式讲解说明:
accept_mutex ,这是一个加在 accept 上的一把共享锁。即每一个 worker 进程在执行 accept 之前都需要先获取锁,获取不到就放弃执行 accept()。有了这把锁之后,同一时刻,就只会有一个进程去 accept() ,就不会有惊群问题了。简单的说就是:加锁,当获取到锁的进程才会被激活启用,其他没获取到锁的进程则不会来争抢资源了。用多进程结构而不用多线程结构的好处/理论:
节省锁带来的新的开销问题,每个 worker 进程都是独立的进程,不共享资源,不需要加锁。在
编程以及问题查上时,也会方便很多。
独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后, 其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程
Nginx 实现高并发的秘密-IO 多路复用
说明: 关于 Nginx 参数配置信息是在 nginx.conf 文件当中进行配置的。而 nginx.conf 文件存在两个目录位置。
/usr/local/nginx/conf 路径下存在该 nginx.conf 文件。usr/local/nginx 路径下也有一个 nginx.conf 文件,如果该路径下存在该文件,Nginx 优先读取的是该路径下的nginx.conf 文件,优先级比第一个目录下的文件更高。需要设置多少个 worker 的设置
- 每个 worker 的线程可以把一个 CPU 的性能发挥到极致。所以 worker 数和服务器的 CPU数相等是最为适宜的 。如果我们设置少了则会浪费 CPU,设多了会造成 CPU 频繁切换上下文带来的损耗。
- 设置 worker 的数量,Nginx 默认没有开启利用多核 CPU ,可以通过
worker_cpu_affinity配置参数充分利用多核 CPU 的性能。
#2 核 cpu,开启 2 个进程
worker_processes 2;
worker_cpu_affinity 01 10;
#2 核 cpu,开启 4 个进程,
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
#4 核 cpu,开启 2 个进程,0101 表示开启第一个和第三个内核,1010 表示开启第二个和 第四个内核;
worker_processes 2;
worker_cpu_affinity 0101 1010;
#4 个 cpu,开启 4 个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
#8 核 cpu,开启 8 个进程
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
补充: worker_cpu_affinity 理解

配置实例:
首先我们需要找到 Nginx 的配置文件 nginx.conf 文件。
这里我们的路径是在 /usr/local/nginx/conf 路径下:


2 #user nobody;
3 worker_processes 2;
4 worker_cpu_affinity 01 10;
5
配置好之后,我们需要执行 如下命令,检查校验我们的配置编写的在 nginx.conf 文件当中的内容是否存在错误。
[root@localhost conf]# ../sbin/nginx -t

重新加载 nginx ,读取我们配置的信息。
[root@localhost conf]# ../sbin/nginx
如果我们的 Nginx 已经启动了,可以执行如下命令,进行一个热部署读取我们的配置文件信息。
[root@localhost conf]# ../sbin/nginx -s reload
[root@localhost conf]# ps -aux | grep nginx # 查看我们的 Nginx 是否启动成功


worker_connection 表示每个 worker 进程所能建立连接的最大值,所以,一个 Nginx 能 建立的最大连接数,应该是 worker_connections * worker_processes
Nginx 默认是 : worker_connections: 1024
调大:worker_connections: 60000,(调大到 6 万连接)
同时要根据系统的最大打开文件数来调整。
系统的最大打开文件数>= worker_connections*worker_process
根据系统的最大打开文件数来调整,worker_connections 进程连接数量要小 于等于系统的最大打开文件数,worker_connections 进程连接数量真实数量= worker_connections * worker_process
查看系统的最大打开文件数
ulimit -a|grep "open files"
open files (-n) 65535
[root@localhost conf]# ulimit -a|grep "open files"

ulimit -a 可以查看当前系统的所有限制值,使用 ulimit -n 可以查看当前的最大打 开文件数。[root@localhost conf]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14956
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14956
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

ulimit -n 65535 可即时修改,但重启后就无效了。(注 ulimit -SHn 65535 等效 ulimit -n 65535,-S 指 soft,-H 指 hard)[root@localhost conf]# ulimit -n 65535

特别的,这里有其他的三种永久的修改方式:如下:
在/etc/rc.local 中增加一行 ulimit -SHn 65535
在 /etc/profile 中增加一行 ulimit -SHn 65535
在/etc/security/limits.conf 最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
在 CentOS 中使用第 1 种方式无效果,使用第 3 种方式有效果,而在 Debian 中使用第 2 种 有效果
特别说明:
如果我们采用第三种方式,报了一个,重启报错时,我们可以进行如下操作进行解决:
在
/etc/pam.d/login配置文件,在最后添加以下一条内容:session required pam_limits.so
可以看到软限制和硬限制的值都修改成功了。
vim /etc/security/limits.conf
59 #@student - maxlogins 4
60
61 * soft nofile 65535
62 * hard nofile 65535
63
64 # End of file

重启 Linux 虚拟机,测试验证:
[root@localhost ~]# ulimit -a # 查看系统文件支持的最大连接数

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
Hutool 的 `TimedCache` 到期会自动清理吗?

