启动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个master进程,1到多个worker进程,这种工作机制来对外服务的,这种工作机制保证了nginx能够稳定,灵活的运行。
master进程的责任是 监控进程,不处理具体业务,抓们用来管理和监控worker进程,master角色是监工,比较清闲。
worker进程是主要干活的。 (和用户交互)
master 进程和worker 进程之间如何通讯呢?可以用信号,也可以用共享内存
worker进程一旦挂掉,那么master进程会立即fork()一个新的workser进程投入到工作中去。
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
假设我们改动了,
cd /usr/local/nginx/conf/nginx.conf
sudo vim nginx.conf
可以使用 ./nginx -s reload 让其重新加载这些配置文件
使用 ./nginx -?查看 nginx支持哪些命令参数。
改动之前 ps- ef | grep nginx
改动之后,使用 sudo ./nginx -s reload重新加载配置文件
sudo ./nginx -s reload
注意 worker process 的进程ID,也就是PID 都变化了,但是 master的pid没有变化还是1402
不关闭 nginx的情况下,升级,如果升级后有问题,还能回滚。这个不是重点,我们知道有这个功能就行了。
./nginx -s stop 暴力关闭,不管这时候有没有人在使用。
./nginx -s quit 正常关闭,如果这时候有user在使用,会等到这次连接结束后,关闭
nginx 是一个多进程服务器,
好处是:A worker 进程挂了,不会影响其他进程,master进程发现A挂了后,会重新启动一个进程。
弊端是:进程间通讯消耗的资源多。
有些服务器是多线程服务器,多线程的弊端是当一个线程挂了的时候,很可能影响其他的线程,到时整个进程都有问题。