ubantu系统下平滑升级nginx版本

文章详细介绍了如何在Ubuntu系统下通过二进制文件替换方式升级Nginx,包括备份现有文件、下载新版本、配置编译参数、编译新版本、替换旧文件以及处理可能出现的依赖库版本问题。此外,还提到了使用apt更新源文件的另一种升级方法。

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

ubantu系统下平滑升级nginx版本

首先关于nginx升级有两种方法:

1.直接更新ubantu系统的nginx源文件,再通过apt安装直接获取nginx最新版本,需要获取nginx官网公钥

2.通过上传nginx.tar包,解压之后通过替换nginx二进制文件,make编译之后替换安装,关于第二种方法比较麻烦,因为nginx版本升级可能会导致nginx依赖的依赖库版本也要对应升级

在这里选择的是第2种方法,因为我们的服务设置了禁止访问外网ip,所以我没有办法从nginx官网获取公钥升级

第一种方法 公钥升级

1.备份nginx程序
whereis nginx
cp /usr/sbin/nginx ./backup

2.备份/etc/nginx
sudo cp -r /etc/nginx ./nginx

3.卸载
$ sudo apt remove nginx nginx-common nginx-full nginx-core

4.更新apt源 要注意codename,ubantu版本不同codename不同
# 进入目录
$ cd /etc/apt
# 备份源文件
$ sudo cp sources.list sources.list.bak
# 编辑配置文件
$ sudo vim sources.list
# 文件末尾添加以下两行并保存
deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx

注: 18.04 “bionic” x86_64, aarch64/arm64
	20.04 “focal” x86_64, aarch64/arm64, s390x
	21.04 “hirsute” x86_64, aarch64/arm64
	21.10 “impish” x86_64, aarch64/arm64
	
5.导入nginx公钥
sudo wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key

6.安装nginx最新版本
$ sudo apt-get update
$ sudo apt-get install nginx

7.还原备份的配置文件
sudo cp -f /backup/nginx/nginx.conf /etc/nginx

8.重启服务
$ sudo systemctl restart nginx

$ sudo systemctl status nginx  查看nginx状态
$ sudo systemctl start nginx   启动nginx
$ sudo systemctl stop nginx  停止nginx

这种方法基本上不会遇到什么问题,就是更新了ubantu自带的nginx下载源

第二种 二进制文件替换升级

1.下载nginx升级包也可以提前下载好tar包上传到服务器
sudo wget http://nginx.org/download/nginx-1.23.4.tar.gz

2.解压升级包
sudo tar zxvf nginx-1.23.4.tar.gz

3.进入解压后的新nginx文件夹
cd nginx-1.23.4/

4.查看当前版本得到编译参数(/usr/sbin/nginx是nginx的二进制执行文件)
  编译参数在后续升级中要保持一致
sudo /usr/sbin/nginx -V 不仅可以查看版本号,还可以查看nginx的编译参数
sudo nginx -v           只是查看nginx版本号

参数:--with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-YlUNvj/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with-mail_ssl_module

5.用上面编译参数,参数中的版本需要修改
sudo ./configure --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-YlUNvj/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time....

6.编译make,千万别make install
sudo make
make编译完后,在objs目录下就多了个nginx,这个就是新版本的二进制文件

7.备份原本的nginx可执行文件,有助于恢复操作
sudo mv /usr/sbin/nginx /usr/sbin/nginx.bak

8.将新生成nginx执行文件复制到/usr/sbin下
cp /objs/nginx /usr/sbin/nginx

9.检测配置文件是否正确
sudo /usr/sbin/nginx -t

10.重新加载配置文件
sudo nginx -s reload

11.执行升级(通过拷贝替换的方式可以不执行这一步了)
make upgrade

12.查看nginx版本号和编译参数
sudo /usr/sbin/nginx -V

第二种方法会存在很多报错情况,在这里重点记录一下

1.当./configure --with-cc-opt='-g -O2 -fdebug-prefix-map...报错,这种错误都是nginx版本和原来的依赖库版本不对应,要升级依赖库版本

./configure: error: the HTTP rewrite module requires the PCRE library.
./configure: error: the HTTP XSLT module requires the libxml2/libxslt libraries.
./configure: error: the HTTP image filter module requires the GD library.
./configure: error: the HTTP rewrite module requires the PCRE library.
./configure: error: the HTTP cache module requires md5 functions from OpenSSL library.
./configure: error: the GeoIP module requires the GeoIP library.

