120 Linux C++ 通讯架构实战 nginx整体结构,nginx进程模型,nginx调整worker进程数量,nginx重载配置文件,热升级,关闭

一 nginx整体结构

1.1 master进程和worker进程概览(父子关系)

启动nginx,看到了master进程和 worker 进程。

ps -ef | grep nginx

第一列:进程所属的用户id

第二列:进程ID,也叫做PID,用来唯一的标识一个进程

第三列:父进程ID(PPID)。这说明 work process 是 master process的孩子。

hunandede@hunandede-virtual-machine:~/nginx/nginx-1.14.2$ ps -ef | grep nginx
root          14539      1       0 16:09 ?        00:00:00 nginx: master process ./nginx
nobody    14540  14539   0 16:09 ?        00:00:00 nginx: worker process
 

1.2 nginx进程模型

1个master进程,1到多个worker进程,这种工作机制来对外服务的,这种工作机制保证了nginx能够稳定,灵活的运行。

master进程的责任是 监控进程,不处理具体业务,抓们用来管理和监控worker进程,master角色是监工,比较清闲。

worker进程是主要干活的。 (和用户交互)

master 进程和worker 进程之间如何通讯呢?可以用信号,也可以用共享内存

worker进程一旦挂掉,那么master进程会立即fork()一个新的workser进程投入到工作中去。

120 Linux C++ 通讯架构实战 nginx整体结构,nginx进程模型,nginx调整worker进程数量,nginx重载配置文件,热升级,关闭_第1张图片

1.3 调整worker进程数量

worker进程有几个比较合适呢?一个公认的做法是:你是几核的计算机,就产生几个worker,这样做的目的是:让每个worker 运行在一个单独的内核上。最大限度减少CPU进程切换成本;

那么怎么知道我们有多个个核呢?

使用 grep -c processor /proc/cpuinfo

结果是4,也就是本机linux上是4个核心

注意的是 CPU和核是两个不同的概念,一个CPU 可能含有多个核。

在前面的课程中,我们知道,/usr/local/nginx/conf/nginx.conf文件是很重要的,这个配置文件决定了我们启动的一些参数,这个worker 数量的配置也是在这里的,因此我们要改动这个文件中的

work_processes 的值为 当前processor的值,也就是4.

cd /usr/local/nginx/conf

sudo vim nginx.conf

120 Linux C++ 通讯架构实战 nginx整体结构,nginx进程模型,nginx调整worker进程数量,nginx重载配置文件,热升级,关闭_第2张图片

二 nginx进程模型细说

2.1nginx重载配置文件

假设我们改动了,

cd /usr/local/nginx/conf/nginx.conf

sudo vim nginx.conf

可以使用 ./nginx -s reload 让其重新加载这些配置文件

使用 ./nginx -?查看 nginx支持哪些命令参数。

改动之前 ps- ef | grep nginx

120 Linux C++ 通讯架构实战 nginx整体结构,nginx进程模型,nginx调整worker进程数量,nginx重载配置文件,热升级,关闭_第3张图片

改动之后,使用 sudo ./nginx -s reload重新加载配置文件


sudo ./nginx -s reload

注意 worker process 的进程ID,也就是PID 都变化了,但是 master的pid没有变化还是1402

120 Linux C++ 通讯架构实战 nginx整体结构,nginx进程模型,nginx调整worker进程数量,nginx重载配置文件,热升级,关闭_第4张图片

2.2nginx 热升级, 还能热回滚

不关闭 nginx的情况下,升级,如果升级后有问题,还能回滚。这个不是重点,我们知道有这个功能就行了。

2.3nginx的关闭

./nginx -s stop  暴力关闭,不管这时候有没有人在使用。

./nginx -s quit 正常关闭,如果这时候有user在使用,会等到这次连接结束后,关闭

三 总结

nginx 是一个多进程服务器,

好处是:A worker 进程挂了,不会影响其他进程,master进程发现A挂了后,会重新启动一个进程。

弊端是:进程间通讯消耗的资源多。

有些服务器是多线程服务器,多线程的弊端是当一个线程挂了的时候,很可能影响其他的线程,到时整个进程都有问题。

你可能感兴趣的:(linux,架构,nginx)