5

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

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

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

每次更新后我应该重新创建 Nginx 容器吗?如果是这样,如何?

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

docker exec NginxcontainerID | nginx -s reload    
4

1 回答 1

10

每次更新后我应该重新创建 Nginx 容器吗?如果是这样,如何?

不,你大部分时间只需要重新加载 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软件包。

于 2017-03-05T06:44:36.833 回答