nginx热部署-在线更新和回滚

本文详细介绍了如何在系统中进行Nginx的热部署,包括新版本的编译、在线升级过程,以及在升级失败情况下的热回滚步骤,确保服务的连续性和稳定性。

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

系统中已经运行了一个版本的nginx的进程:

1、编译生成心得可执行程序
tar zxf nginx-1.16.0.tar.gz
vim auto/cc/gcc
./configure --prefix=/usr/local/nginx --with-file-aio
make 只make不安装

2、在线升级
cd ~/nginx-1.16.0/objs
cp -f nginx /usr/local/nginx/sbin/nginx
ps -ef | grep nginx


root 18034 1 0 10:45 ? 00:00:00 nginx: master process nginx
nginx 18035 18034 0 10:45 ? 00:00:00 nginx: worker process
nginx 18036 18034 0 10:45 ? 00:00:00 nginx: worker process
root 18232 1406 0 10:48 pts/0 00:00:00 grep --color=auto nginx


kill -USR2 18034(master进程) //使worker不在接收请求,同时打开新版本的nginx的master进程,和它的两个线程,实现热升级
ps -ef | grep nginx //旧版进程和新版进程同时存在


root 18034 1 0 10:45 ? 00:00:00 nginx: master process nginx
nginx 18035 18034 0 10:45 ? 00:00:00 nginx: worker process
nginx 18036 18034 0 10:45 ? 00:00:00 nginx: worker process
root 18126 18034 0 10:46 ? 00:00:00 nginx: master process nginx
nginx 18127 18126 0 10:46 ? 00:00:00 nginx: worker process
nginx 18128 18126 0 10:46 ? 00:00:00 nginx: worker process
root 18232 1406 0 10:48 pts/0 00:00:00 grep --color=auto nginx


kill -WINCH 18034 //关闭旧版本master进程的两个worker线程
ps -ef | grep nginx //旧版本的两个worker线程已经关闭


root 18034 1 0 10:45 ? 00:00:00 nginx: master process nginx
root 18126 18034 0 10:46 ? 00:00:00 nginx: master process nginx
nginx 18127 18126 0 10:46 ? 00:00:00 nginx: worker process
nginx 18128 18126 0 10:46 ? 00:00:00 nginx: worker process
root 18829 1406 0 11:00 pts/0 00:00:00 grep --color=auto nginx


/usr/local/nginx/sbin/nginx -V //查看此时的nginx版本为 nginx/1.16.0

注:新版本上线完成后不要结束原来的master进程,防止上线失败需要版本回退;若完全成功后,便可结束原master进程

3、热回退:若上线失败,需在线回退为原来的版本
cd ~/nginx-1.17.1/objs
cp -f nginx /usr/local/nginx/sbin/nginx
kill -UIP 18034 //唤醒旧版本的master进程,使之产生新的worker线程
ps -ef | grep nginx


root 18034 1 0 10:45 ? 00:00:00 nginx: master process nginx
root 18126 18034 0 10:46 ? 00:00:00 nginx: master process nginx
nginx 20016 18126 0 11:24 ? 00:00:00 nginx: worker process
nginx 20017 18126 0 11:24 ? 00:00:00 nginx: worker process
nginx 20146 18034 0 11:26 ? 00:00:00 nginx: worker process
nginx 20147 18034 0 11:26 ? 00:00:00 nginx: worker process
root 20275 1406 0 11:28 pts/0 00:00:00 grep --color=auto nginx


kill -USR2 18126 //新版本的master进程的worker线程不再接收新的用户请求,使回退版本的worker进程接收新的用户请求。
ps -ef | grep nginx


root 18034 1 0 10:45 ? 00:00:00 nginx: master process nginx
root 18126 18034 0 10:46 ? 00:00:00 nginx: master process nginx
nginx 20016 18126 0 11:24 ? 00:00:00 nginx: worker process
nginx 20017 18126 0 11:24 ? 00:00:00 nginx: worker process
nginx 20146 18034 0 11:26 ? 00:00:00 nginx: worker process
nginx 20147 18034 0 11:26 ? 00:00:00 nginx: worker process
root 20626 1406 0 11:35 pts/0 00:00:00 grep --color=auto nginx


