2016-07-11 13 views
0

Ich richte ein Docker-Image mit installiertem nginx-lua ein. Das Szenario besteht in einer Standardauthentifizierung für die Bereitstellung, nicht jedoch für die Produktion. Meine Idee war, eine ENV-Variable mit dem Namen der Bühne zu haben und den Wert in der nginx.conf-Datei zu überprüfen.NGINX-Basisauthentifizierung basierend auf Umgebungsvariable

Der Inhalt der docker-compose.yml-Datei (für die Inszenierung und für die Produktion wird die Bühne env prod natürlich):

docs-router: 
    build: ./nginx 
    environment: 
    - API_BASE_URI=staging.example.com 
    - DOCS_STATIC_URI=docs-staging.example.com 
    - STAGE=staging 
    ports: 
    - "8089:8089" 
    - "8090:8090" 

Der Inhalt der nginx.conf Datei:

... 

env API_BASE_URI; 
env DOCS_STATIC_URI; 
env STAGE; 

... 

http { 
    server { 
    listen 8089 default_server; 
    charset utf-8; 
    resolver 8.8.8.8; 
    access_log off; 

    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    location ~ ^(/.*\.(?:apib|svg))?$ { 
     set_by_lua_block $api_base_uri { return os.getenv("API_BASE_URI") } 
     set_by_lua_block $stage { return os.getenv("STAGE") } 
     set $unprotected "prod"; 

     if ($stage = $unprotected) { 
     auth_basic "Restricted Content"; 
     auth_basic_user_file /etc/nginx/.htpasswd; 
     } 

     proxy_pass https://$api_base_uri$1; 
     proxy_set_header Host $api_base_uri; 
    } 

    ... 

    } 

} 

Aber es ist funktioniert nicht. Irgendeine Idee, wie kann ich das erreichen?

+0

Also was ist Ihre Frage? –

+0

Diese Konfiguration funktioniert nicht und ich würde gerne wissen, dass meine Konfiguration falsch ist, oder diese Implementierung wird nicht mit NGINX funktionieren. –

+0

Mein Ziel ist es, ein einzelnes Docker-Image mit einer korrekten NGINX-Konfiguration zu haben, das zu jedem Zeitpunkt eingesetzt werden kann und eine Authentifizierung nur in einer bestimmten Umgebung anfordert. –

Antwort

2

Ich finde nur eine Lösung mit etwas Hilfe von Serverfault. Es ist nicht die beste, weil die URLs in der nginx.conf Datei, aber es löst mein Problem:

Ich entfernte gerade die Variablen bilden die docker-compose.yml Datei:

docs-router: 
    build: ./nginx 
    environment: 
    - API_BASE_URI=staging.example.com 
    - DOCS_STATIC_URI=docs-staging.example.com 
    ports: 
    - "8089:8089" 
    - "8090:8090" 

Und dann kartiert ich die URLs in den nginx.conf Datei:

... 

env API_BASE_URI; 
env DOCS_STATIC_URI; 

... 

http { 

    ## 
    # URL protection 
    ## 
    map $http_host $auth_type { 
    default "off"; 
    stage1.example.com "Restricted"; 
    stage2.example.com "Restricted"; 
    } 

    server { 
    listen 8089 default_server; 
    charset utf-8; 
    resolver 8.8.8.8; 
    access_log off; 

    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    location ~ ^(/.*\.(?:apib|svg))?$ { 
     set_by_lua_block $api_base_uri { return os.getenv("API_BASE_URI") } 

     auth_basic $auth_type; 
     auth_basic_user_file /etc/nginx/.htpasswd; 

     proxy_pass https://$api_base_uri$1; 
     proxy_set_header Host $api_base_uri; 
    } 

    ... 

    } 

} 

Wenn es eine bessere/schönere Lösung für diese, lassen Sie es mich wissen.

+0

Ich bin gerade mit einer etwas komplexeren Lösung gekommen. Ich definiere eine Umgebungsvariable wie 'RESTRICTED_STAGES' und schließe die Hostnamen ein, die geschützt werden müssen (durch Kommas getrennt). Während des Docker-Builds werde ich diese Variable analysieren, die Hostnamen lesen und die ursprüngliche 'nginx.conf'-Datei mit ihnen ändern - und jetzt ist es konfigurierbar. –

+0

Ich akzeptierte nur meine eigenen Lösungen, weil es keine andere Idee oder Anregung gab. –