怎么实现nginx的原理分析

本篇文章为大家展示了怎么实现nginx的原理分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

清远ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!

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进程关闭监听句柄,处理完当前连接后结束进程

怎么实现nginx的原理分析

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

  • 新的worker进程升级出现问题,想要考虑回滚?

  • 老的worker进程一直退不掉?

  • 升级了nginx之后,发现很多预期的功能不能使用,配置报错?

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

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

怎么实现nginx的原理分析

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

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

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

上述内容就是怎么实现nginx的原理分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。


新闻名称:怎么实现nginx的原理分析
文章转载:http://myzitong.com/article/gjodhp.html