解决:基本上大差不大,都是重新安装依赖库就可以了
	(当你打 libpcre时按tab看会出现什么东西,因为软件可能和你的不一样)
	 apt-get install libpcre3 libpcre3-dev
	 apt-get install libxslt1-dev
	 apt-get install libgd2-xpm libgd2-xpm-dev
	 apt-get install libpcre3 libpcre3-dev
	 apt-get install libssl-dev openssl
	 apt-get install libgeoip-dev	
2.当编译完成之后,nginx -t检查配置文件时,报其他错误module.so的版本问题
nginx: [emerg] module "/usr/share/nginx/modules/ngx_http_xslt_filter_module.so" version 1014000 instead of 1021004 in /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed

# 备份旧的module
sudo mv /usr/share/nginx/modules/ngx_http_xslt_filter_module.so /usr/share/nginx/modules/ngx_http_xslt_filter_module.so.old
# 拷贝新的module
sudo cp objs/ngx_http_xslt_filter_module.so  /usr/share/nginx/modules/ngx_http_xslt_filter_module.so
其他类似的so文件报错也是大差不差,因为我们./configure modules-path=/usr/lib/nginx/modules编译时候指定了moudules模块,所以直接把老版的so文件备份,从objs目录下拷贝新的so文件到modules目录下即可

