実稼働環境とステージング環境の両方で使用したいNGINXサーバーがDockerイメージに組み込まれています。
問題は、ステージング環境では、サーバーをのぞき見から保護するために、基本認証を有効にする必要があることです。
基本認証を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;
}
}
どんな提案でも大歓迎です。
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}」をenvvar BASIC_AUTH_ENABLED
の値に置き換えることができます。
envsubst '${BASIC_AUTH_ENABLED}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf
最初のパラメーター'${BASIC_AUTH_ENABLED}'
は、そのテキストと一致するオカレンスのみを置き換えるようにenvsubstに指示します(必ず単一引用符を使用してください。そうしないと、envsubst自体を実行する前にパラメーター展開が発生する可能性があります)。
auth_basic
の値に特別な値off
がある場合、基本認証は無効になります(nginx auth_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
したがって、基本認証を有効にしている場合は、特定のユーザーのパスワードを暗号化します。そうでない場合は、env varの値を特に「オフ」に設定して、nginxが基本認証を無効にします。