nginxでproxy_passを設定する方法|コード例付き

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年8月)

✔このような方へ向けて書かれた記事となります

「Nginxのproxy_pass設定って何だろう?」

「Nginxのproxy_passの設定方法が知りたい」

「proxy_passを使ったnginxの設定例が見たい」

✔当記事を通じてお伝えすること

  • Nginxのproxy_pass設定の基本
  • proxy_passを利用したNginxの設定方法とその応用
  • 実際のproxy_passを用いたNginx設定の例

当記事では、Nginxのproxy_pass設定の基本から、その詳細な設定方法、さらには応用例まで、具体例を用いて詳解しています。

最後までご一読いただけますと、Nginxを更に理解し、活用できるようになることでしょう。

ぜひ最後までご覧ください

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Nginxとproxy_passを理解するための前提知識

こちらでは、「nginx」についての基礎知識をお伝えします。

基本を理解したうえで、より詳しい内容に入っていきましょう。

  • nginxの概要
  • nginxの特徴
  • proxy_passの役割
  • proxy_passの設定方法

nginxの概要

Nginx(エンジンエックスと発音されます)は、以下のような機能をもつオープンソースのソフトウェアです。

  • 高性能で軽量なWebサーバー
  • リバースプロキシ
  • 負荷分散サーバー
  • HTTPキャッシュ
  • メールプロキシ

多くの同時接続を処理する必要がある大規模なWebサイトでは、nginxが一般的に使用されます。

nginxの特徴

Nginxの主な特徴と機能は以下のとおり。

  1. 高性能
    Nginxは非同期イベント駆動アーキテクチャを使用しており、多くの同時接続を効率的に処理できます。このため、高トラフィックのサイトでも迅速に応答します。
  2. リバースプロキシ
    Nginxはリバースプロキシとしても機能し、クライアントからのリクエストをバックエンドサーバーに転送し、そのレスポンスをクライアントに返す役割を果たします。セキュリティや負荷分散、キャッシュ、バックエンドサーバーとの通信の最適化などが可能になります。
  3. 負荷分散
    Nginxは、複数のバックエンドサーバーへのリクエストを分散する負荷分散機能を提供します。これにより、リソースの使用を最適化し、ダウンタイムを減らし、アプリケーションの耐障害性を向上させられます。
  4. 静的ファイルの配信
    Nginxは、静的ファイル(画像、CSS、JavaScriptなど)の配信にも優れており、非常に迅速に処理できます。
  5. 柔軟な設定
    Nginxの設定ファイルは非常に柔軟で、多岐にわたるシナリオに対応するための詳細な設定が可能です。
  6. セキュリティ
    SSL/TLSのサポート、リクエストの制限、アクセス制御など、セキュリティを強化するための多くの機能が組み込まれています。

これらの特徴により、Nginxは多くの企業やプロジェクトで採用されており、小規模なプロジェクトから大規模な企業の基盤に至るまで幅広く使用されています。

proxy_passの役割

proxy_passはNginxの設定ディレクティブで、リバースプロキシとしての動作を指示するもの。

具体的には、クライアントからのリクエストをバックエンドサーバーへ転送し、バックエンドサーバーからのレスポンスをクライアントに返す役割を果たします。

以下はproxy_passの使用例の一部です。

location /api/ {
    proxy_pass http://backend_server;
}

