nginx运行管理

master负责管理worker进程, 具体woker进程数由 worker_processes 指令配置。
Syntax: worker_processes number | auto;
Default:
worker_processes 1;
Context: main
默认 worker_processes 为1,也就是说最少两个进程一个master进程,一个worker进程。但实际工作中往往会有一个master进程管理多个woker进程。 配置 worker_processes 为auto,一般为系统的cpu核数的数量。
master进程主要用于读取验证配置信息,监控、启动、终止worker进程以及维护worker进程的个数等工作
worker主要用于接收,传入并处理来自客户端的连接
思考: 服务器上不可能不存在其他服务, 也就是说进程切换是不可避免的. 为什么 worker_process 的数字最好和cpu核数对等 往往能实现资源利用最大化。
nginx管理常用的那几个信号
master进程接收的信号:
| 信号名 | 含义 | 对应nginx命令行 |
|---|---|---|
| TERM,INT | 终止进程 | stop |
| QUIT | 完成请求链接,优雅的终止进程 | quit |
| HUP | 平滑重启,重新加载配置文件 | reload |
| USR1 | 重新打开日志文件,在切割日志时用途较大 | reopen |
| USR2 | 平滑升级,热部署使用 | 无 |
| WINCH | 平滑关闭进程,热部署使用 | 无 |
worker接收的信号
| 信号名 | 含义 | 对应nginx命令行 |
|---|---|---|
| TERM,INT | 终止进程 | stop |
| QUIT | 完成请求链接,优雅的终止进程 | quit |
| WINCH | 平滑关闭进程,热部署使用 | 无 |
例子:
为了更加直观,我们将nginx.conf worker进程改为1
worker_processes 1;
更改后,我们重新加载配置文件,可使用
nginx -s reload
或者可以使用 kill -HUP pid,pid需要你去查看nginx master进程pid获取. 此命令针对worker进程无效
重新生成日志文件
nginx -s reopen
# kill -USR1 1144
停掉子进程
kill -TERM 1376

我们发现master又重新启动了一个新的worker进程.
其余大家可以自己尝试、了解
nginx -s reload 原理
代码级别原理目前不懂, 介绍一下简单的自己理解吧

平滑重启,先启动两个新配置的worker进程。 旧配置的worker进程继续处理目前存在的任务,处理完后将会关闭。
reload流程:
- 向master发送HUB信号(reload命令)
- master进程验证配置文件语法是否正确
- master进程打开新的监听端口
- master进程用新配置启动新的worker子进程
- master进程向向老worker进程发送QUIT信号
- 老worker进程关闭监听句柄,处理完当前链接后结束进程
nginx最常用的进程间通信(共享内存)
因为nginx是多进程结构,如果实现比如流量控制功能、openrestry的lua_shared_dict指令,都通过共享内存来进行通信.
简单了解我们的nginx内部结构
我们可以下载nginx官方源码
wget http://nginx.org/download/nginx-1.14.2.tar.gz
这个下载后的src的源码目录结构

-
src/core存放着主干部分、基础数据结构和基础设施的源码,main函数在src/core/nginx.c中,这是分析源码的一个很好的起点。
-
src/event存放着事件驱动模型和相关模块的源码。
-
src/http存放着http server和相关模块的源码。
-
src/mail存放着邮件代理和相关模块的源码。
-
src/misc存放着C++兼容性测试和google perftools模块的源码。
-
src/os存放着依赖于操作系统实现的源码,nginx启动过程中最重要的master和workers创建代码就在这个目录下
我们着重观察下 http proxy 模块
proxy 并不是一个必要的模块,它藏在了 http 下面的 modules 目录下.
我们找到了 ngx_http_proxy_module.c 文件, 找到 ngx_command_t,下面配置了所有的相关指令,如果官方文档不全,可以用此快速参考学习.

文件名包含filter的表示起到的为过滤功能
额外小tip
端口的限制,极限情况最多通过nginx建立当前连接数65536个
IP的端口是双字节,也就是256256-1, 256256对计算机来说就是0,因为此最大的端口号是65535而不是65536,当然端口数值是0-65535,数量是65536个,但0一般不用,故而我们通常都说65535,而且端口号最大也是65535,所以我们都说端口是65535
worker_connections 指令
很多人会误解worker_connections这个参数的意思,认为这个值就是nginx所能建立连接的最大值。其实不然,这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
更多精彩关注公众号呀 (呆呆熊一点通)
