2017-03-04 15 views
2

私たちはドッカークラウドサービスのリバースプロキシとしてNginxを使用しています。新しいサービスがドッカークラウドにデプロイされるたびに、またはサービスがドッカークラウド上に新しいURLを取得すると、Nginxの設定ファイルを更新するスクリプトが実装されます。Nginx設定ファイルをコンテナ内にゼロダウンタイムで更新する

Nginxとスクリプトは、ドッカーコンテナで別々に実行されています。 Nginx設定ファイルは、ホスト(ECS)にマウントされています。スクリプトを使って設定ファイルを更新したら、変更を適用するためにNginxをリロードする必要があります。

最初に、これがNginx設定ファイルを更新する最善の方法であるかどうか、そしてNothingをダウンタイムなしでリロードする最善の方法は何ですか?

Nginxコンテナを更新するたびに再作成しますか?もしそうなら、どうですか?

または(スクリプトを使用して)設定ファイルの変更を監視して、Nginxをホストからリロードして、下のコマンドで再ロードしても問題ありませんか?

docker exec NginxcontainerID | nginx -s reload  

答えて

6

私はそれぞれの更新後にnginxのコンテナを作成し直しましょうか?もしそうなら、どうですか?

いいえ、ほとんどの場合、nginxサービスをリロードするだけです。 あなたが使用することができます。

docker exec nginxcontainername/id nginx -s reload 

または

docker kill -s HUP nginxcontainername/id 

別のオプションをカスタムイメージを使用することにし、nginxの設定チェックサムをチェックし、それが変化し、これまでときのnginxをリロードします。スクリプト例:

nginx "[email protected]" 
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パッケージをインストールする必要があります。

+0

返信いただきありがとうございます。それは助けました。私はあなたが高可用性のNginxコンテナ、フェールオーバーのためのアーキテクチャを持つための最善の方法は何か知っているのだろうか?私はこの質問の下でそれを尋ねましたが、まだ返事がありませんでした。 http://stackoverflow.com/questions/41379428/how-to-set-up-two-nginx-containers-as-a-reverse-proxy-in-an-active-passive-set-u – Matrix

関連する問題