web-dev-qa-db-ja.com

Nginx vhostにファイルを条件付きでどのように含めますか?

以下の行では、Imightに、サイト固有の追加の fastcgi_params を含むサイト固有の構成ファイルがあります。このファイルが存在する場合は、それをロードします。

server {
        listen 80 default;
        server_name _;
        root /path/www/$Host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;


                if (-f /path/www/$Host/nginx.conf) {
                        include /path/www/$Host/nginx.conf;
                }
        }
}

ただし、これは機能せず、私が受け取るエラーは次のとおりです。

nginx:[emerg] "include"ディレクティブはここでは許可されていません...

更新

個別にチェックするのではなく、 include でチェックするようにできると思いました。

server {
        listen 80 default;
        server_name _;
        root /path/www/$Host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;

                include /path/www/$Host/*.nginx;
        }
}

ただし、これは機能していないようです。

13
Xeoncross

includeはサーバーの起動時に機能します。$Hostのようなランタイム変数は使用できません。また、ご存じのように、ifコンテキストで使用することもできません。

異なるホストのserverブロックを分割する必要があります。ごめんなさい!

9
Shane Madden

まあ、これはかなり古いですが、とにかく回避策を見つけました。

このスタイルで構成されたvhostsのセットアップがあります。

/etc/nginx/sites-enabled/site.com.conf

ファイルが存在するかどうかを確認するのではなく(不可能です)、次のようにします。

include /etc/nginx/sites-customizations/site.com.*.conf

このようにして、sites-customizations- folderは、私の慣例により、メイン構成と同じ名前が付けられています。 *は、ifとほとんど同じように機能します。追加の構成ファイルがない場合でも機能します。必要に応じて、別のファイルに複数の追加設定を追加することもできます。

31
user158786

私はincludeディレクティブでnginxによって使用されているglob()関数パターン拡張を利用しており、私のDebianサーバーでうまく機能します。

あなたの場合、この行を置き換えてみてください:

include /path/www/$Host/nginx.conf;

これで:

include /path/www/<hostname>/nginx[.]conf;

これは1つのファイルのみに一致するファイルマスクであり、ファイルが存在しない場合でもnginxは不平を言いません。ただし、includeディレクティブでは変数を使用できないため、<hostname>に固定値を指定する必要があります。個々の.confファイル(vhostごとに1つ)を生成するスクリプトを作成する必要がありました。

編集する

Gerald Schneider が指摘したように、私は$Hostを置換で保持することを提案していましたが、これは許可されていません。上記の提案を変更しました。

5
Alberto Pastore

私はこれが古いことを知っていますが、解決策は私がしたように答えを探している誰かを助けるかもしれません。

特定のホストのみに含める必要のあるリダイレクトの束があり、includeifディレクティブでは許可されていませんが、最終的にifを含めていたファイル...

だから私はinclude /etc/nginx/conf.d/redirectsそしてそのファイルの中に私が持っています:

if ($Host = "www.example.com") {
    # Some conf or redirects for this site only.
}
5
Titi