Nginxのリバースプロキシ設定で、バーチャルホスト機能を使用したApacheと連携させる

概要

今回はNginxを使用したリバースプロキシサーバを構築し、Apacheと連携させてみようと思います。具体的には、まず仮想マシンを二つ用意し、一つはリバースプロキシサーバとしてNginxを構築、もう一方には名前ベースのバーチャルホスト機能を使用したApacheを構築します。

リバースプロキシサーバとは?

リバースプロキシサーバとは、外部のクライアントからのリクエストを受け付け、内部ネットワークのサーバへのアクセスを代理で行うサーバのことです。

ちなみにもう一つのフォワードプロキシサーバというのは、内部ネットワーク内のクライアントのリクエストを受け付け、外部のサーバへのアクセスを代理で行うサーバのことです。

つまり、クライアント側にあるのか、サーバ側にあるのかによって、両者の区別はつくと思います。

バーチャルホスト機能とは?

今回Apache側で使用しているバーチャルホスト機能とは何か説明します。

バーチャルホストとはつまり、一つのApache上に複数のWebサイトを構築する機能のことです。なので、A.com、B.com、C.comといった複数のドメインを一つのWebサーバ上で処理することができるということになります。

また、バーチャルホストにはIPベースのものと名前ベースのものがあります。両者の違いは以下の通りです。

バーチャルホストの種類説明
IPベース複数のIPアドレスを使用して複数サイトを構築する
名前ベース一つのIPアドレスに対して、複数のドメインを使用して複数サイトを構築する

今回使用したのは、名前ベースのバーチャルホストで、web1.example.comとweb2.example.comの二つのドメインで検証しています。

環境

  • ホストOS(macOS Catalina)
  • VirutalBox 6.1.16
  • 仮想マシン(CentOS8) × 2
  • Apache 2.4.37
  • Nginx 1.18.0

事前準備

IPアドレス固定

度々IPアドレスが変わると面倒なので、最初にIPアドレスを固定させます。今回は、リバースプロキシサーバ側のIPアドレスを192.168.0.7とし、Webサーバ側のIPアドレスを192.168.0.9とします。

リバースプロキシサーバ側(Nginx)

インターフェース名を確認し(enp0s3)、nmcliコマンドで変更していきます。コマンドの詳しい解説は以下の記事の事前準備に記述しています。

Apacheでバーチャルホスト機能を利用せず、サービス複製で複数サイトを構築する

# nmcli c m enp0s3 ipv4.addreess 192.168.0.7/24
# nmcli c m enp0s3 ipv4.gateway 192.168.0.1
# nmcli c m enp0s3 ipv4.dns 192.168.0.1
# nmcli c m enp0s3 ipv4.method manual
# nmcli c u enp0s3 
# ip a
---------(省略)------------
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:c1:f9:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.7/24 brd 192.168.0.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
---------(省略)-------------

Webサーバ側(Apache)

# nmcli c m enp0s3 ipv4.addreess 192.168.0.9/24
# nmcli c m enp0s3 ipv4.gateway 192.168.0.1
# nmcli c m enp0s3 ipv4.dns 192.168.0.1
# nmcli c m enp0s3 ipv4.method manual
# nmcli c u enp0s3 
# ip a
-----------(省略)-------------
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:6c:d9:ed brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.9/24 brd 192.168.0.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
-----------(省略)-------------

SELinux 無効化

リバースプロキシサーバ側&Webサーバ側

getenforceコマンドでSELinuxが起動していることが確認できた場合は、/etc/selinux/configファイルを以下のように編集し、再起動させます。

# getenforce
enforcing

# vi /etc/selinux/config
-----(省略)--------
SELINUX=disabled

:wq!

# reboot

Webサーバ側(Apache)

ではまずWebサーバ側から構築していきます。

Apache インストール

# dnf install httpd

ファイアウォール設定

デフォルトではhttp, https通信が許可されていないので、ポートを開放させます。

# firewall-cmd --add-service=http --zone=public --permanent
success
# firewall-cmd --add-service=https --zone=public --permanent
success
# firewall-cmd --reload 
success

動作確認1

自動起動&今すぐ起動の設定をします。

systemctl enable httpd --now

URLにIPアドレス(192.168.0.9)を入力してアクセスします。以下のようにテストページが表示されれば問題ないです。

バーチャルホスト設定

では名前ベースのバーチャルホストの設定をしていきます。

まずはweb1.example.com用のindexページとweb2.example.com用のindexページを簡単に作ります。

# mkdir /var/www/web1 /var/www/web2
# echo web1 > /var/www/web1/index.html
# echo web2 > /var/www/web2/index.html

メイン設定ファイルを変更していきます。バーチャルホスト機能を使用するときは、VirtualHostディレクティブを使用します。

