リバースプロキシを使って1つのグローバルIPアドレスで複数のウェブサーバーへ振り分ける【UbuntuでNginxのリバースプロキシを設定する】

自宅で複数のウェブサーバーなどを運用するようになり、ウェブサーバーごとにドメインを設定したくなりました。

今まで公開したいウェブサーバーが1台だったので、ルーターのポートフォワードで運用していました。 ルーターのポートフォワード設定だと、WAN側のポートとLAN側のサーバーのIPアドレス・ポートを紐付けています。 そのため、ウェブサーバーで絶対的に使われる80番ポートが割当可能なサーバーは1台のみで、2台目以降はポートを変える必要があり、運用の観点で現実的ではありません。

そこで、アクセスされるホスト名でウェブサーバーへの振り分けを行う方法を探していたらリバースプロキシが最もメジャーな方法でした。

今回は、リバースプロキシの概要と、Ubuntu環境へのインストール・設定方法について説明します。

リバースプロキシとは

一般的に、クライアントがウェブサーバーへアクセスすると、ルータがウェブサーバへリクエストを直接振り分けてウェブサーバーがクライアントへ直接応答を返していました。。

リバースプロキシは、クライアントとウェブサーバの間に立って要求を代理で処理します。

この時、ウェブサーバはクライアントではなくリバースプロキシに応答を返し、リバースプロキシがクライアントに応答を返します。

間にリバースプロキシが挟まることによるメリットを以下に記載します。

リバースプロキシのメリット

簡単に言うと、アクセス速度が向上します。

リバースプロキシの代表格NginxやApacheSquidなどには、キャッシュが用いられています。 1度目のアクセスで、リバースプロキシサーバーからウェブサーバーへリクエストを発行し、結果をリバースプロキシサーバーにキャッシュします。 2度目以降のリクエストは、リバースプロキシサーバーのキャッシュを返すため、応答速度が向上します。

次章から、Nginxのインストールから、リバースプロキシの設定方法について説明します。

Nginxによるリバースプロキシ設定

環境

  • OS: Ubuntu 16.04 Server Edition
  • サーバー構成
    • リバースプロキシサーバー(rproxy/192.168.1.10)
    • ウェブサーバーA(serverA/192.168.1.100/a.com)
    • ウェブサーバーB(serverB/192.168.1.200/b.com)

インストール手順

リバースプロキシサーバーにNginxをインストールします。

$ sudo apt-get install nginx

インストールされたnginxのバージョンを確認します。

$ nginx -v
nginx version: nginx/1.10.0 (Ubuntu)

リバースプロキシの設定

リバースプロキシサーバーにおいて、Nginxの設定ファイルを編集します。

ウェブサーバーAに振り分ける設定

リバースプロキシを設定します。

$ sudo vi /etc/nginx/sites-available/web_serverA
server {
    server_name serverA.example.com; #クライアントがアクセスするURL
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    location / {
        proxy_pass http://192.168.1.100; #ウェブサーバーAのIPアドレス(/etc/hostsに記載しているホスト名も可)
    }
}

設定ファイルを有効化します。

$ sudo ln -s /etc/nginx/sites-available/web_serverA /etc/nginx/sites-enabled/

ウェブサーバーBに振り分ける設定

リバースプロキシを設定します。

$ sudo vi /etc/nginx/sites-available/web_serverB
server {
    server_name serverB.example.com; #クライアントがアクセスするURL
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    location / {
        proxy_pass http://192.168.1.200; #ウェブサーバーBのIPアドレス(/etc/hostsに記載しているホスト名も可)
    }
}

$ sudo ln -s /etc/nginx/sites-available/web_serverB /etc/nginx/sites-enabled/

設定の反映

以下のコマンドで設定を反映します。

$ sudo systemctl reload nginx

エラーがでた場合は、設定ファイルを見直して、再度上記コマンドを実行してください。

アクセス確認

server_nameに設定したアドレスにアクセスして、それぞれのウェブサーバーのページが表示されていれば、正しく設定されています。

まとめ

Nginxによるリバースプロキシ設定手順について説明しました。 リバースプロキシを使えば、1つのグローバルIPアドレスで、複数サーバーへの振り分けが実現可能です。