我有一个内置于 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 禁用基本身份验证。