在 nginx 中有条件地使用基本身份验证

在 nginx 中有条件地使用基本身份验证

我有一个内置于 Docker 镜像的 NGINX 服务器,我想在生产环境和暂存环境中使用它。

问题在于,暂存环境需要启用基本身份验证,以保护服务器免遭窥探。

有没有办法动态地将基本身份验证应用于 nginx 服务器?我可以将环境变量传递给 nginx,或者我可以使用预定义的静态主机名来区分生产和部署。

但是,我不确定如何在 nginx 中有条件地使用这些数据。

这是我目前的配置:

server {

    listen 80 default_server;

    # IF: %ENVIRONMENT% = 'staging' OR
    # IF: $host = 'example.com'
        auth_basic           "global";
        auth_basic_user_file /etc/nginx/.htpasswd;
    #

    root /var/www;

    location /health-check {
        auth_basic off;
        try_files /health-check.html =404;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }

}

任何建议都将受到高度赞赏。

答案1

Nginx 不支持服务器、位置或 http 块中的环境变量,但你可以将配置文件中特定变量的出现替换为环境值envsubst在 nginx 加载它之前。

使用如下配置文件:

server {

    listen 80 default_server;

    auth_basic ${BASIC_AUTH_ENABLED};
    auth_basic_user_file /etc/nginx/.htpasswd;

    root /var/www;

    location /health-check {
        try_files /health-check.html =404;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }

}

BASIC_AUTH_ENABLED您可以通过运行将“${BASIC_AUTH_ENABLED}”替换为环境变量的值

envsubst '${BASIC_AUTH_ENABLED}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf

第一个参数'${BASIC_AUTH_ENABLED}'告诉 envsubst 仅替换与该文本匹配的出现(确保使用简单的引号,否则在执行 envsubst 本身之前可能会发生参数扩展)。

如果 的值auth_basic具有特殊值off,则基本身份验证将被停用(请参阅 nginxauth_basic 文档)。

作为 Docker 容器的入口点,您可以运行如下 bash 脚本:

if
    [ ${BASIC_AUTH_ENABLED} = "true" ] ;
then
    htpasswd -cb -B -C 10 /etc/nginx/.htpasswd ${BASIC_AUTH_USER} ${BASIC_AUTH_PASSWORD} ;
else
    export BASIC_AUTH_ENABLED=off ;
fi
envsubst '${BASIC_AUTH_ENABLED}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf

因此,如果您启用了基本身份验证,请加密给定用户的密码,否则,将环境变量的值设置为“off”,以便 nginx 禁用基本身份验证。

相关内容