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

概要

Apacheでは、バーチャルホスト機能を利用すると、一つのApache上に複数のWebサイトを構築することができます。例えば、一つのWebサーバ上にA.com、B.com、C.comといった、三つのドメインのWebサイトを個別で設定しながら処理をすることができます。

また、そもそも一つにせず、サービス(httpd)を複製して、それぞれのWebサーバでWebサイトを構築することでも再現できます。

この二つの方法のメリット・デメリットを以下にまとめます。

方法メリットデメリット
バーチャルホスト機能サービス一つ分のリソースの消費で済むサービスが停止すると全てのドメインのWebサイトが表示されなくなる
サービスの複製一つのサービスが停止しても他のサービス上のWebサイトには影響がない複製したサービス分のリソースを消費する

今回は、バーチャルホスト機能の方ではなく、サービスの複製による複数サイトの構築をしてみようと思います。

環境

  • VirtualBox 6.1.16
  • 仮想マシン(CentOS8, ブリッジアダプター)
  • Apache 2.4.37

事前準備

作業中にIPアドレスが変わると面倒なので固定させます。まずは以下のコマンドでインターフェース名の確認と(enp0s3)、現在のIPアドレスの確認をします(192.168.0.9)。

# 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
--------(省略)---------

今回はせっかくなので192.168.0.10でIPアドレスを固定しようと思います。

ではnmcliコマンドで設定していきます。nmcliは引数にオブジェクトとコマンドを指定できます。ここでは、connection(cと省略できる)オブジェクトと、modify(mと省略できる)コマンドを使用し、IPアドレスやゲートウェイ、参照先DNSサーバのアドレス設定をしています。最後は、設定を反映させるためにup(uと省略できる)コマンドを使用しています。

# nmcli c m enp0s3 ipv4.addreess 192.168.0.10/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 

Apache

インストール

# dnf install httpd

インストールできたらファイアウォールの設定変更をします。http(80番ポート)、https(443番ポート)を開放し、反映させます。

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

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

# systemctl enable httpd --now

動作確認

自分のIPアドレスを打ち込み、テストページが表示されることを確認します。

サービス(httpd)の複製

ではここからサービスの複製に取り掛ります。Apacheの設定ファイルは/etc/httpdディレクトリ以下に配置されているので、/etcに移動した後、このディレクトリごとコピーします。コピー先のファイル名はhttpd_testとしています。

# cd /etc
# cp -rp httpd httpd_test
# ll | grep httpd
drwxr-xr-x.  5 root root      105 11月 13 16:15 httpd
drwxr-xr-x.  5 root root      105 11月 13 16:15 httpd_test

cpコマンドのオプションの説明は以下の通りです。

オプション説明
-r再帰的にコピーする。ディレクトリをコピーするときは必ず使う。
-pコピー元のファイル属性をそのままコピーする。

次は、httpd_testのメイン設定ファイルをいじります。もちろん今のままだと、コピー元のhttpdと設定がバッティングしてしまい、うまく動作しません。以下のように編集します(コメントアウト部分や変更しない設定値は省いています)。

# cd httpd_test/conf
# vi httpd.conf

# httpd_testが利用するトップディレクトリを指定
ServerRoot "/etc/httpd_test"

# デーモンのプロセスIDを/etc/httpd_test/run/httpd_test.pidに格納
# このように相対パスを指定すると、ServerRootからの相対パスとなる
PidFile run/httpd_test.pid

# 8080番ポートで待ち受ける
Listen 8080

# サーバ自身のホスト名とポート番号を明示
ServerName localhost:8080

# ドキュメントルートを指定。このディレクトリ以下に表示させたいファイルを置く
DocumentRoot "/var/www/html_test"

# ドキュメントルート以下の設定
<Directory "/var/www/html_test">
   # FollowSymLinks → シンボリックリンクを使って別のディレクトリからアクセスすることができる
   Options FollowSymLinks

   # 外部設定ファイルによる変更を禁止
   AllowOverride None

  # アクセスしてくる全てのホストを許可
   Require all granted
