在容器中更新Nginx配置文件,停机时间为零

时间:2017-03-04 16:44:50

标签: nginx docker-container docker-cloud

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

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

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

每次更新后我都要重新创建Nginx容器吗?如果是这样,怎么样?

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

docker exec NginxcontainerID | nginx -s reload    

1 个答案:

答案 0 :(得分:7)

  

每次更新后我都要重新创建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包。