Nginxをリバースプロキシとして設定する方法:ステップバイステップガイド

LightNode
By LightNode ·

はじめに

Nginxは、世界で最も人気のあるウェブサーバーおよびリバースプロキシの一つで、高いパフォーマンス、スケーラビリティ、柔軟性で知られています。Nginxは、リバースプロキシとしてよく使用され、クライアントからバックエンドサーバーへのリクエストを転送することで、負荷分散、セキュリティ、キャッシュなどのさまざまな利点を提供します。

リバースプロキシは、クライアントデバイス(ブラウザなど)とバックエンドサーバー(ウェブサーバーやアプリケーションサーバーなど)の間に位置するサーバーです。クライアントがリクエストを送信すると、リバースプロキシはそのリクエストを適切なバックエンドサーバーに転送し、その後、サーバーの応答をクライアントに返します。このアプローチにより、トラフィックの集中管理が可能になり、セキュリティとパフォーマンスが向上します。

このガイドでは、Nginxをリバースプロキシとして設定するために必要なステップ(インストール、基本設定、SSL設定、負荷分散など)を順を追って説明します。シンプルなウェブアプリケーションを展開する場合でも、複雑なサーバーインフラストラクチャを管理する場合でも、Nginxはセキュリティと効率を向上させる強力なツールです。

このチュートリアルを終えると、以下のことが理解できるようになります:

  • Nginxで基本的なリバースプロキシを設定する方法。
  • 安全な通信のためにSSLを設定する方法。
  • 複数のバックエンドサーバー間でNginxを使用して負荷分散を行う方法。
How to Configure Nginx as a Reverse Proxy

リバースプロキシとは?

リバースプロキシは、クライアントデバイスとバックエンドサーバーの間に位置するサーバーで、クライアントからのリクエストを適切なバックエンドサーバーに転送し、サーバーからのレスポンスをクライアントに返します。基本的に、リバースプロキシは仲介役として機能し、クライアントからのリクエストをバックエンドサーバーの代わりに受け取り、それらを処理するためにサーバーに転送し、結果を返します。

フォワードプロキシとは異なり、フォワードプロキシはクライアントからインターネットへのリクエストを転送しますが、リバースプロキシはその逆を行います。つまり、クライアントからのリクエストを処理し、適切なバックエンドサーバーに送信します。この違いは重要で、リバースプロキシはバックエンドサーバーをインターネットから直接的に隠す役割を果たし、セキュリティやプライバシーを強化します。

フォワードプロキシとリバースプロキシの違い

FeatureForward ProxyReverse Proxy
Primary PurposeRelays client requests to the internet.Relays client requests to backend servers.
LocationBetween client and the internet.Between client and backend server(s).
VisibilityClients know about the forward proxy.Clients typically don't know about the reverse proxy.
Common Use CasesWeb filtering, bypassing geographical restrictions, anonymity.Load balancing, security, caching, SSL termination.

リバースプロキシの使用事例

リバースプロキシは、インフラストラクチャに多くの利点を提供できます。主な利点は次の通りです:

  1. ロードバランシング:受信したトラフィックを複数のバックエンドサーバーに分散し、パフォーマンス、信頼性、スケーラビリティを向上させます。これにより、単一のサーバーがリクエストで圧倒されることを防ぎます。

  2. セキュリティ:バックエンドサーバーのアイデンティティや内部構造を隠し、インターネットからの直接的な露出を防ぎます。リバースプロキシは、ウェブアプリケーションファイアウォールやアクセス制御などの追加的なセキュリティ層を提供することもできます。

  3. キャッシュ:バックエンドサーバーからのレスポンスをキャッシュし、バックエンドリソースの負荷を減らし、頻繁にリクエストされるコンテンツの応答時間を短縮します。

  4. SSLターミネーション:バックエンドサーバーの代わりに、SSL(Secure Sockets Layer)暗号化と復号化を処理します。これにより、SSL証明書の管理が簡素化され、バックエンドサーバーの計算負荷が軽減されます。

  5. 圧縮と最適化:レスポンスをクライアントに送信する前に圧縮し、帯域幅の使用を減らし、ロード時間を改善します。

  6. コンテンツ配信:複数のバックエンドサーバーからコンテンツを配信するために使用でき、クライアントに一貫したインターフェースを提供し、異なるサーバーリソースをバックグラウンドで管理します。

