nginx インフラ

【nginx】upstreamとは?使い方例と合わせて紹介

こんにちは、yassanです。
今回は、nginxのupstreamについて紹介します。

upstreamとは?

nginxのupstreamディレクティブは、リクエストを処理するためのサーバーグループを定義するために使用します。
用途としては、nginxがリバースプロキシやロードバランサーとして使いたいときに設定することになります。

基本的な書き方は下記のとおりです。

upstream backend {
    server server1.example.com;
    server server2.example.com;
    # その他のディレクティブ...
}

backendという名前のupstreamグループが作成され、server1.example.comとserver2.example.comの2つのサーバーがグループに含まれています。

ロードバランサーとして利用する

nginxは、upstreamサーバーへのリクエストを分散するためにいくつかの方法を提供しています。
下記は例となります。

  • ラウンドロビン(デフォルト): リクエストを順番に各サーバーに割り当てます。
  • Least Connections: 現在最小のアクティブ接続数を持つサーバーにリクエストを割り当てます。
  • IP Hash: クライアントのIPアドレスに基づいてサーバーを選択します。これは、セッションの持続性が必要な場合に便利です。

動的名前解決を利用する

nginxは起動時に serverディレクティブ内のドメイン目英を解決し、そのIPアドレスをキャッシュします。
そのため、nginxを再起動するまで更新されません。

動的名前解決を有効にするには、resolverディレクティブを設定ファイルに追加します。

下記が例となります。

resolver 8.8.8.8;

upstream backend {
    server server1.example.com resolve;
    server server2.example.com resolve;
}

この例では、 DNSサーバーを 8.8.8.8 にして、server1.example.comとserver2.example.comのドメイン名を解決します。
resolveが指定されていると、定期的にドメイン名のIPアドレスを定期的に解決して、自動的に対応します。

特定のポートを使用する

リバースプロキシとして利用する場合、http以外のポートを使用することもあると思います。
streamモジュールを利用することで、別のポートを利用することができます。

下記が例となります。

stream {
    upstream backend {
        server server1.example.com:81;
        server server2.example.com:81;
    }

    server {
        listen 81;
        proxy_pass backend;
    }
}

この例では、81番ポートでリッスンするように設定されています。

-nginx, インフラ