大电 發表於 2025-9-22 09:27:13

在Docker中实现Nginx平滑重启的几种方法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 使用标准的 reload 命令(推荐)</a></li><li><a href="#_label1">2. 使用 docker-compose 重启</a></li><li><a href="#_label2">3. 完整的无感重启脚本</a></li><li><a href="#_label3">4. 使用健康检查确保重启成功</a></li><li><a href="#_label4">5. 零停机部署策略</a></li><li><a href="#_label5">注意事项</a></li></ul></div><p>在 Docker 中实现 Nginx 无感重启(平滑重启)的几种方法:</p>
<p class="maodian"><a name="_label0"></a></p><h2>1. 使用标准的 reload 命令(推荐)</h2>
<p>您当前使用的方式是正确的,这是最标准的做法:</p>
<div class="jb51code"><pre class="brush:bash;"># 检查配置文件语法
docker exec agi-nginx nginx -t

# 平滑重启(无中断服务)
docker exec agi-nginx nginx -s reload
</pre></div>
<p>这种方式会:</p>
<ul><li>主进程重新加载配置</li><li>启动新的工作进程处理新请求</li><li>优雅关闭旧的工作进程(等待现有连接完成)</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>2. 使用 docker-compose 重启</h2>
<p>如果使用 docker-compose:</p>
<div class="jb51code"><pre class="brush:bash;"># 重启单个容器
docker-compose restart nginx

# 或者重新创建容器(会读取最新配置)
docker-compose up -d --force-recreate nginx
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 完整的无感重启脚本</h2>
<div class="jb51code"><pre class="brush:bash;">#!/bin/bash

CONTAINER_NAME="agi-nginx"

# 检查配置语法
if docker exec $CONTAINER_NAME nginx -t; then
    echo "配置文件检查通过,开始平滑重启..."

    # 发送 reload 信号
    docker exec $CONTAINER_NAME nginx -s reload

    # 等待重启完成
    sleep 2

    # 检查 Nginx 状态
    docker exec $CONTAINER_NAME nginx -t
    echo "Nginx 平滑重启完成"
else
    echo "配置文件有错误,请检查配置"
    exit 1
fi
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 使用健康检查确保重启成功</h2>
<p>在 docker-compose.yml 中添加健康检查:</p>
<div class="jb51code"><pre class="brush:yaml;">version: "3"
services:
nginx:
    image: nginx:latest
    container_name: agi-nginx
    ports:
      - "80:80"
      - "443:443"
    healthcheck:
      test: ["CMD", "nginx", "-t"]
      interval: 30s
      timeout: 10s
      retries: 3
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>5. 零停机部署策略</h2>
<p>对于生产环境,可以考虑:</p>
<div class="jb51code"><pre class="brush:bash;"># 蓝绿部署
# 1. 启动新版本的 Nginx 容器
docker run -d --name nginx-new nginx:new-version

# 2. 逐步将流量切换到新容器
# 3. 停止旧容器
docker stop agi-nginx
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>注意事项</h2>
<ol><li><strong>配置文件位置</strong>:确保配置文件通过 volume 挂载,这样修改后立即生效</li><li><strong>日志文件</strong>:确保日志文件也通过 volume 挂载,避免重启丢失日志</li><li><strong>SSL 证书</strong>:如果使用 SSL,确保证书文件正确挂载</li><li><strong>连接保持</strong>:配置中设置 <code>worker_shutdown_timeout</code> 确保优雅关闭</li></ol>
<div class="jb51code"><pre class="brush:plain;"># nginx.conf 中的相关配置
worker_processes auto;
worker_shutdown_timeout 30s;# 优雅关闭超时时间

events {
    worker_connections 1024;
}

http {
    # 其他配置...
}
</pre></div>
<p>您当前使用的方式 <code>docker exec agi-nginx nginx -s reload</code> 是最推荐的做法,它确实实现了无感重启。</p>
<p>到此这篇关于在Docker中实现Nginx平滑重启的几种方法的文章就介绍到这了,更多相关Nginx平滑重启方法内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁: [1]
查看完整版本: 在Docker中实现Nginx平滑重启的几种方法