前提条件

Nginxをリバースプロキシとして設定する前に、いくつかの前提条件を満たしておく必要があります。これには、Nginxに関する基本的な知識、サーバーへのアクセス、および必要なソフトウェアがインストールされていることが含まれます。このセクションでは、開始するために必要なものを説明します。

1. Nginxの基本的な知識

Nginxをリバースプロキシとして設定するには、Nginxがどのように機能するか、設定ファイルやその構造について基本的な理解が必要です。Nginxに不慣れな場合は、公式Nginxドキュメントを参照して、ソフトウェアについてさらに詳しく理解することができます。

Nginxは設定ファイルを使用し、通常は/etcディレクトリ内に格納されています。

2. サーバーにNginxをインストールする

サーバーにNginxをインストールする必要があります。以下は、一般的なLinuxディストリビューションにおけるインストール手順です。

Ubuntu/DebianにNginxをインストールする

UbuntuやDebianベースのシステムにNginxをインストールするには、以下のコマンドを使用します:

sudo apt update
sudo apt install nginx

インストール後、Nginxが実行されているかどうかを確認するには、以下のコマンドを使用します:

sudo systemctl status nginx

もしNginxが実行されていない場合、以下のコマンドで起動できます:

sudo systemctl start nginx

CentOS/RHELにNginxをインストールする

CentOSやRHELベースのシステムでは、以下のコマンドを使用します:

sudo yum install epel-release
sudo yum install nginx

Nginxを起動するには:

sudo systemctl start nginx

Nginxインストールの確認

