Nginx平滑升级实操

本文档介绍了如何平滑升级Nginx到新版本,包括检查旧版本配置、编译新版本、备份二进制文件、验证配置、发送USR2和WINCH信号进行热更新,以及在需要时回滚到旧版本的详细步骤。整个过程旨在确保服务不间断并减少对在线业务的影响。

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

1.查看旧版nginx的编译参数

[root@Nginx ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.15.5
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --with-http_stub_status_module

2.编译新版本Nginx源码包,安装路径需与旧版一致,注意:不要执行make install

[root@Nginx ~]# tar xf nginx-1.19.9.tar.gz 
[root@Nginx ~]# cd nginx-1.19.9
[root@Nginx nginx-1.19.9]# ./configure --with-http_stub_status_module
[root@Nginx nginx-1.19.9]# make

3.备份二进制文件,用新版本的替换

[root@Nginx nginx-1.19.9]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
[root@Nginx nginx-1.19.9]# cp objs/nginx /usr/local/nginx/sbin/

4.确保配置文件无报错

[root@Nginx nginx-1.19.9]# /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

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

[root@Nginx nginx-1.19.9]# ps aux | grep nginx
root       1050  0.0  0.0  20560   612 ?        Ss   17:57   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     1051  0.0  0.1  21012  1312 ?        S    17:57   0:00 nginx: worker process
root       3601  0.0  0.0 112824   984 pts/0    R+   17:58   0:00 grep --color=auto nginx
[root@Nginx nginx-1.19.9]# kill -USR2 1050
[root@Nginx nginx-1.19.9]# ps aux | grep nginx
root       1050  0.0  0.0  20560   796 ?        Ss   17:57   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     1051  0.0  0.1  21012  1312 ?        S    17:57   0:00 nginx: worker process
root       3602  0.0  0.1  20576  1596 ?        S    17:59   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     3603  0.0  0.1  21012  1044 ?        S    17:59   0:00 nginx: worker process
root       3605  0.0  0.0 112824   984 pts/0    R+   17:59   0:00 grep --color=auto nginx

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

[root@Nginx nginx-1.19.9]# kill -WINCH 1050
[root@Nginx nginx-1.19.9]# ps aux | grep nginx
root       1050  0.0  0.0  20560   796 ?        Ss   17:57   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       3602  0.0  0.1  20576  1596 ?        S    17:59   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     3603  0.0  0.1  21012  1044 ?        S    17:59   0:00 nginx: worker process
root       3607  0.0  0.0 112824   984 pts/0    R+   18:00   0:00 grep --color=auto nginx

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

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

[root@Nginx nginx-1.19.9]# kill -QUIT 1050
[root@Nginx nginx-1.19.9]# ps aux | grep nginx
root       3602  0.0  0.1  20576  1596 ?        S    17:59   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     3603  0.0  0.1  21012  1044 ?        S    17:59   0:00 nginx: worker process
root       3623  0.0  0.0 112824   984 pts/0    S+   18:01   0:00 grep --color=auto nginx

8.验证nginx版本号,并访问测试

[root@Nginx nginx-1.19.9]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.19.9
<think>好的,用户想了解如何进行Nginx平滑升级以及注意事项。我需要先整理一下之前提供的引用内容,看看有哪些关键步骤和注意点。 首先,根据引用[1],平滑升级的方法主要是向原Nginx主进程发送HUP信号,这样可以重新启动工作进程,同时继续使用旧版本的配置文件。但这里可能有点混淆,因为引用[4]提到的是USR2信号来启动新版本,然后使用WINCH信号逐步停止旧进程。需要确认正确的信号使用方式。 再看引用[2],里面提到两种方案,用户关注的是第二种,即平滑升级。步骤包括编译新版本、替换二进制文件、发送信号。引用[3]给出了具体的命令示例,比如解压、配置、编译安装,这可能涉及覆盖旧版本的可执行文件吗?或者是否需要将新版本的安装路径分开? 引用[4]详细描述了信号的使用流程:USR2启动新服务,WINCH停止旧的工作进程,之后可能需要发送QUIT信号来完全关闭旧的主进程。这里需要注意的是,新旧版本会同时运行一段时间,确保新版本没问题后再关闭旧的。 接下来需要综合这些信息,整理出步骤清晰的流程。首先,用户需要下载新版本的Nginx源码,进行编译,注意配置参数要与旧版本一致,这点在注意事项里很重要,否则可能出现兼容问题。然后,替换二进制文件,通常是将新编译的nginx文件复制到旧版本的安装目录下。接着,发送USR2信号给旧的主进程,启动新进程。此时,系统会有两个主进程,旧的和新的。确认新版本运行正常后,发送WINCH信号给旧的主进程,让其优雅停止工作进程。如果出现问题,可以回滚,即重新使用旧进程并reload。 注意事项方面,必须确保编译时的参数一致,包括模块,否则新版本可能缺少必要的功能。同时,每一步都要检查nginx的状态,使用nginx -v或nginx -V查看版本和参数。此外,备份旧版本二进制文件也是关键,以便快速回滚。还有,升级过程中要监控服务状态,确保没有请求丢失。 用户可能的疑问点包括信号的具体作用,如何验证配置参数是否一致,以及回滚的具体步骤。需要把这些细节清晰地呈现出来,避免用户操作时出错。同时,要强调测试的重要性,建议在测试环境先演练一遍,再在生产环境操作。 最后,生成的相关问题应该围绕升级后的验证、常见错误处理、参数对比方法等,帮助用户全面了解平滑升级的各个方面。</think>### Nginx平滑升级方法与注意事项 #### **一、平滑升级方法** 1. **准备新版本源码包** 下载新版本Nginx源码并解压: ```bash wget http://nginx.org/download/nginx-x.x.x.tar.gz tar zxvf nginx-x.x.x.tar.gz ``` 2. **编译新版本** 进入源码目录,**确保编译参数与原版本一致**(可通过 `nginx -V` 查看旧版本参数)[^3]: ```bash cd nginx-x.x.x ./configure --prefix=/usr/local/nginx --user=www --with-http_ssl_module # 其他参数需与旧版本一致 make # 仅编译,不执行make install ``` 3. **替换二进制文件** 备份旧版本二进制文件,替换为新编译的 `objs/nginx`: ```bash cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old cp objs/nginx /usr/local/nginx/sbin/nginx ``` 4. **发送信号触发升级** - 向旧主进程发送 `USR2` 信号,启动新版本主进程[^4]: ```bash kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) ``` - 向旧主进程发送 `WINCH` 信号,逐步关闭旧工作进程: ```bash kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin) ``` 5. **验证与回滚** - 确认新版本运行正常后,关闭旧主进程: ```bash kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin) ``` - 若需回滚,向旧主进程发送 `HUP` 信号重启旧进程,并强制终止新进程[^1]。 --- #### **二、注意事项** 1. **编译参数一致性** 必须通过 `nginx -V` 检查旧版本配置参数,确保新版本编译时包含所有原有模块(如缺少 `--with-http_ssl_module` 会导致HTTPS失效)[^3]。 2. **备份与版本验证** - 操作前备份配置文件和二进制文件。 - 升级后执行 `nginx -v` 和 `nginx -t` 验证版本及配置语法[^1]。 3. **信号操作顺序** 必须按 `USR2` → `WINCH` → `QUIT` 顺序发送信号,避免服务中断[^4]。 4. **并行运行风险** 新旧版本会短暂并行运行,需监控资源占用情况(如内存、CPU)。 5. **回滚预案** 保留旧版本二进制文件,若新版本异常,可通过旧文件快速回滚[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值