web-dev-qa-db-ja.com

nginxで条件付きで基本認証を使用する

実稼働環境とステージング環境の両方で使用したい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;
    }

}

どんな提案でも大歓迎です。

3
Slava Fomin II

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が基本認証を無効にします。

2
gbmcarlos