zl程序教程

您现在的位置是:首页 >  其他

当前栏目

nginx这些原理你都懂了吗?

2023-03-14 22:50:15 时间

不废话,满满的都是干货,先收藏起来。。。

1. 了解一下在nginx使用中常见的信号处理

kill -SIGHUP $ngx_master_pid 
# 相当于nginx -s reload 从新启动新的work进程
kill -SIGTERM $ngx_work_pid 
# 重建指定nginx work进程ID的进程

对于nginx的master进程来说可以接收到的信号:

以下四个信号是可以通过nginx命令与参数实现的

  • TERM,INT 表示立刻停止nginx进程
  • QUIT 表示优雅的停止nginx进程,就是慢慢的停止nginx进程,不要对用户发送立刻结束连接,像tcp的reset复位请求这样的报文
  • HUP 表示重载配置文件
  • USR1表示重新打开日志文件

以下两个信号专门用于进行nginx的热部署的时候使用,但是只能通过linux命令行的kill实现

  • USR2 发送热更新信号
  • WINCH 用于通知下线旧的work进程

当我们在命令行中使用nginx与参数实现对nginx的管理时,实质上就是获取当前nginx运行的pid文件中的pid,然后通过命令行向pid发送对应的信号

  • reload -> HUP
  • Reopen -> USR1
  • stop -> TERM
  • Quit -> QUIT

2. nginx在重载配置文件究竟做了什么?

思考优雅的退出和立即退出有什么区别呢?你知道吗?

1. 向master进程发送HUP信号(reload命令)
2. master进程校验配置语法是否正确(因此我们在进行reload的时候,不一定非要先执行一个`nginx -t`)
3. master进程打开新的监听端口(可能引入了https,监听了443,此时work就会共用打开的端口)
4. master进程用新配置启动新的worker子进程
5. master进程向老的worker子进程发送Quit信号(在新的版本中nginx添加一个nginx shutdown timeout,这个就是在新老worker子进程同时存在的时候,限制老的worker进程最迟多久退出)
6. 老worker进程关闭监听句柄,处理完当前连接后结束进程

3. nginx热升级的完整流程是什么样的?

  • 新的worker进程升级出现问题,想要考虑回滚?
  • 老的worker进程一直退不掉?
  • 升级了nginx之后,发现很多预期的功能不能使用,配置报错?

当我们在处理nginx的版本升级或者增加新的扩展模块的时候或多或少的会遇到这些问题,熟悉nginx升级原理很快解决这些问题。

1. 将旧nginx文件换成新的nginx文件(注意备份) 
2. 向master进程发送USR2信号
3. master进程修改pid文件名,加后缀.oldbin
4. master进程用新nginx文件启动新master进程
5. 向老master进程发送quit信号,关闭老的master进程
6. 回滚: 向老master发送HUP,向新master发送quit

4. 如何优雅的关闭nignx的worker进程?

如何优雅的关闭连接呢?worker进程可以识别当前的进程是否正在处理请求,若没有处理请求的时候,就可以将连接进行关闭,但是当nginx代理websocket的协议的时候,是做不到这点的,因为在websocket后端通信的frame帧里面,nginx是不解析的,所以是不能识别的。当nignx代理的是tcp请求的时候,因为无法判断一个请求要经历多少报文才结束,因此也是不能识别进程是否正在处理请求,但是对于Http请求,nginx是可以的。

1. 设置定时器 `worker_shutdown_timeout`,然后给进程设置一个优雅关闭的标志位
2. 关闭监听句柄不在接收新的连接
3. 关闭空闲连接
4. 在循环中等待全部连接关闭
5. 退出进程

看到这里是不是有很多疑问?有就对了,哈哈。。。。