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 版本. 评分
帖子热度 8479 ℃
|
|
nginx: [alert] version 1.16.1 of nginx.pm is required, but 1.14.2 was found 这个问题咋解决的呀大佬
|