2016-07-11 3 views
0

Я настраиваю изображение докера с установленным nginx-lua. Сценарий состоит в том, чтобы иметь базовую аутентификацию при постановке, но не в производстве. Моя идея состояла в том, чтобы иметь переменную ENV с названием сцены и проверить значение в файле nginx.conf.Основная аутентификация NGINX на основе переменной окружения

Содержание docker-compose.yml файла (для постановки, а также для производства стадии окр будет prod конечно):

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" 

Содержание nginx.conf файла:

... 

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

    ... 

    } 

} 

Но это не работает. Любая идея, как я могу это достичь?

+0

Итак, в чем ваш вопрос? –

+0

Эта конфигурация не работает, и я хотел бы знать, что моя конфигурация неверна, или эта реализация не будет работать с NGINX. –

+0

Моя цель состоит в том, чтобы иметь одно изображение докеры с надлежащей конфигурацией NGINX, которая может быть развернута на любом этапе и запрашивает аутентификацию только в определенной среде. –

ответ

2

Я просто нашел решение с некоторой помощью от Serverfault. Это не самый лучший, потому что URL-адреса в файле nginx.conf, но он решает мою проблему:

я только удалил переменную сформировать docker-compose.yml файл:

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

А потом я отобразили адреса в nginx.conf файл:

... 

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

    ... 

    } 

} 

Если у вас есть лучшее/лучшее решение, сообщите мне.

+0

Я просто столкнулся с немного более сложным решением. Я определяю переменную среды как 'RESTRICTED_STAGES' и включаю имена хостов, которые должны быть защищены (разделены запятыми). Во время сборки docker я буду анализировать эту переменную, читать имена хостов и изменять исходный файл 'nginx.conf' с ними - и теперь он настраивается. –

+0

Я просто принял свои собственные решения, потому что не было никакой другой идеи или предположения. –

Смежные вопросы