以零停机时间更新容器中的 Nginx 配置文件

Update Nginx config file in a container with zero down time

我们使用 Nginx 作为 docker-云服务的反向代理。每当在 docker 云上部署新服务或在 docker-云上获得新服务 url 时,都会实施一个脚本来更新 Nginx 的配置文件。

Nginx 和脚本分别 运行 在 docker 容器中。 Nginx 配置文件挂载在主机(ECS)中。使用脚本更新配置文件后,需要重新加载 Nginx 才能应用更改。

首先,我想知道这是否是更新 Nginx 配置文件的最佳方式,以及在不停机的情况下重新加载 Nginx 的最佳方式是什么?

我应该在每次更新后重新创建 Nginx 容器吗?如果可以,怎么做?

或者通过监视配置文件中的更改(使用脚本)从主机重新加载 Nginx 并使用以下命令重新加载它可以吗?

docker exec NginxcontainerID | nginx -s reload    

Shall I recreate the Nginx container after each update? if so, how?

不,大多数时候你只需要重新加载nginx服务。 您可以使用:

docker exec nginxcontainername/id nginx -s reload

docker kill -s HUP nginxcontainername/id 

另一个选项 将使用自定义图像并检查 nginx 配置校验和并在它发生变化时重新加载 nginx。示例脚本:

nginx "$@"
oldcksum=`cksum /etc/nginx/conf.d/default.conf`

inotifywait -e modify,move,create,delete -mr --timefmt '%d/%m/%y %H:%M' --format '%T' \
/etc/nginx/conf.d/ | while read date time; do

    newcksum=`cksum /etc/nginx/conf.d/default.conf`
    if [ "$newcksum" != "$oldcksum" ]; then
        echo "At ${time} on ${date}, config file update detected."
        oldcksum=$newcksum
        nginx -s reload
    fi

done

您需要安装 inotifywait 包。