期间遇到一个问题,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 一文, 里面有详细的编译安装过程.
使用
获取到之前的编译参数, 生成 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
- mv /usr/sbin/nginx /usr/sbin/nginx.old
复制代码
- cp objs/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 版本.
|