複数のnginx構成ファイルでサーバーの場所を定義できますか?


14

同じホスト上で複数のrubyアプリを実行しています:

~/app1
~/app2
~/app3

そして、次のようなサブディレクトリを使用してこれらのアプリをnginxプロキシする必要があります:

   http://example.com/app1
   http://example.com/app2
   http://example.com/app3

nginxがこれらの場所を複数のファイルで定義できるので、すべてのアプリに1つのモノリシックな構成ファイルを持たせるのではなく、アプリで各構成を維持できるようにサポートしてくれるかどうか興味があります。

~/app1/nginx.conf
~/app2/nginx.conf
~/app3/nginx.conf

3つの構成ファイルのそれぞれで単一のロケーションディレクティブを使用してサーバーを定義しようとした私の素朴な試みはconflicting server name "example.com" on [::]:80, ignored、次のような構成になりました。

upstream app1 { server 127.0.0.1:4567; }
server {
  listen      [::]:80;
  listen      80;
  servername  example.com
  location    /app1 {
     proxy_pass  http://app1;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
     proxy_set_header Host $http_host;
     proxy_set_header X-Forwarded-Proto $scheme;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header X-Forwarded-Port $server_port;
     proxy_set_header X-Request-Start $msec;
  }
}

このように構成を整理する方法はありますか?

回答:


9

includeを介して外部設定を含めることができます:

include /path/to/config1.conf;
include /path/to/config2.conf;
include /path/to/confdir/*.conf;

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;
}

また、個別の構成内では、有効なコードブロックを使用できます。

upstream app1 {
    server 127.0.0.1:8080;
}

location /app1 {
    proxy_pass http://app1;
}

5
これは実際に機能しますか?アップストリームモジュールは、サーバーモジュールブロックの外側にある必要はありませんか?
カーリー14年

5
ロケーションディレクティブはサーバーブロック外では許可されていないようです。少なくとも私にとっては、nginxが報告してい"location" directive is not allowed hereます。
アレクサンダーアメルキン16年

ええ...アプリケーションごとに複数のファイルなしで適切にそれを行う簡単な方法はありません:サーバーブロック内で動作するもの、外部で動作するもの。:私は柔軟性を推測すると、それはワイルドカードを使用することができるきれいにするinclude /etc/nginx/above_server.d/*include /etc/nginx/in_server.d/*
jeteon

1
この答えは間違っている
AmirHossein

11

私はあなたがこの構成を使用できると信じています:

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;

    include /path/to/applications/*/nginx.conf;
}

次に、各アプリケーションのディレクトリで、次のようにリダイレクトを設定します。

location    /app1 {
    proxy_pass  http://app1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
}

2
欠点は、serverブロック内で複数のアップストリームを定義できないことですが、OPのユースケースはこの回答で十分に機能すると思います。
jeteon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.