Nginx生产环境下如何进行平滑升级

前言,最近工作遇到了nginx版本升级的情况。原生产环境版本是1.16.1

  1. 下载所需版本

1.下载所需版本(nginx-1.23.3.tar.gz)建议使用稳定版当前稳定版nginx-1.22.1

地址:http://nginx.org/en/download.html

  1. 获取旧版配置信息

/usr/local/nginx/sbin/nginx -V #nginx可执行文件所在目录

  1. 查看旧版nginx进程号

ps -ef | grep nginx

  1. 编译新版nginx

1、tar -zxvf nginx-1.22.1.tar.gz
2、cd nginx-1.22.1
#第3步执行时可能会出错,问题不大,根据报错信息下载相应包后再次执行即可
#可能需要的包有
    yum -y install libxml2 libxml2-dev
    yum -y install libxslt-devel
    yum install gd gd-devel
    yum install -y gperftools-devel
3、 ./configure --prefix=  #原nginx配置信息
4、make  #只编译不安装。编译完成后会在该目录下生成一个objs目录

  1. 备份旧版nginx可执行文件

cp objs/nginx /usr/local/nginx/sbin/

  1. 将新版的nginx可执行文件复制到旧版目录下

cp objs/nginx /usr/local/nginx/sbin/

7.平滑升级

Nginx对进程的控制能力非常强大,可以通过信号指令控制进程。常用的信号有:

-QUIT,表处理完当前请求后,关闭进程。

-HUP,表示重新加载配置,也就是关闭原有的进程,并开启新的工作进程。此操作不会中断用户的访问请求,因此可以通过此信号平滑的重启Nginx。

-USR2,用于平滑升级可执行程序。

-WINCH,从容关闭工作进程。

(1)平滑升级可执行程序

kill -USR2 3611926 (nginx旧的主进程)

(2)关闭旧的nginx进程

 kill -WINCH 3611926

  1. 验证是否成功

1)nginx -v

查看运行版本

2)nginx -t

#nginx -t可能会遇到的问题
(1)nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_image_filter_module.so" version 1016001 instead of 1022001 in /usr/share/nginx/modules/mod-http-image-filter.conf
解决办法:
mv /usr/lib64/nginx/modules/ngx_http_image_filter_module.so /usr/lib64/nginx/modules/ngx_http_image_filter_module.so.old
cp ngx_http_image_filter_module.so /usr/lib64/nginx/modules/
(2)nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_perl_module.so" version 1016001 instead of 1022001 in /usr/share/nginx/modules/mod-http-perl.conf
解决办法:
mv /usr/lib64/nginx/modules/ngx_http_perl_module.so /usr/lib64/nginx/modules/ngx_http_perl_module.so.old
cp ngx_http_perl_module.so /usr/lib64/nginx/modules/
(3)nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so" version 1016001 instead of 1022001 in /usr/share/nginx/modules/mod-http-xslt-filter.conf
解决办法:
mv /usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so /usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so.old
cp ngx_http_xslt_filter_module.so /usr/lib64/nginx/modules/
(4)nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_mail_module.so" version 1016001 instead of 1022001 in /usr/share/nginx/modules/mod-mail.conf:1
解决办法:
mv /usr/lib64/nginx/modules/ngx_mail_module.so /usr/lib64/nginx/modules/ngx_mail_module.so.old
cp ngx_mail_module.so /usr/lib64/nginx/modules/
(5)nginx: [emerg] dlopen() "/usr/lib64/nginx/modules/ngx_stream_module.so" failed (/usr/lib64/nginx/modules/ngx_stream_module.so: undefined symbol: pcre_exec) in /usr/share/nginx/modules/mod-stream.conf:1
解决办法:
mv /usr/lib64/nginx/modules/ngx_stream_module.so /usr/lib64/nginx/modules/ngx_stream_module.so.old
cp ngx_stream_module.so /usr/lib64/nginx/modules/
(6)nginx: [alert] version 1.22.1 of nginx.pm is required, but 1.16.1 was found
解决办法:
mv /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so.old
cp /www/nginx-1.22.1/objs/src/http/modules/perl/blib/arch/auto/nginx/nginx.so /usr/lib64/perl5/vendor_perl/auto/nginx/
(7)nginx object version 1.22.1 does not match bootstrap parameter 1.16.1 at /usr/share/perl5/XSLoader.pm line 111.
Compilation failed in require.
BEGIN failed--compilation aborted.
nginx: [alert] perl_parse() failed: 2
nginx: configuration file /etc/nginx/nginx.conf test failed
解决办法:
mv /usr/lib64/perl5/vendor_perl/nginx.pm /usr/lib64/perl5/vendor_perl/nginx.pm.old
cp /www/nginx-1.22.1/objs/src/http/modules/perl/nginx.pm /usr/lib64/perl5/vendor_perl/

3)nginx -s reload

可能会出现的问题
nginx: [error] invalid PID number "" in "/var/run/nginx.pid"
解决办法:nginx -c /etc/nginx/nginx.conf
<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、付费专栏及课程。

余额充值