kill -WINCH 18126 //关闭新版本master进程的两个worker进程
ps -ef | grep nginx //新版本的两个worker线程已经关闭


root 18034 1 0 10:45 ? 00:00:00 nginx: master process nginx
root 18126 18034 0 10:46 ? 00:00:00 nginx: master process nginx
nginx 20146 18034 0 11:26 ? 00:00:00 nginx: worker process
nginx 20147 18034 0 11:26 ? 00:00:00 nginx: worker process
root 20734 1406 0 11:38 pts/0 00:00:00 grep --color=auto nginx


kill -9 18126 //回退完成后可以结束掉新版本的master进程

<think>好的,用户现在的情况是,他们原本的Nginx安装在`/www/server/nginx`目录下,现在又在`/root/nginx/nginx-1.26.3`目录下安装了一个新版本的Nginx,想知道如何使用这个新安装的Nginx。我需要仔细分析用户的需求,然后给出合适的解决方案。 首先,用户可能是在尝试升级Nginx的版本,或者在测试新版本的功能,同时希望保留旧版本作为备份。他们可能希望在不影响现有服务的情况下切换到新版本,或者在需要时可以快速回滚到旧版本。用户提到的路径中,新版本的Nginx安装在`/root/nginx/nginx-1.26.3`,这可能是一个通过源代码编译安装的目录,而不是通过包管理器安装的。因此,用户可能需要指导如何正确启动新版本的二进制文件,或者替换旧版本的位置。 接下来,我需要考虑用户可能的操作步骤。用户可能已经编译安装了新版本的Nginx,但还没有正确配置或启动它。可能需要检查新版本的Nginx是否已经正确编译,是否包含必要的模块,以及配置文件是否兼容。此外,用户可能希望将新版本的Nginx设置为默认使用的版本,或者通过符号链接来切换版本,或者直接启动新版本的二进制文件,同时停止旧版本的服务。 然后,我需要回顾之前提供的解决方案,看看哪些方法适用于当前用户的情况。在之前的回复中,提到了四种方法:直接替换二进制文件、符号链接切换、平滑升级容器化部署。用户现在的情况可能适用前两种方法,尤其是如果用户希望保留旧版本或者需要快速切换的话。另外,用户可能不希望停机,所以平滑升级也是一个选项,但需要确认新版本是否支持热升级。 考虑到用户的具体路径,可能需要指导用户如何正确启动新版本的二进制文件,同时确保配置文件路径正确。例如,新版本的Nginx可能安装在`/root/nginx/nginx-1.26.3/sbin/nginx`,而旧版本在`/www/server/nginx/sbin/nginx`。用户可能需要停止旧服务,启动新服务,并指定正确的配置文件路径。此外,用户可能需要处理可能存在的端口冲突,如果新旧实例同时运行的话。 另外,用户可能需要知道如何验证新版本是否正常运行,如何检查进程状态,以及如何确保服务在重启后仍然使用新版本。可能还需要指导用户如何设置系统服务文件(如systemd unit文件)来管理新版本的Nginx,以确保开机自启动等。 还需要注意权限问题,因为新版本的Nginx安装在`/root`目录下,可能需要确保Nginx进程有权限访问必要的文件端口,特别是如果用户以非root身份运行Nginx的话。此外,编译安装的Nginx可能需要手动设置环境变量或路径,以便系统能够找到正确的二进制文件。 总结用户的可能需求:正确启动新版本的Nginx,替换或与旧版本并存,确保配置正确,处理权限端口冲突,设置服务管理,以及验证运行状态。需要分步骤详细说明,确保用户能够安全地切换,并理解每个步骤的作用,以便在出现问题时进行排查。</think>--- ### **操作步骤** 若你已编译安装新版本 Nginx 到 `/root/nginx/nginx-1.26.3`,需切换到该版本,以下是具体方法: --- ### **方法 1:直接启动新版本(旧版本并存)** #### **适用场景** - 新旧版本需临时共存(例如测试新版本)。 - 需保留旧版本作为备用。 #### **操作步骤** 1. **停止旧版本服务**: ```bash # 通过旧版二进制文件停止服务 /www/server/nginx/sbin/nginx -s stop # 或直接 kill 进程 kill $(cat /www/server/nginx/logs/nginx.pid) ``` 2. **启动新版本 Nginx**: ```bash # 指定新版本二进制文件配置文件 /root/nginx/nginx-1.26.3/sbin/nginx -c /www/server/nginx/conf/nginx.conf ``` 3. **验证进程**: ```bash ps aux | grep nginx # 应显示新二进制路径:/root/nginx/nginx-1.26.3/sbin/nginx ``` --- ### **方法 2:替换旧版本符号链接** #### **适用场景** - 希望全局默认使用新版本。 - 旧版本通过符号链接管理(例如 `/usr/bin/nginx` 指向旧路径)。 #### **操作步骤** 1. **备份旧版本符号链接**(如有): ```bash mv /usr/sbin/nginx /usr/sbin/nginx.old ``` 2. **创建新符号链接**: ```bash ln -s /root/nginx/nginx-1.26.3/sbin/nginx /usr/sbin/nginx ``` 3. **重启服务**: ```bash # 停止旧进程(若仍在运行) nginx -s stop # 启动新进程 nginx -c /www/server/nginx/conf/nginx.conf ``` --- ### **方法 3:平滑升级(新旧版本共存)** #### **适用场景** - 新旧版本兼容,需零停机切换。 - 需逐步迁移请求到新进程。 #### **操作步骤** 1. **启动新版本主进程**: ```bash # 使用旧版配置文件启动新二进制 /root/nginx/nginx-1.26.3/sbin/nginx -c /www/server/nginx/conf/nginx.conf ``` 2. **向旧进程发送升级信号**: ```bash kill -USR2 $(cat /www/server/nginx/logs/nginx.pid) ``` 3. **关闭旧工作进程**: ```bash kill -WINCH $(cat /www/server/nginx/logs/nginx.pid.oldbin) ``` 4. **验证请求处理**: ```bash # 检查新进程是否接管请求 curl -I http://localhost ``` 5. **完全停止旧主进程**(可选): ```bash kill -QUIT $(cat /www/server/nginx/logs/nginx.pid.oldbin) ``` --- ### **方法 4:修改系统服务配置** #### **适用场景** - 旧版本通过 Systemd 管理(例如 `nginx.service`)。 - 需永久切换到新版本。 #### **操作步骤** 1. **编辑 Systemd 服务文件**: ```bash vim /etc/systemd/system/nginx.service ``` 2. **修改 ExecStart 路径**: ```ini [Service] ExecStart=/root/nginx/nginx-1.26.3/sbin/nginx -c /www/server/nginx/conf/nginx.conf ``` 3. **重载配置并重启服务**: ```bash systemctl daemon-reload systemctl restart nginx ``` --- ### **关键注意事项** 1. **配置文件兼容性**: - 新旧版本配置语法可能不兼容,需提前测试: ```bash /root/nginx/nginx-1.26.3/sbin/nginx -t -c /www/server/nginx/conf/nginx.conf ``` 2. **端口冲突**: - 若新旧版本同时运行,需确保监听端口不同(例如临时测试时修改 `listen 8080`)。 3. **日志与 PID 文件路径**: - 新版本默认可能写入 `/root/nginx-1.26.3/logs/`,若需统一路径,需在配置中指定: ```nginx error_log /www/server/nginx/logs/error.log; pid /www/server/nginx/logs/nginx.pid; ``` --- ### **总结** - **临时测试**:直接启动新二进制文件,保留旧版本进程。 - **长期使用**:通过符号链接或 Systemd 服务配置永久切换。 - **无缝切换**:优先使用平滑升级(需版本兼容性支持)。 - **核心原则**:操作前备份配置,验证语法,监控服务状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值