Nginx リバースプロキシの設定

Nginx リバースプロキシの設定

現在、数百の Web アプリケーションが約 20 台のサーバーに分散しており、これらの前にリバース プロキシが配置され、Pound と Haproxy が稼働しています。Pound は http から https へのリダイレクトと SSL 暗号化を実行し、その後 Haproxy に転送します。Haproxy には、各サイトが Tomcat を実行しているバックエンド サーバーの 1 つに転送するようにルールが設定されています。すべてのサイトは同じドメインにあります (例: www.domain.com/webapp1、www.domain.com/webapp2)。

Pound と Haproxy は元々、ホスティング プロバイダーによってセットアップされていましたが、Pound に不満が募ったため、このセットアップを Nginx に置き換えることを検討しています。現在、開発環境で Nginx を実行して https リダイレクトと SSL を実行しており、バックエンドにプロキシするためのルールをいくつかセットアップしています。

私が本当に求めているのは、これが最善の方法であるかどうか、またはすべてのルールを Haproxy に処理させて、Pound の代わりに Nginx を構成する方がよいかどうかについてアドバイスをもらうことです。

私の懸念は、以下のように何百もの転送ルールで Nginx を構成すると、パフォーマンスの問題が発生することです。 ご提案があれば、ぜひお知らせください。

location /webapp1/ {
     proxy_pass http://10.1.9.11:8080;
}

location /webapp2/ {
     proxy_pass http://10.1.9.11:8080;
}

location /webapp3/ {
     proxy_pass http://10.1.9.12:8080;
}

答え1

あまり詳しくありませんが、パフォーマンスの問題に関する懸念に答えるhaproxyには十分な知識があります。nginx

nginx設定はstructわかりやすい形式にコンパイルされてメモリに保存され、ファイルは各リクエストごとに読み取られるわけではないことに注意してください。したがって、数百の設定は、 + を同じ回数location /...呼び出すのとほぼ同じ速度で実行されます。これは、ソケット設定と比較すると無視できるほどのものです。strlen()strncmp()

URLはマッチングが始まる前に正規化される=したがって、演算子 ( 、、、)のいずれ~*~を使用しない限り、一致に関して特に賢い点はありません。^~

正規表現マッチ(~*~)といくつかのifロジックを使用してupstreamサーバーを決定することもできますが、それは遅い解決策になるだろう

一方、正規表現の場所が少なくとも1つある場合は、^~演算子の使用を検討する必要があります。SO の Martin Redmond による古いがまだ関連性のある回答さまざまな演算子とnginxそれらがどのように一致するかについて説明します。

関連情報