古黑论

 找回密码
 立即注册

只需一步,快速开始

打印 上一主题 下一主题

[# Linux] Nginx 编译升级(平滑升级/热更新)

[复制链接]
跳转到指定楼层
楼主
小执念论坛大牛 发表于 2019-8-18 09:09:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
期间遇到一个问题,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

Img-1.png__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
  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 版本.
回复

使用道具 举报

行车9 发表于 2019-8-18 09:16:23 | 只看该作者
楼主我打酱油的
 
收起(1)
小执念 发表于 2019-08-18 10:19 
我打你, 信不?
回复 点赞 点踩

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

关于本站小黑屋Archiver

GMT+8, 2019-11-12 09:10 Processed in 0.083818 second(s), 24 queries , Gzip On, Redis On.

© 2019 古黑论 Powered by Discuz! X3.4 Theme by Jvmao

快速回复 返回顶部 返回列表