当前位置:首页 > 技术 > 正文内容

Nginx服务不停机更新与功能扩展指南

访客 技术 2026年6月5日 1

在生产环境中,Nginx作为高性能的Web服务器和反向代理,其服务的稳定性至关重要。有时我们需要升级Nginx版本以获取新功能或安全补丁,或者集成新的模块来扩展其能力,而这一切都必须在不中断现有业务的前提下进行。Nginx提供了强大的平滑升级机制,允许我们在运行时替换旧的二进制文件,并逐步切换流量到新的进程,从而实现无缝的服务更新。

本文将详细介绍两种在Nginx在线服务状态下进行平滑升级或新增模块的方法:一种是利用make upgrade命令的半自动化方式,另一种是手动发送信号控制进程切换。

准备工作与通用步骤

在开始升级之前,我们需要收集当前Nginx的配置信息,并准备新版本的Nginx源码。

1. 获取当前Nginx的编译参数和版本信息

执行以下命令,记录configure arguments部分。这对于新版本编译时保持原有模块兼容性,或添加新模块时了解现有配置非常重要。

nginx -V
# 示例输出:
# nginx version: nginx/1.14.1
# built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
# configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx

2. 下载新版本的Nginx源码

前往Nginx官方网站(http://nginx.org/en/download.html)下载你希望升级到的Nginx版本源码包。例如,下载nginx-1.18.0.tar.gz

3. 上传并解压源码包

将下载的源码包上传到服务器,并解压到一个合适的目录,例如/usr/local/src/

tar zxf nginx-1.18.0.tar.gz -C /usr/local/src/
cd /usr/local/src/nginx-1.18.0/

4. 编译新版本Nginx(不进行安装)

使用之前获取的configure arguments来配置新版本的编译选项。如果需要添加新模块,可以在此步骤中加入相应的--with-xxx_module参数。

注意: 如果你的configure arguments中包含--with-pcre=/path/to/pcre等外部库路径,请确保这些库在服务器上存在且路径正确。

./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx # 根据实际情况调整参数
make -j $(nproc) # 使用所有可用的CPU核心加速编译过程
echo "编译结果检查 (0表示成功): $?"

5. 备份旧的Nginx二进制文件并替换

在替换之前,务必备份当前的Nginx主程序,以防万一需要回滚。建议备份文件名称带上时间戳以便区分。

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old_$(date +%Y%m%d%H%M) # 备份旧的二进制文件,带时间戳
cp objs/nginx /usr/local/nginx/sbin/nginx # 复制新编译的二进制文件到Nginx安装路径

方法一:使用 make upgrade 实现半自动化平滑升级

这种方法利用Nginx源码包自带的make upgrade命令,它会自动执行一系列操作来完成平滑升级。这是Nginx官方推荐的简便方式。

执行平滑升级命令

在之前编译好的新版本Nginx源码目录下执行make upgrade。此命令将自动测试新配置、发送信号给旧主进程以启动新主进程、等待新进程启动,并最终关闭旧的工作进程。

cd /usr/local/src/nginx-1.18.0/ # 确保你在新版本源码目录下
make upgrade
# make upgrade 命令的执行过程大致如下(输出可能因版本而异):
# /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
# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` # 向旧主进程发送USR2信号,启动新的主进程
# sleep 1                                  # 等待新进程启动
# test -f /usr/local/nginx/logs/nginx.pid.oldbin # 检查旧主进程的PID文件是否已备份
# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin` # 向旧主进程发送QUIT信号,使其优雅关闭

方法二:手动发送信号进行平滑升级

如果你更喜欢手动控制每个步骤,或者make upgrade命令因某种原因不可用,可以采用手动发送信号的方式。这种方法更能让你理解Nginx平滑升级的底层原理。

1. 检查新配置文件语法

在替换Nginx二进制文件后,首先使用新二进制文件验证现有配置文件的语法是否正确。

/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

2. 启动新的Nginx主进程

向当前正在运行的Nginx旧主进程发送USR2信号。这会指示旧的主进程启动一个新的主进程,新主进程会加载新的二进制文件和配置文件,并启动新的工作进程。旧的主进程会将其PID文件重命名为.oldbin

# 获取当前Nginx主进程PID
OLD_NGINX_PID=$(cat /usr/local/nginx/logs/nginx.pid)
kill -USR2 $OLD_NGINX_PID
sleep 1 # 稍作等待,确保新进程有时间启动

3. 检查新旧进程状态

此时,系统中有新旧两个Nginx主进程及其各自的工作进程在运行。可以通过ps aux命令观察。

ps aux | grep nginx | grep -v grep
# 预期会看到两个Nginx主进程(一个指向旧的二进制文件,一个指向新的)
# root       XXXX  0.0  0.0  XXXXX  XXXX ?        S    HH:MM   0:00 nginx: master process /usr/local/nginx/sbin/nginx.old_XXXXXXXXXX
# nginx      YYYY  0.0  0.0  XXXXX  XXXX ?        S    HH:MM   0:00 nginx: worker process
# root       ZZZZ  0.0  0.0  XXXXX  XXXX ?        S    HH:MM   0:00 nginx: master process /usr/local/nginx/sbin/nginx
# nginx      AAAA  0.0  0.0  XXXXX  XXXX ?        S    HH:MM   0:00 nginx: worker process

同时,旧的PID文件应该已经更名为.oldbin

test -f /usr/local/nginx/logs/nginx.pid.oldbin && echo "旧PID文件已更名" || echo "旧PID文件未找到,升级可能异常"

4. 平滑关闭旧的工作进程

当确认新的Nginx进程已正常接管流量后,可以向旧的主进程发送QUIT信号,使其优雅地关闭其所有工作进程。如果希望旧的工作进程先停止接受新连接,只处理完现有连接,可以先发送WINCH信号,等待其工作进程处理完毕后,再发送QUIT信号来完全关闭旧主进程。

OLD_MASTER_PID_OLD_BIN=$(cat /usr/local/nginx/logs/nginx.pid.oldbin)

# 方式A: 直接优雅关闭旧主进程及其所有工作进程 (最常用)
kill -QUIT $OLD_MASTER_PID_OLD_BIN

# 方式B: (可选) 先停止旧工作进程接收新连接 (WINCH), 等待一段时间后再完全关闭旧主进程 (QUIT)
# kill -WINCH $OLD_MASTER_PID_OLD_BIN
# echo "旧工作进程已停止接受新连接,等待现有连接处理完毕..."
# sleep 60 # 根据业务负载等待足够时间,确保旧连接处理完成
# kill -QUIT $OLD_MASTER_PID_OLD_BIN

在发送QUIT信号后,旧的Nginx进程将不再存在。

验证升级结果

无论采用哪种方法,升级完成后都应进行详细的验证。

1. 检查Nginx进程状态

确认只有一个Nginx主进程和其工作进程在运行,并且主进程是使用新的二进制文件启动的。

ps aux | grep nginx | grep -v grep

2. 验证Nginx版本和配置参数

使用nginx -V命令检查当前运行的Nginx版本和编译参数,确保与新编译的版本一致,并且包含所有期望的模块。

/usr/local/nginx/sbin/nginx -V
# 确认 nginx version: nginx/1.18.0 (或你升级到的版本)
# 确认 configure arguments 包含你期望的所有参数和新模块

3. 测试服务连通性

通过访问网站或使用curl命令测试Nginx是否正常提供服务,确保业务不受影响。

curl -I http://your_domain.com

或者直接在浏览器中访问你的Nginx服务,检查功能是否正常。

标签: NginxWeb Server

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。