最后 
nginx -t               检查配置文件
nginx -s reload        重新加载配置文件
systemctl status nginx 查看nginx运行状态
systemctl start nginx  运行nginx
systemctl stop nginx   通知nginx
<think>首先,用户的问题是关于Nginx平滑升级版本的,具体是“如何在不停止服务的情况下升级Nginx到新版本”。我需要参考提供的引用内容来构建回答。 引用内容总结: - [^1]:介绍了Nginx平滑升级的意义,包括新功能、性能优化和安全修复的重要性。 - [^2]:解释了Nginx平滑升级的原理:启动新进程而不停进程,进程处理完剩余请求后停止。 - [^3]:提供了Red Hat系统上的Nginx平滑升级步骤,包括命令示例。 - [^4]:描述了结束工作进程的步骤,完成升级。 用户的问题核心是操作步骤,所以我应该提供一个清晰的、逐步的指南,基于这些引用。 系统级指令: - 所有行内数学表达式必须用$...$格式。但在这个问题中,没有数学表达式,所以可能不需要。 - 独立公式必须用$$...$$格式并单独成段。同样,这里没有公式。 - LaTeX语法正确:确保任何数学表达正确。 - 使用中文回答:整个回答要用中文。 - 生成相关问题:在回答后,添加相关问题。 - 回答中引用的段落末尾自然地添加引用标识:如[^1],[^2]等。 - 回答结构清晰:帮助用户逐步解决问题,保证真实可靠。 用户可见层: - 回答结构清晰:逐步解决问题。 - 参考站内引用:使用提供的引用内容。 我的回答结构: 1. **引言**:简要解释Nginx平滑升级的意义,基于[^1]。 2. **原理概述**:解释平滑升级的工作原理,基于[^2]。 3. **详细操作步骤**:提供逐步指南,整合[^3]和[^4]的命令。 4. **注意事项**:提醒用户注意事项,如备份、测试等。 5. **相关问题**:生成相关问题。 操作步骤需要详细: - 从[^3]:包括下载新版本、编译、启动新进程等。 - 从[^4]:结束旧进程的命令。 确保回答真实可靠:基于提供的引用,避免添加外部知识。 生成相关问题:基于主题,如升级失败处理、优化等。 最终回答用中文。</think>### Nginx平滑升级版本操作指南 在Web服务运维中,Nginx平滑升级允许您在不中断服务的情况下升级到新版本,这对于生产环境至关重要。平滑升级的原理是:启动新Nginx进程处理新请求,同时旧进程继续处理现有请求直至完成,然后优雅退出[^2]。这确保了服务的连续性和稳定性。本文将基于Linux系统(如Red Hat或类似发行版),提供详细的逐步操作指南。操作前,请务必备份配置文件和数据,并在测试环境中验证,以避免潜在风险。 #### 一、平滑升级的意义 Nginx平滑升级能引入新功能、性能优化和安全修复,同时避免服务中断。这在处理高流量网站时尤为关键,因为任何停机都可能导致用户体验下降或业务损失[^1]。 #### 二、平滑升级原理 - **核心机制**:在不停掉旧进程的情况下,启动新进程。旧进程负责处理剩余请求,但不再接受新请求;新进程接管新请求;旧进程处理完毕后自动停止[^2]。 - **信号控制**:使用Linux信号(如`USR2`、`QUIT`)管理进程切换,确保无缝过渡。 #### 三、详细操作步骤(以升级Nginx 1.25.1为例) 以下步骤假设您已具备root权限,且Nginx安装在`/apps/nginx`目录(路径可能因环境而异,请根据实际调整)。操作前,确保系统已安装编译工具(如gcc、make)。全程服务不中断,用户请求不受影响。 1. **准备工作** - **备份配置和数据**: ```bash cp -r /apps/nginx/conf /apps/nginx/conf_backup # 备份配置文件 cp -r /apps/nginx/html /apps/nginx/html_backup # 备份网站数据 ``` - **下载新版本Nginx**: 访问[Nginx官网](https://nginx.org/en/download.html)下载最新稳定版源码,例如: ```bash wget https://nginx.org/download/nginx-1.25.1.tar.gz tar -zxvf nginx-1.25.1.tar.gz cd nginx-1.25.1 ``` - **编译新版本(添加所需模块)**: 使用旧配置参数(通过`nginx -V`查看),避免配置丢失。例如: ```bash ./configure --prefix=/apps/nginx --with-http_ssl_module # 添加旧版模块,如SSL make # 编译但不安装 ``` 注意:如果升级仅需添加新模块,可复用旧二进制;否则,编译新版本[^2]。 2. **启动新进程并平滑切换** - **替换旧二进制并发送信号**: ```bash mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.old # 备份旧二进制 cp objs/nginx /apps/nginx/sbin/nginx # 复制新二进制 kill -USR2 `cat /apps/nginx/logs/nginx.pid` # 发送USR2信号,启动新主进程[^3] ``` 执行后,系统会并行运行新旧进程: ```bash ps aux | grep nginx # 查看进程,应显示新旧master进程及worker进程[^3] ``` 输出示例: ``` root 8814 0.0 0.2 42460 3760 ? Ss 16:58 0:00 nginx: master process (old) nginx 8957 0.0 0.2 77172 4724 ? S 17:23 0:00 \_ nginx: worker process root 12014 0.0 0.3 42448 5512 ? S 17:32 0:00 nginx: master process (new) nginx 12015 0.0 0.2 77192 4904 ? S 17:32 0:00 \_ nginx: worker process ``` - **验证新进程运行**: 发送测试请求或检查日志: ```bash curl -I http://localhost # 确认服务正常 tail -f /apps/nginx/logs/error.log # 监控错误 ``` 如果新进程未启动(如[^3]所述),重启服务: ```bash systemctl restart nginx # 或 service nginx restart ``` 3. **停止旧进程完成升级** - **优雅退出旧进程**: 等待旧worker处理完所有请求(可通过监控日志或连接数确认),然后发送QUIT信号: ```bash kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin` # 停止旧master进程[^4] ``` 再次检查进程: ```bash ps aux | grep nginx # 应仅剩新进程[^4] ``` 输出示例: ``` root 104103 0.0 0.1 48640 3884 ? S 22:15 0:00 nginx: master process (new) nobody 104104 0.0 0.0 49088 2016 ? S 22:15 0:00 \_ nginx: worker process ``` 4. **清理和验证** - **删除备份**: ```bash rm /apps/nginx/sbin/nginx.old # 可选,清理旧二进制 ``` - **检查版本**: ```bash nginx -v # 应显示新版本号 ``` #### 四、注意事项 - **兼容性问题**:新版本可能引入配置变更,升级前测试`nginx -t`验证配置。 - **回滚方案**:如果升级失败,用备份二进制替换新文件,并重启旧进程。 - **信号说明**:`USR2`用于启动新进程,`WINCH`可让旧worker优雅退出(但非必须),`QUIT`完全停止旧进程[^2][^4]。 - **性能监控**:升级后观察CPU/内存使用,确保无资源泄漏。 - **系统要求**:适用于Linux(如Red Hat、CentOS、Ubuntu),Windows不支持平滑升级。 通过以上步骤,您可以在服务不中断的情况下完成Nginx升级。如果遇到问题,参考Nginx官方文档或社区资源。此方法已在生产环境中广泛应用[^1][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值