【apache】ポートでVirtualHostをする方法

apacheのVirtualHostは、サブドメインで違うコンテンツを運用するときによく使う方法です。
ただ、確認環境を用意するときは特にドメインを用意しない場合があります。
VirtualHostについて知識を集めるときに、サブドメインに関係する方法はよく出てきますが、ポートで対応する方法はあまり見つかりません。

さて、
今回は、ポート単位でページを出し分けする方法について記載します。

イントロダクション

この記事で得られること

  • ポートでVirtualHostのホスティングする方法がわかる。

環境

種類 バージョン
OS CentOS 6.5
apache 2.4.29
MariaDB 10.1.30
php 7.2.2

環境は前回作成したxampp環境を拡張しています。 http://blog.websandbag.com/entry/2018/03/19/000952

参考URL

下記が公式の解説ページです。

Apache Virtual Host documentation - Apache HTTP Server Version 2.4
バーチャルホストの例 - Apache HTTP サーバ バージョン 2.4

要件

ポートのみで切り替えますので、80番81番のポートで切り替えるようにします。

  • 80番ポートは、hogeディレクトリ
  • 81番ポートは、fugaディレクトリ

設定用のファイルのインクルードを有効にする。

VirtualHost用の設定ファイルを有効にします。
極端な話、httpd.confにそのまま記載しても良いと思います。
今回はapacheが用意している方法に合わせます。

httpd.confの中に、次の記述がありますので、コメント(#)を外します。

# Virtual hosts
Include etc/extra/httpd-vhosts.conf

xamppの場合、xamppのapacheのコンフィグは/opt/lampp/etc/httpd.confです。

VirtualHostの設定を記述

先ほど有効にした、httpd-vhosts.confの設定を変えます。

Listen 81

<VirtualHost <対象のIP>:80>
    ServerName hoge
    DocumentRoot /hoge/
    <Directory "/hoge/">
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>
</VirtualHost>
<VirtualHost <対象のIP>:81>
    ServerName fuga
    DocumentRoot /fuga/
    <Directory "/fuga/">
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>
</VirtualHost>

もし、既に運用しているサーバーで追加設定を行う場合は、既に80番ポートの<Directory>設定がされている場合があります。
その場合は、省略しても問題ありません。

また、今回は、Listen 81だけ設定しています。
既にListen 80を他の設定ファイルで宣言しているためです。
重複して設定できないので注意してください。

Tips

NameVirtualHostについて

情報を集めていると、NameVirtualHostの設定を目にします。
NameVirtualHostは、バーチャルホストでアクセスを許可するIP、ポートを指定するためのものです。
しかし、この設定は次期バージョンから不要になるようです。

実は当初、NameVirtualHostの設定で、<対象のIP>:80という設定をしていました。
この状態で、構文チェック(httpd -t)すると項名のようなエラーメッセージが出力されました。

NameVirtualHost has no effect and will be removed in the next release

これは、メッセージに書いてあるように、「次期バージョンでは削除されます」という注意です。
apache2.4の時点では使用できるかもしれませんが、以降は使用しない、もしくは代案が出るのかもしれません。

apache再起動

設定が完了したら、サーバーを再起動します。

$ httpd -t
# Syntaxエラーが出た場合は、別途調整してください。
$ httpd restart

ファイアウォールの許可

おそらく、この状態でアクセスするとconection refusedでページが表示できないと思います。
その場合、考えられる原因はファイアウォールです。
許可されているポートの確認は次のコマンド確認できます。

$ service iptables status
# おそらく、Chain INPUT (policy ACCEPT)配下に、81番の設定がないはずです。

81番ポートからのアクセスが許可されていませんので、許可する設定に変えます。

対応方法

次の手順で行います。

$ iptables -I INPUT 6 -p tcp --dport 81 -j ACCEPT
$ service iptables save

設定が終わると、次の状態になるかとおもいます。

$ service iptables status
# 省略
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:81


これで、設定は終わりです。
この状態で、http://<IPアドレス>http://<IPアドレス>:81でアクセスすれば、それぞれのページが表示できるようになるかと思います。