Nginx 编译升级(平滑升级/热更新)原创 推荐 |
期间遇到一个问题,nginx: [alert] version 1.16.1 of nginx.pm is required, but 1.14.2 was found 我找了好久才找到相关资料,后面再详细说说。
升级大概的步骤:下载新版文件 >> 解压/编译 >> 复制新文件 >> 替换老进程 >> 完成 . 一. 下载新文件 💪🌦🥄🦚 官网下载地址: 二. 编译 ✌🗺🍒⚛🦟 因为这篇文章主要讲升级, 所以前提是大家都熟悉编译安装的过程, 如果不熟悉, 请看 一文, 里面有详细的编译安装过程. 使用
获取到之前的编译参数, 生成 MakeFile 文件, 然后 make , 这里没什么好说的, 也不会出现什么问题. 编译完成之后, 问题开始出现了, 网上很多人的文章都是复制前人的, 没脑一粘贴, 根本没有实践过, 害人不浅 ! 这里的问题有: 🙏🦼🥛©🦟 你 nginx 启动的方式是什么 ? 如果你的 nginx 启动是通过
这样的命令来启动, 后面会遇到问题. 用
查看启动方式, 如果像下图一样, 那就要关闭 nginx , 用绝对路径启动 nginx 👴🩰🗑😡👁 升级前, 你的 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
四. 替换老进程🧑🚀🕶🧲😷👍 此时的 nginx 还是旧版本, 我们复制过去的还在硬盘上, 旧版本 nginx 在内存中运行着. 向老版本 master 进程发送 USR2 信号,
🦴⛄🍚🆗🦋 老版本 master 进程收到 USR2 信号后,会根据老版本 master 进程中的 nginx 启动路径 (绝对路径), 启动一个新的 master 进程. 由于 nginx 二进制文件已经替换为新版本的二进制文件, 所以, 新启动的nginx进程就是新版本的. 👃🍞🆚🐡使用
你会发现有两个 master 进程. 此时, 新老版本的 nginx 进程同时存在, 但是我们的最终目的是使用新版本的 nignx 提供服务. 🧑🚀🕶🪝💀👆 此时可以使用
查看是否有错误提示. 如果没有错误, 我们现在需要先停止老版本的 worker 进程, 此时就需要用到 "WINCH" 信号了 👩✈️🩰💰😫👄
当老版本的 master 进程接收到 "WINCH" 信号后, 会停止老版本的 worker 进程, 但是老版本的 master 进程并不会停止. 我们留下老版本的 master 进程是为了以防万一, 如果出现错误, 可以随时退回之前的版本. 👆🔥🍒🚭🦖 如果一切顺利, 你已经完成了你的升级工作. 但是如果出现问题, 你可以随时通过老的 master 进程从新启动一个老版本的 worker 进程,
如果没有出错, 那么就可以关闭老进程了
👆🛩🍞♻🐻 五. 大功告成 ! 使用
查看此时的 nginx 版本. 评分
帖子热度 8480 ℃
|
|
nginx: [alert] version 1.16.1 of nginx.pm is required, but 1.14.2 was found 这个问题咋解决的呀大佬
|