この例では、URLが/api/で始まる全リクエストがバックエンドサーバー(ここではhttp://backend_serverと示されています)に転送されるように設定されています。

proxy_passの主な役割と利点はこちら。

  1. 負荷分散
    複数のバックエンドサーバー間でリクエストを分散し、サービスの可用性と効率を高められる。
  2. アプリケーションの分離
    フロントエンドとバックエンドを分離し、異なるURLパスを異なるバックエンドサービスにマップできる。
  3. キャッシングと最適化
    レスポンスをキャッシュしたり、リクエストとレスポンスのヘッダーを変更するなどの最適化が可能です。
  4. セキュリティの強化
    リバースプロキシはクライアントとバックエンドサーバーの間に位置するため、不正なリクエストのフィルタリングやバックエンドサービスの隠蔽など、セキュリティの強化にも寄与します。

proxy_passディレクティブにより、ネットワーク構造の柔軟性と堅牢性を高められるのです。

proxy_passの設定方法

proxy_passの設定はnginxの設定ファイル内でおこないます。

転送先のURLを指定し、簡単にリクエストのルーティングをおこないます。

location /api/ {
    proxy_pass http://localhost:8080;
}

リクエストをプロキシサーバに渡すメカニズム

こちらでは、nginxがリクエストを、プロキシサーバに渡すメカニズムについてお伝えしていきます。

  • リクエストの流れ
  • 負荷分散の仕組み
  • リクエストヘッダーの取り扱い
  • バッファ設定の理解と適用

リクエストの流れ

Nginxにおけるリクエストの流れは、以下のステップで構成されています。

  1. クライアントからのリクエスト
    クライアント(通常はWebブラウザなど)からHTTPリクエストが送信されると、Nginxがそのリクエストを受け取ります。
  2. リッスン
    Nginxは設定ファイルで指定されたポートで、リクエストをリッスンしています。クライアントからのリクエストがそのポートに到達すると、Nginxはそれを処理します。
  3. サーバーブロックの選択
    Nginxはserverブロック内の設定に基づいてリクエストを処理します。複数のサーバーブロックがある場合、リクエストのホスト名やIPアドレス、ポートなどに基づいて対応するブロックが選択されます。
  4. ロケーションブロックの選択
    locationブロックは、URLのパスに基づいてリクエストを処理する方法を指定します。リクエストのパスに対応するlocationブロックが選択され、その設定に基づいてリクエストが処理されます。
  5. プロキシ処理
    proxy_passなどのディレクティブが設定されている場合、リクエストはバックエンドサーバーに転送されます。この時、ヘッダーやほかの情報を変更することも可能です。
  6. コンテンツの生成
    リクエストに対応する静的ファイルやプロキシされたレスポンスなど、クライアントに返すコンテンツが生成されます。
  7. フィルタリング
    Nginxのフィルタモジュールを通してレスポンスを加工できます。これには、圧縮や文字セットの変換などが含まれます。
  8. レスポンスの送信
    最終的に生成されたレスポンスがクライアントに送信されます。
  9. ログの記録
    アクセスログやエラーログにリクエストとレスポンスに関する情報が記録されます。

この流れを通じて、Nginxはクライアントからのリクエストを非常に効率的に処理し、静的コンテンツの配信、リバースプロキシング、負荷分散などの機能を提供します。

負荷分散の仕組み

Nginxにおける負荷分散(ロードバランシング)は、複数のバックエンドサーバーへのインバウンドトラフィックを分散させる技術です。

これにより、単一のサーバーへの過度な負荷を回避し、アプリケーションの可用性と応答時間を向上させられます。

Nginxでの負荷分散の仕組みをわかりやすく説明すると以下のとおりです。

  1. クライアントからのリクエスト
  2. Nginxがリクエストを受信
  3. 負荷分散アルゴリズムによるサーバー選択
  4. バックエンドサーバーへの転送
  5. レスポンスの受信とクライアントへの送信
  6. 必要に応じて健康状態のチェック

1. クライアントからのリクエスト

クライアント(例:ブラウザ)がリクエストを送信します。

2. Nginxがリクエストを受信

リクエストはまずNginxに到達し、設定に基づいて処理されます。

3. 負荷分散アルゴリズムによるサーバー選択

Nginxは設定された負荷分散アルゴリズムに基づいて、どのバックエンドサーバーにリクエストをルーティングするかを決定します。

一般的なアルゴリズムは以下のとおりです。

  • Round Robin: バックエンドサーバー間で均等に分散する、一番シンプルな方法
  • Least Connections: 最も接続数の少ないサーバーにリクエストをルーティングする方法
  • IP Hash: クライアントのIPアドレスに基づいてリクエストをルーティングする方法

4. バックエンドサーバーへの転送

選択されたバックエンドサーバーにリクエストが転送され、必要な処理がおこなわれます。

5. レスポンスの受信とクライアントへの送信

バックエンドサーバーからのレスポンスをNginxが受信し、クライアントに送信します。

6. 必要に応じて健康状態のチェック

Nginxは、バックエンドサーバーの健康状態を定期的にチェックします。

何らかの問題が発生したサーバーは自動的にプールから除外され、トラフィックがほかの健康なサーバーにルーティングされるのです。

リクエストヘッダーの取り扱い

こちらでは、nginxでのリクエストヘッダーの取り扱いについてお伝えしていきます。

proxy_passを扱ううえで、リクエストヘッダーについての理解は必須事項です。

  • ヘッダーの構造
  • ヘッダーのカスタマイズ方法

ヘッダーの構造

リクエストヘッダーはHTTPリクエストの一部。

クライアントからサーバーへ送られる情報を格納します。

例として、使用しているブラウザの種類、受け入れ可能なコンテンツタイプ、認証情報が含また一般的なものをご紹介します。

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
  • GET /index.html HTTP/1.1: HTTPメソッド(ここではGET)と要求するリソース、使用するHTTPバージョンを指定します。
  • Host: 要求されたリソースのホスト名。
  • User-Agent: クライアントのブラウザやオペレーティングシステムに関する情報。サーバーがクライアントに応じたコンテンツを提供するのに役立ちます。
  • Accept: クライアントが受け入れ可能なコンテンツタイプを指定します。
  • Accept-Language: クライアントが理解できる言語を指定します。
  • Connection: このリクエストでの接続の制御。この例ではkeep-aliveとしているため、接続は再利用されます。

ヘッダーのカスタマイズ方法

nginxでは、リクエストヘッダーのカスタマイズが可能で、特定のヘッダーを追加/変更/削除できます。

1. ヘッダーの追加・変更

Nginxで特定のヘッダーを追加または変更するために、proxy_set_header ディレクティブを使用することができます。

location /api/ {
    proxy_pass http://backend_server;
    proxy_set_header X-Custom-Header "Custom Value";
    proxy_set_header Host $host;
}

この例では、X-Custom-Header というカスタムヘッダーを追加しており、既存の Host ヘッダーの値を変更しています。

2. ヘッダーの削除

ヘッダーを削除するには、proxy_set_header ディレクティブに空の値を設定します。

location /api/ {
    proxy_pass http://backend_server;
    proxy_set_header X-Custom-Header "";
}

この例では、X-Custom-Header というヘッダーを削除しています。

バッファ設定の理解と適用

こちらでは、nginxでのバッファ設定の理解と適用についてお伝えしていきます。

  • バッファの役割
  • バッファの設定方法

バッファの役割

nginxのバッファは、リクエストやレスポンスのデータを一時的に保持する役割があります。

バッファリングを通じて、サーバーとクライアント間の通信の効率を向上させることが可能です。

例として、大きなファイルをダウンロードする際に、バッファが効率的なデータの転送を支援します。

バッファの設定方法

nginxのバッファ設定は、設定ファイル内で容易に変更できます。

主に以下の調整についてご覧ください。

  • HTTPバッファサイズの調整
  • プロキシバッファサイズの調整
  • ファストCGIバッファサイズの調整
  • 設定ファイルの再読み込み

1. HTTPバッファサイズの調整

クライアントヘッダーバッファのサイズを調整するには、以下のいずれかで次のように設定します。

  • httpブロック
  • serverブロック
  • locationブロック
large_client_header_buffers 4 8k;

2. プロキシバッファサイズの調整

プロキシバッファのサイズを調整するには、以下のブロック内で次のように設定します。

  • http
  • server
  • location
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;

3. ファストCGIバッファサイズの調整

FastCGIバッファのサイズを調整する場合、次のように設定します。

fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;

4. 設定ファイルの再読み込み

変更を有効にするために、Nginxを再起動または再読み込みしましょう。

sudo nginx -t # 設定のテスト
sudo nginx -s reload # 設定の再読み込み

上記の値は、システムや用途に応じて調整が必要です。

これらの値を変更する前に、ドキュメントを参照し、現在のシステムの要件と相互作用を理解すること。

適切なサイズを設定することで、パフォーマンスの最適化とリソースの効率的な使用が可能になります。

バックエンド設定の理解

こちらでは、nginxのバックエンド設定についてお伝えしていきます。

  • バックエンドサーバーの選定
  • 接続の設定と最適化

バックエンドサーバーの選定

nginxのバックエンドサーバーとは、nginxがプロキシとして動作する際に実際にリクエストを処理するサーバーのことを指します。

例として、ApacheやTomcatなどがあります。

選定に際しては、アプリケーションの要件に応じて適切なサーバーを選びましょう。

接続の設定と最適化

バックエンドサーバーへの接続の設定と最適化は、サイトパフォーマンスに大きく影響します。

以下のように多岐にわたる調整が可能です。

  • 接続の再利用
  • キャッシュ
  • タイムアウトの設定

接続の再利用

Nginxでは、keepalive ディレクティブを使って、アップストリームサーバーへの接続の再利用を設定できます。

以下のいずれかのブロック内で設定してください。

  • http
  • server
  • location
upstream backend {
    server backend.example.com;
    keepalive 32; # 接続の再利用を許可する接続数
}

キャッシュ

プロキシキャッシュを設定するには、キャッシュゾーンを定義し、それを利用する場所を指定します。

http {
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m;

    server {
        location / {
            proxy_cache my_cache;
            proxy_pass http://backend.example.com;
        }
    }
}

こちらの設定を具体的におこなうには、httpブロックが記載されている以下のファイルでおこないます。

/etc/nginx/nginx.conf

以下のような表記になります。

http {
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m;

    include       /etc/nginx/mime.types;
    ...続く

その後、設定に問題ないかをテストして、nginxをリロードしましょう。

nginx -t
nginx -s reload

タイムアウト

Nginxでは、さまざまなタイムアウトを設定できます。

  • クライアントタイムアウト
  • プロキシタイムアウト

クライアントタイムアウト

クライアントからの接続がタイムアウトするまでの時間を設定します。

client_body_timeout 12; # クライアントボディの読み取りタイムアウト
client_header_timeout 12; # クライアントヘッダーの読み取りタイムアウト

プロキシタイムアウト

アップストリームサーバーへの接続がタイムアウトするまでの時間を設定します。

proxy_connect_timeout 10;
proxy_send_timeout 15;
proxy_read_timeout 20;

これらの設定を適切に調整することで、ウェブサーバーのパフォーマンスと効率を改善できます。

変更後はNginxの再読み込みまたは再起動が必要です。

nginx -t
nginx -s reload

特定のユースケースに応じて、これらの設定を最適に調整することが重要です。

ドキュメントを参照し、実際のシステムでの挙動を確認することをおすすめします。

nginxリバースプロキシの具体的設定

こちらでは、nginxリバースプロキシの具体的設定についてお伝えしていきます。

  • リバースプロキシとは
  • 設定の基本

リバースプロキシとは

リバースプロキシはクライアントに対してひとつのエンドポイントを提供し、背後の複数のサーバーへのリクエストを分散する役割を果たします。

例として、セキュリティの強化や負荷分散、キャッシングの実装などが挙げられます。

設定の基本

nginxでのリバースプロキシの設定は比較的シンプルです。

具体的な設定例として、serverブロック内で、以下のようにします。

server {
#そのほかの記述
   
  location / {
	proxy_pass https://example.com/;
    }

#そのほかの記述
}

この設定によって指定されたパスのリクエストをバックエンドサーバーへ転送します。

リダイレクトの理解と実装

こちらでは、nginxでのリダイレクトの理解と実装についてお伝えしていきます。

  • リダイレクトの目的
  • nginxでのリダイレクト設定

リダイレクトの目的

リダイレクトは特定のURLから別のURLへユーザーを自動的に導く技術です。

例えば、サイト構造の変更や、特定のページへのトラフィックを向けるために使用されます。

nginxでのリダイレクト設定

nginxでのリダイレクト設定は、rewriteディレクティブを使用しておこないます。

以下にいくつかの例を挙げてみます。

  1. 旧URLから新URLへの301リダイレクト
  2. 非wwwからwwwへのリダイレクト
  3. HTTPSへのリダイレクト

1. 旧URLから新URLへの301リダイレクト

特定のパスから新しいパスへの恒久的なリダイレクトを設定します。

location ~ ^/oldpath/(.*)$ {
    rewrite ^/oldpath/(.*)$ /newpath/$1 permanent;
}

この例では、/oldpath/から始まるすべてのURLが/newpath/にリダイレクトされます。

2. 非wwwからwwwへのリダイレクト

サイトにアクセスする際の非wwwからwwwへのリダイレクト例です。

server {
    listen 80;
    server_name example.com;
    rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}

この例では、example.comへのリクエストがwww.example.comへとリダイレクトされます。

3. HTTPSへのリダイレクト

HTTPからHTTPSへのリダイレクトです。

server {
    listen 80;
    server_name example.com;
    return 301 https://example.com$request_uri;
}

この設定では、example.comへのHTTPリクエストがHTTPSにリダイレクトされます。

rewriteディレクティブやreturnディレクティブを使って、多岐にわたるリダイレクトの要件を柔軟に満たせます。

変更を反映させるには、設定の再読み込みまたは再起動が必要です。

sudo nginx -t
sudo nginx -s reload

複数のポートでの設定方法

こちらでは、nginxで複数のポートを使用する設定方法についてお伝えしていきます。

  • 複数ポートの必要性
  • 設定の方法

複数ポートの必要性

複数のポートを使用する設定は、異なるサービスやアプリケーションを同一のnginxサーバー上で稼働させる場合に必要です。

例として、HTTPとHTTPSの両方を提供する場合などが挙げられます。

設定の方法

複数のポートでの設定はlistenディレクティブを使用して行います。

例として、listen 80;listen 443 ssl;のように設定することで、それぞれのポートで異なるプロトコルを受け付ける設定が可能です。

# HTTPの設定 (ポート 80)
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
    }

    # HTTPからHTTPSへのリダイレクトもよく行われます。
    # return 301 https://$host$request_uri;
}

