nginxが提供する静的ファイル内でnginx環境変数を使用できますか?


10

nginx設定で環境変数を使用し、nginxが静的ファイル(html、js、css-たとえばAngularJsアプリ)のみを提供するように構成されている場合、nginxが提供するJSファイル内で環境変数を使用する方法はありますか? ?または、これを実行して非静的サーバー(io.js、phpなど)を実行する唯一の方法です。


ところで、nginxの設定では、環境変数をネイティブに使用することはできません。

私は環境について話すときnginxの設定Iにvarsはこの記事のように意味:どのように私はNginx.confで環境変数を使用することができます彼らが使用env APP_WEB_1_PORT_5000_TCP_ADDR;し、$ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};


ユースケースを正確に説明してください

私の特定の使用例は、Dockerコンテナーにnginxを利用したAngularJSアプリがあることです。このアプリは、別のシステムで実行されているAPIを完全に使用する「単一ページアプリケーション」です。アプリには、Google-Analtyicsコードなどの異なる設定があるため、現在、本番とステージングの間で別のDockerコンテナーを実行しています。この環境固有のデータはconfig.jsファイルに保存され、値は現在ハードコーディングされています。gitのmasterブランチの1つの値とブランチの異なる値ですstaging。制作とステージングの両方で同じコンテナを使用できるように、デザインを変更したいと考えています。私は(それを実行したときに容器の中にENVのVARを渡したいdocker run -e GACODE=UA-12345-6 ...介して、()とENVのVARを使用nginxの持ちenv GACODE;$ENV{"GACODE"}なりますconfig.jsファイルでは、ハードコーディングするのではなく、渡されたGoogleAnaltyicsコードを使用できます。これが可能かどうかはわかりません(したがって、質問;))。nginxのみを使用すると、コンテナーが単一プロセスになりますが、io.jsを使用する必要がある場合は、複数のリンクされたコンテナーが必要であり、より多くの可動部分がより複雑になります)。


何 ?!間違った方向から見ているように見えるため、ユースケースを正確に説明してください。ところで、nginxの設定では、環境変数をネイティブに使用することはできません。
Xavier Lucas

ありがとう@XavierLucas-詳細を説明するために質問を更新しました。
トム

回答:


4

sub_filter

単純な文字列置換が必要な場合は、sub_filterを使用できます。例えば:

server {
    sub_filter "REPLACE_THIS" "with this";
    sub_filter_once off; # Don't stop at the first match, replace all of them
    sub_filter_types "text/javascript" "application/json"; # Apply to these mime types in addition to text/html 

    # Everything else
}

ただし nginx configで環境変数を読み取ることはできません-もちろん、有効な構成ファイルを生成してnginxをリロードするために必要な方法でnginx構成ファイルをスクリプトで書き込むことができます。


4

私はsub_filterとnginx環境変数を使用して実験しましたが、それは不可能であると結論付けました。

たとえば、これは私の実験を示し、nginxに渡されたENVの使用がブロック内で機能しないことを示していserverます。

env TOMTEST1; # OK - makes $ENV{"TOMTEST1"} available but NOT in server block.

http {

    server {

        # set $TOMTEST1 $ENV{"TOMTEST1"};    # KO - DOES NOT WORK - NGINX WONT START
        set $TOMTEST2   'tomtest2 Var';      # OK - THIS DOES WORK OK

        sub_filter 'TOM_TEST2' $TOMTEST2;       # OK - but not useful to me.
        sub_filter 'TOM_TEST3' 'tomtest3 Var';  # OK - but not useful to me.
        sub_filter_once off;                    # Don't stop at the first match, replace all of them
        sub_filter_types "text/javascript" "application/json"; # Apply to these mime types in addition to text/html

        # Serve static files
        location / {
           try_files $uri /index.html =404;
        }
        ...

ここで、提供している静的なconfig.jsonファイルには、次のようなさまざまなテスト文字列があります。

{
    "environment": "local",
    "test1": "$ENV{"TOMTEST1"}",
    "test3": "TOM_TEST2",
    "test4": "TOM_TEST3",
}

@ AD7sixが述べたように、続行する方法は、nginxがプレースホルダーから有効な構成ファイルを生成し始める前に実行するスクリプトを用意することです。しかし、これは問題を引き起こします。nginxが開始する前にスクリプトが実行される場合config.json、そのスクリプトにファイルのコンテンツを設定し、まったく気にしないこともできますsub_filter


2
それが1つの静的ファイルの場合-nginx configを介して行わないことは確かに理にかなっていますが、私はあなたのユースケースがそれより少し広いと仮定しました。情報/コントラストIの使用のためにsub_filter "example.com" "example.dev";これらの参照は、サードパーティのAPI応答/アプリのコードから来るので、/ JS / DBのダンプの/ etcローカル環境に本番ドメインに任意およびすべての参照を置き換えるためのdevのセットアップインチ -つまり、nginxの場合は、html / js / json応答のどこにでも配置できます。+1
AD7six 2015年

3

私はOPと同じ問題の解決を検討しており、この投稿がGoogle検索で出てきたので、潜在的な解決策を追加したいと思いました。

この投稿では、nginx config内で環境変数を公開する方法の概要を説明しています。https//blog.doismellburning.co.uk/environment-variables-in-nginx-config/

また、ファイルシステムにファイルがなくてもコンテンツを返すことができます。ファイルを提供せずにNginx構成から200で返信します。

これら2つをまとめると、次のようになります。

env MY_ENV_VAR;

# Snip

http {
    # Snip

    server {
        # Snip

        location ~ ^/config.js$ {
            add_header Content-Type text/javascript;
            set_by_lua $env_var 'return os.getenv("MY_ENV_VAR")';
            return 200 'const MY_ENV_VAR = \'$env_var\'';
        }
    }
}

これは、テスト環境で私のために働いています。これは少し面倒です(必要な変数を含むDockerの起動時にファイルを自動生成するよりも優れているとは限りません)。

お役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.