2016-08-26 5 views
2

私はdocker-composenginxを使用してdocker-composeは、環境変数としてnginxSERVER_NAMEを渡したい許可されていません。私は、次のnginxの設定ファイル作成:何らかの理由でnginxの「ENV」ディレクティブは、ここで

myconf.conf:

# Environment variables are used to dynamically set SERVER_NAME 
# from docker-defined environment variable. This logic is stolen from: 
# 
# https://docs.apitools.com/blog/2014/07/02/using-environment-variables-in-nginx-conf.html 
# https://github.com/wantedly/nginx-image-server/blob/master/files/nginx.conf 

env SERVER_NAME; 

upstream django { 
    server workflows-django:8000; 
} 

server { 
    listen 80; 
    perl_set $server_name_from_env 'sub { return $ENV{"SERVER_NAME"}; }'; 
    server_name $server_name_from_env; 
    return 301 https://$server_name$request_uri; 
} 

server { 
    listen 443 ssl; 
    perl_set $server_name_from_env 'sub { return $ENV{"SERVER_NAME"}; }'; 

    server_name $server_name_from_env; 
    ssl_certificate /etc/ssl/private/bostongene.crt; 
    ssl_certificate_key /etc/ssl/private/bostongene.key; 
    charset utf-8; 

    client_max_body_size 75M; 

    location /media { 
     alias /srv/workflows/media; 
    } 

    location /static { 
     alias /srv/workflows/static; 
    } 

    location/{ 
     # We can talk to upstream django either via uwsgi or just http proxy 

     # uwsgi: 
     uwsgi_pass django; 
     include /etc/nginx/uwsgi_params; 


     # http proxy: 
     #proxy_set_header Host $host; 
     #proxy_pass http://django 
    } 
} 

を、nginxのことenvディレクティブについて罵倒さ:

2016/08/26 13:02:39 [emerg] 1#0: "env" directive is not allowed here in /etc/nginx/sites-enabled/default:7 

は、ここでは、この設定を見ることができる私のDockerfile、ですnginxのデフォルトサイトとして使用されます:

Dockerfile:

FROM debian:latest 

RUN apt-get update && apt-get install -y nginx \ 
         ca-certificates \ 
         gettext-base 

COPY myconf.conf /etc/nginx/sites-available/default 
COPY myconf.crt /etc/ssl/private/ 
COPY myconf.key /etc/ssl/private/ 

# forward request and error logs to docker log collector 
RUN ln -sf /dev/stdout /var/log/nginx/access.log \ 
    && ln -sf /dev/stderr /var/log/nginx/error.log 

EXPOSE 80 443 

CMD ["/usr/sbin/nginx", "-g", "daemon off;"] 

なぜですか?


ANSWER:私をexlainせ、詳細に問題が何でしたか。 myconf.confファイルが/etc/nginx/sites-available/defaultとして使用されましたが、これはrootのnginx設定ではありません。ルートnginxの設定ファイルがnginx.confであり、それはhttp文脈で/etc/nginx/sites-available/defaultが含まれています - それは唯一のルートコンテキストで記述する必要があります

http { 

    ... 
    ## 
    # Virtual Host Configs 
    ## 

    include /etc/nginx/conf.d/*.conf; 
    include /etc/nginx/sites-enabled/*; 
} 

ので、私のenvステートメントが間違っていhttp文脈で実際にあります。

+0

可能mainコンテキストで有効ないずれもserverディレクティブのいくつかの種類があります/ 577370/how-can-i-use-environment-variables-in-nginx-conf –

+0

@ivan_pozdeev私はその記事を10回以上読んだことがあります。私の設定で 'env'に何も問題がないように思えます。ちょうどnginxがコアモジュールからの独自のディレクティブを認識しないように乱れています:http://stackoverflow.com/questions/15416957/using-variables-in -nginx-location-rules –

+0

あなたがするべきことではなく、あなたの設定に間違っていることに特に興味があるなら、ここに答えがあります... –

答えて

2

https://bot.ngx.cc/logs/%23nginx/2015/01-January/%23nginx.01-31.log(ここでは "nginx bug" envディレクティブは許可されていません。 ")が私に答えを与えました。

としてはserver directive の存在によって証言、これはあなたのメインの設定ファイルはありませんが、チャンクは、おそらくhttpcontextで、含まれます。 envmainコンテキストでのみ有効です。リンクが示すように


、http://serverfault.com/questionsの重複

+0

イワン、そうです!私は '/ etc/nginx/sites-available/default'をこのスクリプトで置き換えましたが、' http'コンテキストのnginx.confによって実際にインポートされています。デフォルトの代わりに 'nginx.conf'を修正しておきます。どうもありがとう! –

関連する問題