Nginxがインストールされたら、ブラウザを開き、サーバーのIPアドレス(例:http://your_server_ip)にアクセスして、Nginxのウェルカムページが表示されるか確認します。

また、コマンドラインから以下を実行してテストすることもできます:

curl http://localhost

デフォルトのNginx HTMLページの内容が表示されるはずです。

3. バックエンドサーバー(テスト用にオプション)

Nginxは、さまざまな種類のバックエンドサーバー(ウェブアプリケーションやAPIサーバーなど)のリバースプロキシとして設定できますが、このチュートリアルでは、テスト用にシンプルなバックエンドサーバーを使用します。特定のポートで動作するウェブアプリケーション(Node.jsやPython Flaskアプリケーションなど)を使用するか、シンプルなHTTPサーバーをセットアップすることができます。

例えば、以下のコマンドで基本的なpython3 HTTPサーバーをインストールして、リバースプロキシの設定をテストできます:

# ポート8080でシンプルなHTTPサーバーを起動
python3 -m http.server 8080

これで、http://localhost:8080 で基本的なサーバーが起動します。このサーバーをバックエンドサーバーとして、リバースプロキシ設定のテストに使用できます。

4. コマンドラインアクセス

サーバーにコマンドラインアクセスが必要です。ターミナルを使うか、リモート作業の場合はSSHを使用してアクセスします。

sudo systemctl enable nginx

5. テキストエディタ

設定ファイルを編集するためには、テキストエディタが必要です。ほとんどのLinuxシステムでは、nanovim、またはviなどのエディタを使用できます。例えば:

sudo nano /etc/nginx/nginx.conf

こちらの出力が表示され、Nginxがアクティブで実行中であることが確認できます。

Nginx のインストール確認 (Ubuntu/Debian)

Nginx がインストールされて動作していることを確認するために、ウェブブラウザを開いてサーバーの IP アドレスを入力します。デフォルトの Nginx ウェルカムページが表示されるはずです。これにより、Nginx が正しく動作していることが確認できます。

また、curl を使用してテストすることもできます:

curl http://localhost

デフォルトの Nginx ページの HTML コンテンツが返されるはずです。

CentOS/RHEL に Nginx をインストール

CentOS、RHEL、または Fedora ベースのシステムの場合、次の手順で Nginx をインストールできます:

  1. EPEL リポジトリのインストール
    最初に、Nginx やその他の便利なパッケージを含む EPEL (Extra Packages for Enterprise Linux) リポジトリを有効にする必要があります。

    sudo yum install epel-release
    
  2. Nginx のインストール
    yum パッケージマネージャを使用して Nginx をインストールします:

    sudo yum install nginx
    
  3. Nginx の起動
    インストール後、Nginx サービスを起動します:

    sudo systemctl start nginx
    
  4. Nginxを自動起動するように設定
    サーバーが再起動後にNginxが自動的に起動するようにするには、次のコマンドを使用します:

    sudo systemctl enable nginx
    
  5. Nginxのステータスを確認
    Nginxが正常に実行されていることを確認するために、ステータスをチェックします:

    sudo systemctl status nginx
    

    これにより、Nginxがアクティブで実行中であることを示す出力が表示されます。

Nginxのインストール確認(CentOS/RHEL)

Ubuntu/Debianと同様に、ブラウザでサーバーのIPアドレスにアクセスすることで、Nginxが実行されているか確認できます。デフォルトのNginxウェルカムページが表示されるはずです。

または、curlを使用して確認できます:

curl http://localhost

これにより、デフォルトのNginxページのHTMLコンテンツが表示されます。

よくある質問(FAQ)

リバースプロキシとフォワードプロキシの違いは何ですか?

リバースプロキシは、クライアントデバイスとバックエンドサーバーの間に位置し、クライアントのリクエストを適切なサーバーに転送し、その後レスポンスをクライアントに返します。クライアントはリバースプロキシの存在を知りません。リバースプロキシはバックエンドサーバーへのゲートウェイとして機能します。

一方、フォワードプロキシは、クライアントとインターネットの間に位置します。クライアントのリクエストをフィルタリングしたり、制御したり(例えば、匿名性やアクセス制限のため)するために使用され、クライアントはプロキシの存在を認識しています。

なぜNginxをリバースプロキシとして使用すべきですか?

Nginxは、軽量で高パフォーマンスなウェブサーバーおよびリバースプロキシであり、そのスケーラビリティ、セキュリティ機能、設定の簡便さから広く使用されています。Nginxは多数の同時接続を効率的に処理でき、以下のような機能を提供します:

  • ロードバランシング: 複数のバックエンドサーバーにトラフィックを分散します。
  • キャッシング: バックエンドサーバーの負荷を減らすため、レスポンスをキャッシュします。
  • SSL終端: SSLの暗号化と復号化を処理し、バックエンドサーバーの負荷を軽減します。
  • セキュリティ: バックエンドサーバーをインターネットから直接公開することなく保護します。

リバースプロキシの設定が正しく動作しているかどうかはどう確認できますか?

リバースプロキシの設定が正しく動作しているかどうかは、いくつかの方法で確認できます:

  • ログの確認: Nginxのログは通常、/var/log/nginx/access.log/var/log/nginx/error.log に保存されています。これらのログを確認することで、問題を特定することができます。

    tail -f /var/log/nginx/access.log
    tail -f /var/log/nginx/error.log
    
  • Nginxがリクエストを転送しているか確認: curl またはブラウザを使用してリバースプロキシにアクセスし、リクエストがバックエンドサーバーに正しく転送されているかを確認します。

    curl http://your_domain_or_ip
    
  • テストの実施

  • バックエンドサーバーを直接テストする: バックエンドサーバーのIPアドレスとポートに直接アクセスして、正しく応答しているか確認します(例: http://localhost:8080)。

リバースプロキシにSSLを有効にするにはどうすればよいですか?

リバースプロキシにSSLを有効にするには、Certbotを使用して無料のSSL証明書を取得できるLet’s Encryptを利用します。以下はその手順の概要です:

  1. CertbotとNginxプラグインをインストールする(Ubuntu/Debianの場合):

    sudo apt install certbot python3-certbot-nginx
    
  2. Certbotを使用してSSL証明書を取得する:

    sudo certbot --nginx -d your_domain.com
    

    指示に従って証明書の生成プロセスを完了します。

  3. NginxをSSLで使用するように設定する:

    Nginxは自動的にSSLの設定を作成しますが、必要に応じてそれを編集できます。基本的なSSL対応の設定は次のようになります:

    server {
        listen 443 ssl;
        server_name your_domain.com;
    
        ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    server {
        listen 80;
        server_name your_domain.com;
        return 301 https://$host$request_uri;
    }
    
  4. SSLの確認:

    NginxをSSLで設定した後、SSL証明書が正常に動作しているか確認するには、https://your_domain.comにアクセスするか、SSL LabsのSSLテストのようなオンラインツールを使用できます。

Nginxでロードバランシングを設定するには?

ロードバランシングを設定するには、Nginxでupstreamブロックを定義して、複数のバックエンドサーバーにトラフィックを分散させます。基本的な例は以下の通りです:

upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

この設定では、localhost:8080localhost:8081で実行されている2つのバックエンドサーバー間でリクエストをバランスさせます。

Nginxのリバースプロキシがリクエストを転送しない場合、どうすればよいですか?

以下のトラブルシューティング手順を試してみてください:

  • Nginxの設定構文を確認する: Nginxを再起動する前に、設定ファイルの構文を確認します:

    sudo nginx -t
    

    エラーがあれば、Nginxがエラーメッセージを出力するので、それに従って修正してください。

  • ファイアウォールの設定を確認する: ファイアウォールが正しいポート(例えば、HTTP用のポート80、HTTPS用のポート443)でトラフィックを許可していることを確認してください。ufwfirewalldなどのツールを使用して、ファイアウォールルールを確認および調整できます。

  • Nginxのログを確認する: Nginxのログは、プロキシ転送に関するエラーを探す最適な場所です:

    tail -f /var/log/nginx/error.log
    

    これにより、Nginxがリクエストの転送中に問題を抱えているかどうかを把握できます。

NginxでWebSocket接続を処理するには?

WebSocket接続は永続的な接続を使用するため、特別な処理が必要です。Nginxの設定に次のヘッダーを追加して、WebSocket接続が正しくプロキシされるようにします:

location /ws/ {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

この設定により、Nginxはlocalhost:8080のバックエンドサーバーへのWebSocket接続を正しく処理できるようになります。

Nginxをパフォーマンス向上のために最適化するには?

Nginxのパフォーマンスを向上させるためのいくつかの最適化のヒントは以下の通りです:

  • gzip圧縮を有効にする: 静的ファイルを圧縮して、帯域幅の使用量を減らし、ページの読み込み時間を短縮します。

    gzip on;
    gzip_types text/plain text/css application/javascript application/json;
    
  • キャッシュの利用: 頻繁にリクエストされるコンテンツに対してキャッシュを使用して、バックエンドサーバーの負荷を減らします。

    location /images/ {
        proxy_cache my_cache;
        proxy_cache_valid 200 1d;
    }
    
  • 接続タイムアウトの設定: 遅い接続やアイドル接続に対して不必要に待たないように、適切なタイムアウトを設定します。

    proxy_read_timeout 90;
    proxy_connect_timeout 90;
    
  • ワーカープロセスの増加: 同時接続をより多く処理できるように、ワーカープロセスの数を増やします。これはnginx.confで調整できます:

    worker_processes auto;
    

Here’s the complete translation in Japanese with proper formatting:

バックエンドサーバーをNginxで保護する方法

バックエンドサーバーのセキュリティを強化するために、次の方法を検討できます:

  • HTTP認証の使用: バックエンドへのアクセスを、シンプルなユーザー名とパスワードで保護します。

    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
    
  • IPによるアクセス制限: 特定のIPアドレスのみからバックエンドサーバーへのアクセスを許可します。

    location / {
        allow 192.168.1.0/24;
        deny all;
    }
    
  • Webアプリケーションファイアウォール(WAF)の使用: ModSecurityのようなWAFを設定して、攻撃からさらに保護を提供します。