基于环境变量的 NGINX 基本身份验证

我正在设置安装有 nginx-lua 的 docker 镜像。情境是在 staging 环境上进行基本身份验证,但在 production 环境中不需要。我的想法是在 nginx.conf 文件中设置一个具有 stage 名称的 ENV 变量并检查其值。

docker-compose.yml 文件的内容是(对于 staging,对于 production,STAGE 环境将是 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 文件的内容是:

......

环境 API_BASE_URI;
环境 DOCS_STATIC_URI;
环境 STAGE;

......

http {
  server {
    listen 8089 default_server;
    charset utf-8;
    解析器 8.8.8.8;
    访问日志关闭;

    代理设置头 X-Real-IP $remote_addr;
    代理设置头主机 $host;
    代理设置头 X-Forwarded-For $proxy_add_x_forwarded_for;

    位置 ~ ^(/.*\.(?: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";

      如($ 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;
    }

    ...

  }

}

但它不起作用。有什么想法,我该如何实现呢?

点赞
用户2742260
用户2742260

我刚刚在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文件中映射了URL:

...

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

    ...

  }

}

如果有更好/更好的解决方案,请让我知道。

2016-07-12 09:35:58