名前付きの場所でDRY、モジュラーnginx conf(リバースプロキシ)を記述する方法


25

私はnginxを主にいくつかのgunicon / mod_wsgiアプリケーションの前で、そしてもちろん静的ファイルをサーバーするためのリバースキャッシングプロキシとして使用しています。

私はすぐに私のnginx confsを維持することが不可能になることに気付きました。問題は、似ている(または同一の)パターンがいくつかありますが、それを何とかきれいにすることはできません。

私が抱えている最大の問題の1つは、名前付きの場所を使用して、confのセットをグループ化する方法として使用したいことです。

location @django_modwsgi {
    include proxy.conf;
    proxy_pass  http://127.0.0.1:8080;        
}

location @django_gunicorn {
    include proxy.conf; # this could also be included directly in the server {} block?
    proxy_pass  http://gunicorn_builder;
}

NB。 問題は、gunicornとwsgiの両方がないことです。それはほんの一例です。もう一つは:

location @namedlocation_1 {
     some cache settings;
     some cache_key settings;
     ignore some headers;
     expires;
     proxy_pass
}

location @namedlocation_2 {
     other cache settings;
     other cache_key settings;
     ignore some headers;
     expires;
     proxy_pass
}

しかし、私が見つけた唯一の方法は、名前付きの場所を呼び出すことです:

location /somelocation {
    try_files $uri @named_location;
}

これは既に正しくないと感じてます。nginxが静的ファイルを探しに行きたくないので、指定された場所に直接行きたいです。名前付きの場所を直接「呼び出す」方法はありますか?!

私がドライに行けると思った別の方法は、たくさんのinclude...

location /somelocation {
    include django_unicorn.conf;
}

しかし、これはそれを行う良い方法ですか?非常に一般的な設定(プロキシ設定など)では問題ないように見えますが、完全なconfを取得するために別のファイルを開く必要があるのはあまり読みにくいです。

また、場合によっては、いくつかの場所を正規表現でグループ化できますが、同じブロックに共通の設定を配置できるだけでなく、それらが論理的に関連している場合にのみグループ化するのが好きです。

質問

適切なDRY nginx構成を記述するための「公式の」ベストプラクティスはありますか?

次のようなパターンを見つけたいです。

location / {
    common confs
    try_files $uri @name_location
}

**しかし、異なる場所に特定のケースを書くにはどうすればよいですか?**

confの一般的でない部分と@named_locationの一般的な部分を使用して、単純にいくつかの場所を追加できますか?

location /1/ {
    some cache expire settings;
    NOTHING ELSE;
}

location /2/ {
    some other cache expire settings;
    NOTHING ELSE;
}

location / {
    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

同じリソースを指す別のURLがある場合、単純に書き換えることはできますか?

location /1/ {
    rewrite  ^  /3/  last;
}

location /2/ {
    rewrite ^   /4/  last; 
}

location / {
    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

またはそれらをすべて1つの場所にグループ化する必要がありますか?

location / {
    rewrite ^/1/$  /3/  last;
    rewrite ^/2/$   /4/  last; 

    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

関連する

メーリングリストにはあまり見当たりませんでしたが、Wikiにはあまり見当たりませんでした。

これは質問NGinx Best Practicesと同じではないことに注意してください-これは非常に一般的な質問です。

このもう1つはより関連性が高い:このNginx構成をどのように乾燥させるのですか?

回答:


6

nginxマップ機能を使用して同様の問題を解決しました。

最初にバックエンドマップへのドメイン名を作成します。

map $http_host $backend {
  myhost1.tld 192.168.1.100;
  myhost2.tld 192.168.1.101;
  default     upstream_pool1;
}

次に、場所で地図を使用します

location / {
  common settings
  proxy_pass $backend; 
}

$ http_hostの代わりに他の変数を使用できます。このマニュアルを参照してください:http ://nginx.org/en/docs/http/ngx_http_map_module.html


私は知りませんでしたmap-または、少なくともこのように使用できることに気づき、思っていませんでした...これについてもう少し考えて、追加の質問/コメントがあるかどうかを確認してください!
ステファノ

2

名前付きの場所を直接「呼び出す」方法はありますか?!

少なくとももう1つの方法があります。

location /somelocation {
    error_page 418 = @named_location;
    return 418;
}

このハックにより、nginxが "/ somelocation"内に設定された "proxy_read_timeout"をnginxが "@named_location"に "return" -sするときに忘れてしまうことがわかりました。
デニスリュジコフ

1
418私は本当に急須ですか?
ウォルフ

0

一部のディレクティブは、「サーバー」コンテキストと「ロケーション」コンテキストの両方に適用して、DRYにすることができます。

# The variables below are evaluated on each request,
# allowing to DRY configs of locations.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Real-IP $remote_addr;

location /special {
    proxy_send_timeout 10m;
    proxy_read_timeout 10m;
    proxy_pass http://pool;
}

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