# cd /etc/httpd/conf
# vi httpd.conf 
------(省略)--------
ServerName localhost:80

------(省略)--------
# 利用するIPアドレスとポート番号を指定
<VirtualHost 192.168.0.9:80>
     # 利用するサーバ名を指定
        ServerName web1.example.com
     # ドキュメントルートを指定
        DocumentRoot /var/www/web1
</VirtualHost>

<VirtualHost 192.168.0.9:80>
        ServerName web2.example.com
        DocumentRoot /var/www/web2
</VirtualHost>

:wq!

編集完了したら以下のコマンドで構文チェックします。

# apachectl configtest 
Syntax OK

ちなみに、名前ベースのVirtualHostを使用するとき、NameVirtualHostディレクティブを使用するように説明している書籍が多くありますが、そのディレクティブを使用して構文チェックをすると以下のようなメッセージが表示されます。

# apachectl configtest
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf/httpd.conf:353
Syntax OK

つまり、NameVirtualHostディレクティブは無くても大丈夫で、次のリリース以降なくなるだろうとのことです。なので今回は指定していません。

Apacheを再起動させます。

# systemctl restart httpd

動作確認2

では名前解決ができるよう/etc/hostsに以下の内容を追記します。

# vi /etc/hosts
-------(省略)----------
192.168.0.9 web1.example.com
192.168.0.9 web2.example.com

:wq!

まずはcurlコマンドでアクセスできるか確認します。

# curl http://web1.example.com
web1
# curl http://web2.example.com
web2

今度はWebブラウザから確認するのですが、Apacheを動作させている仮想マシンはCUIなので、ホストOSのWebブラウザを使用します。

そのため、名前解決できるように、ホストOS側の/etc/hostsに以下の内容を追記します。

% vi /etc/hosts
-------(省略)----------
192.168.0.9 web1.example.com
192.168.0.9 web2.example.com

:wq!

web1.example.comとweb2.example.comにそれぞれアクセスし、それぞれのページが表示されることを確認します。

リバースプロキシサーバ側(Nginx)

Nginx インストール

今回は最新のstable版のNginxをインストールしようと思うので、/etc/yum.repos.dディレクトリ以下に新しくリポジトリを登録します。以下の手順はnginx: Linux packagesを参考にしています。

# cd /etc/yum.repos.d/
# vi nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

編集を終えたらインストールします。

# dnf install nginx
# nginx -v
nginx version: nginx/1.18.0

ファイアウォール設定

# firewall-cmd --add-service=http --zone=public --permanent
success
# firewall-cmd --add-service=https --zone=public --permanent
success
# firewall-cmd --reload
success

自動起動&今すぐ起動の設定をします。

# systemctl enable nginx --now

動作確認

まずはcurlコマンドで起動しているか確認します。

# curl http://192.168.0.7
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

次はWebブラウザでIPアドレスを入力し、確認します。

リバースプロキシ設定

リバースプロキシの設定用のファイルとして、revproxy.confを/etc/nginx/conf.dディレクトリ以下に作成します。内容は以下の通りです。

# cd /etc/nginx/conf.d
# vi revproxy.conf
server {
     #8080番ポートで待ち受ける
        listen 8080;
     #ホスト名
        server_name localhost;
     #/ディレクトリに対する設定
        location / {
                #転送先のURLを指定
                proxy_pass http://web1.example.com:80;
        }
}

server {
        listen 8081;
        server_name localhost;
        location / {
                proxy_pass http://web2.example.com:80;
        }
}



:wq!

このままだと名前解決ができず、そもそもNginxの起動に失敗すると思うので、/etc/hostsファイルに以下の内容を追記します。

# vi /etc/hosts
-------(省略)----------
192.168.0.9 web1.example.com
192.168.0.9 web2.example.com

:wq!

動作確認の前にNginxを再起動させます。

# systemctl restart nginx

動作確認

ではまずcurlコマンドで動作確認をしてみます。リバースプロキシサーバのIPアドレスで8080番ポートと8081番ポートをそれぞれ確認してみます。

# curl http://192.168.0.7:8080
web1
# curl http://192.168.0.7:8081
web2

このように、8080番へのアクセスはweb1.example.comのルートディレクトリに転送され、8081番へのアクセスはweb2.example.comのルートディレクトリに転送されていることがわかります。

最後にWebブラウザでもそれぞれ確認してみます。

このように無事表示されました。以上から、Nginxのリバースプロキシ設定を使用し、Apache上の複数サイトと連携することが確認できました。

参考文献

標準テキスト CentOS7 構築・運用・管理パーフェクトガイド

nginx: Linux packages

【Linux技術動画】リバースプロキシとは?Nginxを使って構築します! ※約20分

Comments

Copied title and URL