Nginx平滑(不停服)升级、openssl模块添加

本文详细介绍了如何解决线上业务中存在的Heartbleed漏洞,通过升级Nginx和OpenSSL来增强安全性。从备份旧版Nginx开始,经过解压、配置、编译新版本,到最终的平滑切换,每一步都附有具体操作命令,确保升级过程对在线服务的影响降到最低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【前言】

前段时间扫描出来发现线上业务存在Heartbleed漏洞,听着名字挺瘆人的。百度老哥告诉我,这个是OpenSSL在实现TLS的心跳扩展时没有对输入进行适当验证(缺少边界检查),会导致攻击者可以追踪OpenSSL所分配的64KB缓存、将超出必要范围的字节信息复制到缓存当中再返回缓存内容,这样一来受害者的内存内容就会以每次64jKB的速度进行泄露,在后面的升级版本中得以修复,看来我们使用的版本还是处于低版本,于是乎就需要升级OpenSSL。因为种种原因,我们必须要手动在nginx中添加此升级后的模块,又因为种种原因,nginx版本太低不适用新版本的,于是乎,就有了Nginx的平滑升级。

【准备各种包】

首先你需要去官方下载以下包:

OpenSSL 1.1.1d:https://www.openssl.org/source/openssl-1.1.1g.tar.gz

Nginx 1.16.1:http://nginx.org/download/nginx-1.16.1.tar.gz

 

操作步骤

备份旧nginx

cp -r /usr/local/nginx /data/nginx-bak

1.解压nginx新版本包

tar xvf nginx-1.16.0.tar.gz 

2.检测平台的目标特征 (此处的内容和旧版本保持一致)

./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/err.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx/nginx.lock --user=apache --group=apache --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --add-module=/root/update-nginx/nginx-upstream-fair-master/ --add-module=/opt/nginx_upstream_check_module-master/ --with-http_stub_status_module --with-openssl=/root/update-nginx/openssl-1.1.1d/

3.编译(注意:不要执行make install)

make

4.备份旧版本二进制文件,用新版本替代

(cp的时候要带上-f参数,不然会一直报“cp: 无法创建普通文件"/data/nginx/sbin/nginx": 文本文件忙”)

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx1.8.bak

cp -f /root/nginx-1.16.1/objs/nginx /usr/local/nginx/sbin/

5.验证配置文件

/usr/local/nginx/sbin/nginx –t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

 

6.发送USR2信号,用新二进制启动新进程

向主进程(master)发送USR2信号,Nginx会启动一个新版本的master进程和对应工作进程,和旧版一起处理请求

ps aux | grep nginx

找到master process进程号,图中为18192,执行下面命令

kill -USR2 18192

7.查看是否生效

ps aux | grep nginx

此时会有两个nginx主进程,分别是新旧版本的主进程

8.发送WINCH信号,新进程接管旧子进程

向旧的Nginx主进程(master)发送WINCH信号,它会逐步关闭自己的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理

kill -WINCH 18192

ps aux | grep nginx

可以看到之前的子进程已经消失,只剩下旧版本的主进程。

回滚步骤:此时如果需要回退继续使用旧版本,给旧nginx主进程发送HUP信号,它会重新启动工作进程, 仍使用旧版配置文件。然后可以将新版Nginx进程杀死(使用QUIT、TERM、或者KILL)

kill -HUP 18192

9.发送QUIT信号,退出旧主进程

升级完毕,可向旧的Nginx主进程(master)发送(QUIT、TERM、或者KILL)信号,使旧的主进程退出

kill -QUIT 18192

此时再次查看nginx进程,就只剩新版本的nginx进程了

10.验证版本号,并访问测试服务是否正常

/usr/local/nginx/sbin/nginx –v

至此,整个nginx就已经平滑的升级成功

