2017-09-28 9 views
1

私は、静的ファイルを提供するためにkubernetesクラスタに展開されたnginx podを持っています。さまざまな環境で特定のヘッダーを設定するには、envsubstを使用してnginxを実行する前に、テンプレートから設定ファイルを生成するofficial nginx docker image docsの指示に従ってください。confの生成時に無限リダイレクトを行っているkubernetesドッカーのNginx

これは私のnginxのテンプレート(nginx.conf.template)である:私が最初にnginxのを開始する前に、nginxのconfのファイルを生成するKubernetesのdefault command override機能を使用

events { 
    worker_connections 1024; 
} 

http { 

    include mime.types; 
    default_type application/octet-stream; 
    sendfile on; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 

    gzip on; 

    server { 
    listen 443 ssl; 

    ssl_certificate /etc/nginx/ssl/nginx.crt; 
    ssl_certificate_key /etc/nginx/ssl/nginx.key; 

    root /usr/share/nginx/html; 

    #charset koi8-r; 
    #access_log /var/log/nginx/log/host.access.log main; 

    location ~ \.css { 

     add_header Content-Type text/css; 
    } 

    location ~ \.js { 

     add_header Content-Type application/x-javascript; 
    } 

    location/{ 
     add_header x-myapp-env $MYAPP_ENV; 
     index index.html index.htm; 
     try_files $uri $uri/ /index.html; 
    } 

    #error_page 404    /404.html; 

    # redirect server error pages to the static page /50x.html 
    # 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 

     root /usr/share/nginx/html; 
    } 
    } 

    server { 
    listen  80; 
    server_name _; 
    return 301 https://$host$request_uri; 
    } 
} 

。これは、設定の関連部分である:私は私のブラウザでERR_TOO_MANY_REDIRECTSエラーを取得する要求を行う際に

command: ["/bin/sh"] 
args: ["-c", "envsubst </etc/nginx/nginx.conf.template> /etc/nginx/nginx.conf && nginx -g 'daemon off;'" ] 

Kubernetesが正常しかし、ポッドを展開します。

奇妙なことに、奇妙なことに、上記の(しかしadd_headerディレクティブを除いて)ほぼ同じnginx.confを使用してコマンドオーバーライドを実行せずにコンテナをデプロイすると、うまく動作します。

感謝すべてのヘルプ(すべてのSSL証明書とファイルがそこには問題があってはならないので、喜んでビルド時にコンテナにコピーされて提供されます)。

+0

nginxログには何がありますか? – kichik

答えて

2

私はenvsubstreturn 301 https://;try_files//index.html;return 301 https://$host$request_uri;try_files $uri $uri/ /index.html;を作ることによって、あなたを噛んされるかなり確信しています。この結果、リダイレクトのループが発生します。

代わりにenvsubst '$MYAPP_ENV' <template >nginx.confを実行することをおすすめします。それは、意図しない変数ではなく、その単一の変数を置き換えます。 (サンプルコマンドで変数の周りにエスケープすることに注意してください!)後で変数を追加する必要がある場合は、envsubsts '$VAR1$VAR2$VAR3'のようにそれらをすべて指定できます。それは質問で尋ねていない間、あなたが... && exec nginx -g 'daemon off;'を使って、自分自身にいくつかの手間を省くことができ、また

envsubst `declare -x | sed 's/^declare -x \([^=]*\)=.*/$\1/' | tr -d '\n'` <template >nginx.conf 

は、あなたがこのスニペットを使用することができますすべての環境変数を置き換えたい場合。 execは実行中のシェル(pid 1)をフォークする代わりにnginxプロセスに置き換えます。これは、シグナルがnginxなどで受信されることを意味します。

+0

それは問題のようです。修正を押して今しようとしました – harryg

+0

それはトリックでした。ご協力いただきありがとうございます – harryg

関連する問題