Nginx-运行管理篇

1,129 阅读4分钟

nginx运行管理

图片盗于 www.cnblogs.com/yum777/p/62…

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流程:

  1. 向master发送HUB信号(reload命令)
  2. master进程验证配置文件语法是否正确
  3. master进程打开新的监听端口
  4. master进程用新配置启动新的worker子进程
  5. master进程向向老worker进程发送QUIT信号
  6. 老worker进程关闭监听句柄,处理完当前链接后结束进程

nginx最常用的进程间通信(共享内存)

因为nginx是多进程结构,如果实现比如流量控制功能、openrestry的lua_shared_dict指令,都通过共享内存来进行通信.

简单了解我们的nginx内部结构

我们可以下载nginx官方源码

wget http://nginx.org/download/nginx-1.14.2.tar.gz

这个下载后的src的源码目录结构

  1. src/core存放着主干部分、基础数据结构和基础设施的源码,main函数在src/core/nginx.c中,这是分析源码的一个很好的起点。

  2. src/event存放着事件驱动模型和相关模块的源码。

  3. src/http存放着http server和相关模块的源码。

  4. src/mail存放着邮件代理和相关模块的源码。

  5. src/misc存放着C++兼容性测试和google perftools模块的源码。

  6. 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。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

更多精彩关注公众号呀 (呆呆熊一点通)