2016-08-26 3 views
2

Ich benutze nginx mit docker-compose und wollen docker-composeSERVER_NAME-nginx als Umgebungsvariable zu übergeben. Ich habe die folgende nginx Konfigurationsdatei:nginx „env“ Richtlinie ist hier nicht erlaubt

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 
    } 
} 

Aus irgendeinem Grund nginx ist über diese env Richtlinie Fluchen:

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

Hier ist meine Dockerfile, wo Sie, dass diese Konfiguration sehen wird als nginx Standardseite verwendet:

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;"] 

Warum?


ANTWORT: Lassen Sie mich exlain, was das Problem im Detail war. myconf.conf Datei wurde als /etc/nginx/sites-available/default verwendet, die nicht die root nginx Config ist. Die Wurzel nginx Config ist nginx.conf und umfasst /etc/nginx/sites-available/default in http Kontext:

http { 

    ... 
    ## 
    # Virtual Host Configs 
    ## 

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

so meine env Aussage ist in der Tat in http Kontext, was falsch ist - es sollte nur in Stammkontext geschrieben werden.

+0

möglich Duplikat http://serverfault.com/questions/577370/how-can-i-use-Umgebungsvariablen-in-nginx-conf –

+0

@ivan_pozdeev Ich habe diesen Beitrag 10 mal gelesen - es gibt keine direkte Antwort. Es scheint, als wäre nichts mit 'env' in meiner Konfiguration falsch, es ist nur nginx durcheinander, so dass es seine eigenen Anweisungen aus dem Kernmodul nicht erkennt: http://stackoverflow.com/questions/15416957/using-variables-in -nginx-Standortregeln –

+0

Wenn Sie speziell daran interessiert sind, was mit Ihrer Konfiguration nicht stimmt, was Sie tun sollen, hier ist eine Antwort ... –

Antwort

2

https://bot.ngx.cc/logs/%23nginx/2015/01-January/%23nginx.01-31.log (gegoogelt mit "nginx bug" env Direktive ist hier nicht erlaubt "") hat mir die Antwort gegeben.

Wie durch die Anwesenheit der server directive , bezeugt ist dies Ihre Hauptkonfigurationsdatei nicht, sondern ein Stück aufgenommen werden, höchstwahrscheinlich in den httpcontext. Während env nur im main Kontext gültig ist.


als Link zeigt, gibt es einige Arten der server Richtlinie, von denen keiner im main Kontext gültig sind

+0

Ivan, du hast Recht! Ich habe "/ etc/nginx/sites-available/default" durch dieses Skript ersetzt, aber es wird tatsächlich von nginx.conf im "http" -Kontext importiert. Ich hätte 'nginx.conf' anstelle von default ändern sollen. Danke vielmals! –

Verwandte Themen