那天放学的时候人很多。楼道很挤,你的手不小心碰到了我的手背,这是我漫长而又短暂的初恋。 收藏本站
登陆 / 注册 搜索

阅读:7.4K   回复: 4

Nginx 编译升级(平滑升级/热更新)

原创 推荐 [复制链接]
小执念 古黑浩劫论坛大牛 2019-8-18 09:09 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员
期间遇到一个问题,nginx: [alert] version 1.16.1 of nginx.pm is required, but 1.14.2 was found 我找了好久才找到相关资料,后面再详细说说。

升级大概的步骤:下载新版文件 >> 解压/编译 >> 复制新文件 >>  替换老进程 >> 完成 .

一. 下载新文件👴‍👚📠😡🤙

官网下载地址:
https://nginx.org/en/download.html

二. 编译
👌🚘🥣☯🦖‎
因为这篇文章主要讲升级, 所以前提是大家都熟悉编译安装的过程, 如果不熟悉, 请看 Centos 7编译安装LNMP环境及php-fpm 一文, 里面有详细的编译安装过程.

使用
  1. nginx -V
复制代码

👃⛵🍞©🐡‎获取到之前的编译参数, 生成 MakeFile 文件, 然后 make , 这里没什么好说的, 也不会出现什么问题.

编译完成之后, 问题开始出现了, 网上很多人的文章都是复制前人的, 没脑一粘贴, 根本没有实践过, 害人不浅 !

这里的问题有:
🤝🚐🍍♑🐟‌
你 nginx 启动的方式是什么 ?

如果你的 nginx 启动是通过
  1. nginx
复制代码
🧑‍🌾‌👠⚔🤪🖐

这样的命令来启动, 后面会遇到问题. 用
  1. ps aux |grep nginx
复制代码

查看启动方式, 如果像下图一样, 那就要关闭 nginx , 用绝对路径启动 nginx

👨‍🎨‍🕶🧬🙄💅


Nginx 编译升级(平滑升级/热更新) Img-1.png


升级前, 你的 nginx 启动方式一定要是以绝对路径启动, 而不是直接在命令行中输入 nginx 的方式启动的 nginx 服务, 不通过绝对路径启动的方式通常是为了方便, 配置了 nginx 相关的环境变量.

如果没有通过绝对路径启动 nginx, 那么当你向 nginx 进程发送更新的信号时, nginx 进程可能会无法找到新的二进制程序, 由于没有找新版本的二进制程序,所以没有任何反应.
🦴🎠🍟⁉🐂‏nginx: [alert] version 1.16.1 of nginx.pm is required, but 1.14.2 was found 就是这个问题导致的.

只需要复制 objs/nginx 吗 ?

网上的教程大多数只会替换二进制程序文件, 而不会操作其他文件, 这可能是由于历史原因造成的, 在早期的 nginx 版本中, 并不支持动态模块, 所有模块都是直接编译到二进制程序文件中的, 即所有模块都直接编译到 nginx 执行文件中. 👨🦱‎👞🔋😡💅

当我们想要升级时, 只需要升级 nginx 二进制文件就可以了. 但是在现在的版本中, 有几个模块是支持编译成动态模块的, 也就是说, 这些模块会以动态库的形式存在, 比如 "--with-http_geoip_module=dynamic"

这就表示我把 http_geoip_module 以动态模块的形式编译了, 所以, 你除了能在 objs 目录下找到 nginx 二进制文件, 还能在 objs 目录下看到一些以 ".so" 结尾的动态库文件, 比如 ngx_http_geoip_module.so
👦‌👙🧬☠🤳
如果你在编译时使用了动态模块, 那么当你想要升级nginx时, 最好记得将对应的动态模块也升级了.

当然如果你的编译设置中没有任何动态模块, 那么你就不用考虑这么多了, 只替换 nginx 二进制文件就好了.

make install 会覆盖原来的配置吗 ?‎👜✏😉👏

答案是不会. 相关脚本会判断编译参数中的文件是否存在, 如果文件存在会跳过, 不会覆盖. 但是为了保证万无一失, 请备份你的 nginx.conf 等配置文件.

三. 复制新文件
👨‍🎨‎👔🖲😈👃
复制前请备份旧版本的 nginx 文件, 我的在 /usr/sbin/nginx
  1. mv /usr/sbin/nginx  /usr/sbin/nginx.old
复制代码

  1. cp objs/nginx /usr/sbin/nginx
复制代码


四. 替换老进程👨‍🚒‏🎩🔌😡🤝

此时的 nginx 还是旧版本, 我们复制过去的还在硬盘上, 旧版本 nginx 在内存中运行着.

向老版本 master 进程发送 USR2 信号,
  1. kill -USR2 1456
复制代码
👵‌💎🛋😂👁

老版本 master 进程收到 USR2 信号后,会根据老版本 master 进程中的 nginx 启动路径 (绝对路径), 启动一个新的 master 进程.

由于 nginx 二进制文件已经替换为新版本的二进制文件, 所以, 新启动的nginx进程就是新版本的.
👨‍🎨‎👠💿🤬💅
使用
  1. ps aux |grep nginx
复制代码

你会发现有两个 master 进程.
此时, 新老版本的 nginx 进程同时存在, 但是我们的最终目的是使用新版本的 nignx 提供服务.

✍💈🧊♻🦠‍此时可以使用
  1. nginx -t
复制代码


查看是否有错误提示.

如果没有错误, 我们现在需要先停止老版本的 worker 进程, 此时就需要用到 "WINCH" 信号了👵‌👗🔑🤡🖕
  1. kill -WINCH 1456
复制代码


当老版本的 master 进程接收到 "WINCH" 信号后, 会停止老版本的 worker 进程, 但是老版本的 master 进程并不会停止.

我们留下老版本的 master 进程是为了以防万一, 如果出现错误, 可以随时退回之前的版本.👨‍🚒‍🎒💾👂

如果一切顺利, 你已经完成了你的升级工作. 但是如果出现问题, 你可以随时通过老的 master 进程从新启动一个老版本的 worker 进程,
  1. kill -HUP 1456
复制代码

如果没有出错, 那么就可以关闭老进程了
  1. kill -QUIT 1456
复制代码
👮‍♂️‏🎒🩺😡👆

五. 大功告成 !

使用
  1. nginx -v
复制代码
👨🦱‏🥼💾🤪✋
查看此时的 nginx 版本.
上一篇
下一篇

评分

参与人数 2成长值 +2 金币 +2 展开 理由
+ 1 + 1
空谷幽兰 + 1 + 1 威武!

查看全部评分

帖子热度 7410 ℃

行车9 「初入古黑」 2019-8-18 09:16 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

楼主我打酱油的
shangzhiqiang 「初入古黑」 2020-3-26 15:09 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

nginx: [alert] version 1.16.1 of nginx.pm is required, but 1.14.2 was found 这个问题咋解决的呀大佬
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表