</Directory>

# エラーを記録するログファイルを指定
ErrorLog "logs/error_log_test"

# log_config_moduleが有効であればCustomLogを設定
<IfModule log_config_module>
  # アクセスログのファイル名とLogFormatで定義したログ書式名を指定
   CustomLog "logs/access_log_test" combined
</IfModule>

書式が正しいかどうかチェックします。

# apachectl configtest
syntax OK

この際に、サーバ名を設定してくださいといったようなエラーがでた場合、/etc/httpd/conf/httpd.confの方のServerNameディレクティブにも、ホスト名とポート番号を明記してあげてください。明記しなくても動作には問題ないです。

表示させるファイルを置くディレクトリを/var/www/html_testに変更しましたが、まだこのディレクトリは存在しません。

# cd /var/www
# ll      #html_testは存在しない
drwxr-xr-x. 2 root root 6  9月 16 00:46 cgi-bin  #今回cgiは使用しないので無視します。
drwxr-xr-x. 2 root root 6  9月 16 00:46 html

なので、cpコマンドでhtmlディレクトリ以下をhtml_testディレクトリにコピーし、新しく作ります。

# cp -rp html html_test
# ll
drwxr-xr-x. 2 root root 6  9月 16 00:46 cgi-bin
drwxr-xr-x. 2 root root 6  9月 16 00:46 html
drwxr-xr-x. 2 root root 6  9月 16 00:46 html_test

といってもこのディレクトリの中は空なので、index.htmlを簡単に作ります。

# cd html_test
# vi index.html
<h1>8080</h1>

:wq!

ユニットファイル複製

では、systemctlコマンドによるサービスの起動や停止を行うために、httpd_test用のユニットファイルを用意します。今回はhttpd.serviceファイルをコピーして、少し手を加えます。

# cp -p /usr/lib/systemd/system/httpd.service /usr/lib/systemd/system/httpd_test.service

編集するのは、ExecStart(起動時に実行するコマンドを指定)とExecReload(リロード時に実行するコマンドの指定)の二行のみで大丈夫です。ここで何をしているかというと、/usr/sbin/httpdというApacheの本体プログラムに、httpd_test用の設定ファイルを適用して起動するよう設定しています。

# cd /usr/lib/systemd/system
# vi httpd_test.service
------(省略)------
ExecStart=/usr/sbin/httpd -f /etc/httpd_test/conf/httpd.conf $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd -f /etc/httpd_test/conf/httpd.conf $OPTIONS -k graceful

では、作成したユニットファイルを反映させ、httpd_test.serviceがあることを確認します。

# systemctl daemon-reload
# system list-unit-files | grep htttpd
httpd.service                              enabled  
httpd@.service                             disabled 
httpd_test.service                         disabled 
httpd.socket                               disabled 

次にファイアウォールの設定で、8080番ポートを開放することにします。

# firewall-cmd --add-port=8080/tcp --zone=public --permanent
success
# firewall-cmd --reload
success

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

# systemctl enable httpd_test --now

動作確認

ではhttp://IPアドレス:8080にアクセスします。するとこのように/var/www/html_test(ドキュメントルート)以下にあるindex.htmlが表示されました。

ちなみにhttp://IPアドレス:8080/index.htmlとわざわざ入力しなくてもindex.htmlが表示されるのは、/etc/httpd_test/conf/httpd.confのDirectoryIndexディレクティブにindex.htmlと指定しているからです。

一応最後に80ポートにアクセスして、無事に表示できることも確認します。

以上で、Apacheのサービス複製による複数サイトの構築は完了です。

参考文献

Webサーバ(Apache)の複数プロセス起動による複数サイト構築方法

mpm_common – Apache HTTP サーバ バージョン 2.4

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

Comments

Copied title and URL