<think>首先,用户的问题是:“我想在不中断服务的情况下升级nginx 请问nginx 平滑升级步骤”。我需要基于系统级指令和用户可见层的要求来回答。 系统级指令: - 所有行内数学表达式使用 $...$,但在这个问题中,没有数学表达式,所以可能不适用。 - 独立公式使用 $$...$$,但这里没有公式。 - LaTeX语法正确:确保任何数学部分正确,但问题是非数学的。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答末尾添加相关问题。 - 引用标识:引用末尾自然地添加引用标识,如 [^1]。 用户可见层: - 回答结构清晰,逐步解决问题。 - 保证回答真实可靠:基于提供的引用内容,这些是关于Nginx平滑升级的。 提供的引用内容: - [^1]: 解释了平滑升级的原理:不停老进程,启动新进程,老进程处理完现有请求后停止。 - [^2]: 关于平滑升级的实战例子。 - [^3]: 平滑升级步骤:获取编译参数、下载新模块、重新编译、停止服务、备份、覆盖、启动。 - [^4]: 两种升级方法:手动发送信号或使用 make upgrade。 - [^5]: 备份旧版本,复制新版本。 关键点:平滑升级的核心是使用新进程替换旧进程,而不中断服务。 我的回答应该结构清晰: 1. 介绍平滑升级的概念。 2. 详细步骤。 3. 可能包括注意事项。 4. 添加相关问题。 步骤基于引用: - 获取之前的编译参数(使用 nginx -V)。 - 下载新版本的Nginx添加模块。 - 重新编译(不安装)。 - 备份旧程序。 - 替换旧程序。 - 发送信号给进程(USR2 和 WINCH 或 QUIT)。 - 或者使用 make upgrade 命令。 确保回答真实可靠:使用引用中的信息。 最后,生成相关问题。 回答结构: - 开头解释平滑升级。 - 分步说明步骤。 - 结尾添加相关问题。 用中文。</think>### Nginx 平滑升级步骤 Nginx 平滑升级允许您在不中断服务的情况下更新版本或添加模块。核心原理是:启动新进程处理新请求,而老进程继续处理现有请求,直到完成后再优雅退出[^1]。以下步骤基于最佳实践整理,确保操作安全可靠。请确保在操作前备份关键数据。 #### 详细步骤 1. **获取当前编译参数** 在升级前,获取当前 Nginx 的编译参数,确保新版本配置一致。 ```bash nginx -V ``` 输出结果包括 `configure arguments`(如 `--prefix=/usr/local/nginx`),记录这些参数用于后续编译[^3]。 2. **下载新版本或模块** - 下载新版本的 Nginx 源码包(如从官方站点获取)。 ```bash wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0 ``` - 如果需要添加模块,确保下载模块源码并解压到指定路径[^3]。 3. **重新编译新版本** 使用记录的编译参数重新编译,但不安装(避免直接覆盖)。 ```bash ./configure <您的编译参数> --add-module=<模块路径> # 例如:--add-module=/path/to/new_module make # 仅编译,不执行 make install ``` 编译后,新可执行文件位于 `objs/nginx`[^3][^4]。 4. **备份旧程序** 停止新请求接收,备份旧 Nginx 可执行文件,防止升级失败时回滚。 ```bash mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old ``` 备份后,旧进程仍在运行,继续处理现有请求[^5]。 5. **替换为新程序** 复制新编译的 Nginx 文件到安装目录。 ```bash cp objs/nginx /usr/local/nginx/sbin/nginx ``` 6. **发送信号升级进程** 有两种方法可选(推荐方法一,更灵活): - **方法一:手动发送信号** 1. 发送 `USR2` 信号给主进程,启动新进程: ```bash kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) ``` 此时,新进程开始接受新请求,老进程继续处理旧请求[^1][^4]。 2. 发送 `WINCH` 信号让老进程优雅停止接受新连接: ```bash kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin) # 注意:pid.oldbin 是老进程的 PID 文件 ``` 3. 等待老进程处理完所有请求后,发送 `QUIT` 信号完全退出: ```bash kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin) ``` - **方法二:使用 make upgrade 命令** 在 Nginx 源码目录执行: ```bash make upgrade # 自动处理信号发送和进程切换 ``` 此命令简化了过程,但需确保编译路径正确[^4]。 7. **验证升级结果** - 检查版本: ```bash nginx -v ``` - 查看进程状态: ```bash ps aux | grep nginx ``` 新进程应正常运行,无错误日志(检查 `/var/log/nginx/error.log`)[^2]。 #### 注意事项 - **测试环境验证**:先在测试服务器模拟升级,避免生产环境风险。 - **回滚准备**:如果升级失败,用备份的 `nginx.old` 替换并重启服务。 - **依赖问题**:如果新版本依赖库(如 OpenSSL),确保系统已更新[^3]。 - **平滑升级失败处理**:常见原因包括 SSL 模块不兼容,检查编译参数是否匹配[^4]。 通过以上步骤,您可以实现零宕机升级,确保服务连续性。更多细节可参考 Nginx 官方文档或社区实践[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hobby云说

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值