# HTTPSの設定 (ポート 443)
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    location / {
        proxy_pass http://localhost:8080;
    }
}

この設定例では、ポート80でHTTPリクエストを受け付け、ポート443でHTTPSリクエストを受け付けます。両方のlocationブロックで、リクエストをローカルホストのポート8080にプロキシします。

このように、複数のserverブロックを使用することで、同じNginxサーバー上で異なるポートをリッスンし、異なるサービスやアプリケーションを処理することができます。

変更を反映させるためには、設定ファイルのシンタックスチェックとNginxの再読み込みが必要です

nginx -t
nginx -s reload

nginx設定の確認方法

こちらでは、最終的なnginxの設定ファイルの確認についてお伝えしていきます。

  • 設定の整合性チェック
  • 設定の適用

設定の整合性チェック

nginxの設定ファイルは非常に柔軟ですが、それだけに誤設定のリスクも存在します。

設定の整合性チェックは、設定ファイルにエラーがないかを事前に確認する重要な工程です。

nginx -tコマンドを使うことで、設定のシンタックスチェックが可能です。

nginx -t

設定の適用

整合性が確認できたら、nginx -s reloadコマンドで新しい設定を適用します。

このコマンドによって、サービスの中断なく設定のリロードが可能です。

nginx -s reload

まとめ

当記事では、nginxとproxy_passの設定について学習してきました。

  • nginxは高いカスタマイズ性と効率性を提供します。本記事で紹介した各設定は、それぞれのニーズに応じた最適なWebサービスを提供するための基礎です。
  • proxy_passは、リバースプロキシとしてのnginxの強力な機能です。トラフィックのルーティング、負荷分散、セキュリティ強化など、多岐にわたる用途があります。

nginxにはまだ探求できる多くの機能があります。

本記事を基本に、さらなる高度な設定や最適化技術の学習を進めていくとよいでしょう。

実践的な知識の取得を目指し、今後のWebサービス構築に活用していただければと思います。

タイトルとURLをコピーしました