メモ > サーバ > 各論: エトセトラ > Apacheでバーチャルホスト
Apacheでバーチャルホスト
※一つのサーバに複数のドメイン・サブドメインを割り当てて使用する
サーバリソースの有効活用ができる
※バーチャルホストの作成場所は任意だが、
/var/www/html 内に作ると、各バーチャルホスト用に非公開ディレクトリを設けられないので避ける(/var/www/html 自体が公開ディレクトリのため)
ここでは /var/www/vhosts 内に作成するものとする。その際の各ディレクトリ名を
/var/www/vhosts/example.com/
/var/www/vhosts/pre.example.com/
のようにすると、ドメインが未決定の場合に問題になる
また、ドメインが変更される可能性もあるし、複数ドメインが割り当てられる可能性もある
よって
/var/www/vhosts/example/
/var/www/vhosts/pre_example/
のように作成するほうが良さそう
複数サイトを管理しないのなら、単に product や staging や develop でいいかもしれない
が、後から他サイトがつかされる可能性はあるので、案件名が判る文字をディレクトリ名に含めておく方が無難
※IPアドレスでアクセスしたときはIPアドレスもしくはサーバ名だけが表示されるページにアクセス、
ドメインを指定してアクセスしたら対応するページにアクセス。
とすると管理しやすいかも
※バーチャルホストが不要な案件でも、後々検収環境が追加されたりを想定して、常にバーチャルホストにしておくといいかも
※SSL用の設定は丸ごと移行させないと、デフォルト値が上書きされない状態で反映されるかも?要検証
名前ベースの仮想ホスト
http://www.adminweb.jp/apache/virtual/index2.html
バーチャルホスト設定(Apache)
http://centossrv.com/apache-virtualhost.shtml
# mkdir -p /var/www/vhosts/main/html … バーチャルホスト用ドキュメントルートディレクトリ作成
# vi /etc/httpd/conf/httpd.conf … Apache設定ファイル編集
最低限、以下の記述だけで動作する。Directoryの指定は一箇所にまとめておくとメンテナンスしやすそう
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80 … コメント解除(バーチャルホスト有効化)
#
# NOTE: NameVirtualHost cannot be used without a port specifier
# (e.g. :80) if mod_ssl is being used, due to the nature of the
# SSL protocol.
#
# vi /etc/httpd/conf.d/virtualhost.conf … バーチャルホスト設定ファイル作成
<VirtualHost *:80> … httpアクセス
ServerName any … デフォルトのアクセスを指定
DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *:80> … httpアクセス
ServerName refirio.net … refirio.net でアクセスされた場合
DocumentRoot /var/www/vhosts/main/html … /var/www/vhosts/main/html をドキュメントルートとする
<Directory "/var/www/vhosts/main/html">
Options Includes ExecCGI FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName refirio.net
DocumentRoot /var/www/vhosts/main/html
</VirtualHost>
■SSL(必要に応じて)
続いて、必要に応じてSSL用の設定を行う
apacheで複数のSSL設定を行う
http://y-stream.blogspot.jp/2011/09/apachessl.html
Apache2.2 の VirtualHost を SSL を使うサイトにも適用
http://qiita.com/da0shi/items/70572e1da228795e0d4b
vi
http://ext.omo3.com/vi/index.html
ApacheでSSL(https)で複数のバーチャルホストの設定
http://istks.net/2322
なおApache 2.2.12以降ならSNIに対応しているので、バーチャルホストで複数のSSL証明書を利用できる
詳細は後述の「1サーバに複数のSSL証明書を設定する」を参照
# vi /etc/httpd/conf/httpd.conf
<VirtualHost _default_:443> の項目をすべてコメントアウトする
(「<VirtualHost _default_:443>」と「</VirtualHost>」の行も含めてコメントアウトする)
たとえ内容がカラでも、後で設定する「<VirtualHost *:443> 〜 </VirtualHost>」が反映されないため
NameVirtualHost *:80
NameVirtualHost *:443 … 追加する
# vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集
# vi /etc/httpd/conf.d/virtualhost.conf … バーチャルホスト設定ファイル編集
もともと ssl.conf の VirtualHost 内にあった設定を記載し、
さらに ServerName や SSLCertificateFile の設定を追加している
■動作確認
<VirtualHost *:443> … httpsアクセス
ServerName refirio.net … refirio.net でアクセスされた場合
DocumentRoot /var/www/vhosts/main/html … /var/www/vhosts/main/html をドキュメントルートとする
ErrorLog logs/ssl_error_log … 以降はSSL用の設定
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:!RC4:!3DES:!RSA
SSLCertificateFile /etc/httpd/conf/ssl.crt/refirio.net.20170410.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/refirio.net.20170410.key
SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ica.refirio.net.20170410.crt
</VirtualHost>
# chown refirio. /var/www/vhosts/main/html/ … ドキュメントルートの所有者を「refirio」に変更
# ll /var/www/ … ドキュメントルートの所有者を確認
合計 24
drwxr-xr-x 2 root root 4096 10月 5 11:45 cgi-bin
drwxr-xr-x 3 root root 4096 10月 9 00:19 error
drwxr-xr-x 5 refirio refirio 4096 9月 27 17:43 html
drwxr-xr-x 3 root root 4096 9月 27 09:29 icons
# service httpd configtest … 設定ファイルの構文をチェック
# service httpd restart … httpdを再起動
httpd を起動中: [ OK ]
# vi /var/www/vhosts/main/html/index.html … テストページ作成
■サブドメインなしでのアクセス
refirio.net で /var/www/html を表示し、
test.refirio.net で /var/www/vhosts/test/html を表示するような場合、
上の設定を行うと /var/www/html へアクセスできなくなる可能性がある。
その場合、以下のように /var/www/html へのアクセスを明示的に設定する。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>テスト / main</title>
</head>
<body>
<p>テスト / main</p>
</body>
</html>
<VirtualHost *:80>
ServerName refirio.net
DocumentRoot /var/www/html
</VirtualHost>
IPアドレス経由でのアクセスなら、以下のように設定できる。
<VirtualHost *:80>
ServerName 203.0.113.1
DocumentRoot /var/www/html
</VirtualHost>
もしくは以下のように、最初に any を定義しておくとデフォルトのアクセスを指定できる
<VirtualHost *:80>
ServerName any
DocumentRoot /var/www/html
</VirtualHost>
一つのApacheサーバーで複数ドメインのサイトを公開する方法 | 技術系のメモ
https://humble-mumble.com/apache-multiple-sites/
■エイリアスの指定
※未検証
同じディレクトリに複数のドメインを割り当てる場合、
ServerName のセットをいくつも並べなくても ServerAlias で対応できる
mod_rewrite と組み合わせれば、ドメイン統一のためのリダイレクトも対応できる
バーチャルホストのサーバ名別名でVirtualHost設定を簡素に - Qiita
https://qiita.com/Vit-Symty/items/eb7d98a1576e93b3b130
■ログでバーチャルホストを区別
バーチャルホスト
https://httpd.apache.org/docs/2.0/ja/logs.html#virtualhosts
バーチャルホストごとにApacheログを分けない場合、どのアクセスがどのバーチャルホストに対してのアクセスなのか区別できなくなる
/etc/httpd/conf/httpd.conf のLogFormatに「%v」と書いておくと test.refirio.net のような値として記録されるので、必要なら調整する
以下は設定例
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i %v" combined
test.refirio.net のような値ではなく、例えばサブドメイン「test」でアクセスした際に「test」と記録したい場合、以下のように設定する
「combined_test」の部分は、他のログ設定と重複しない値にする
以下は設定例
<VirtualHost *:80>
ServerName test.refirio.net
DocumentRoot /var/www/test
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i test" combined_test
CustomLog logs/access_log combined_test env=!no_log
</VirtualHost>
ただしバーチャルホストが増えると管理しづらいので、前に挙げた方法を推奨
■ワイルドカード
http://203.0.113.1/
http://refirio.work/
http://www.refirio.work/
http://test1.refirio.work/
http://test2.refirio.work/
のようなURLでアクセスできるようにする
サブドメインに応じたディレクトリを参照するようにし、サブドメインの追加はディレクトリの追加のみでできるようにする
名前 種別 内容
A 203.0.113.1
* A 203.0.113.1
以下のように設定する
# mkdir -p /var/www/vhosts/203.0.113.1/html
# echo "refirio.work" > /var/www/vhosts/203.0.113.1/html/index.html
# mkdir -p /var/www/vhosts/refirio.work/html
# echo "refirio.work" > /var/www/vhosts/refirio.work/html/index.html
# mkdir -p /var/www/vhosts/www.refirio.work/html
# echo "www.refirio.work" > /var/www/vhosts/www.refirio.work/html/index.html
# mkdir -p /var/www/vhosts/test1.refirio.work/html
# echo "test1.refirio.work" > /var/www/vhosts/test1.refirio.work/html/index.html
# mkdir -p /var/www/vhosts/test2.refirio.work/html
# echo "test2.refirio.work" > /var/www/vhosts/test2.refirio.work/html/index.html
# vi /etc/httpd/conf.d/virtualhost.conf
なお、常に同じディレクトリを参照させるなら、以下の指定のみで対応できる
<VirtualHost *:80>
ServerName refirio.work
ServerAlias *.refirio.work … ワイルドカードでアクセスできるようにする
VirtualDocumentRoot "/var/www/vhosts/%0/html" … 「%0」には「203.0.113.1」「refirio.work」「www.refirio.work」のような値が入る
<Directory "/var/www/vhosts/*/html"> … すべてのディレクトリに対して設定
Options Includes ExecCGI FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
# service httpd restart
# vi /etc/httpd/conf.d/virtualhost.conf
ムームーDNSでワイルドカードをご利用いただけるようになりました! | ムームードメイン
https://muumuu-domain.com/?mode=info&id=3039
VirtualDocumentRootを使って複数ドメインをスッキリ管理(Apache) - y-kawazの日記
http://d.hatena.ne.jp/y-kawaz/20110725/1311610727
【apache】VirtualDocumentRootで、ディレクトリを作るだけでサブドメインが作れる at softelメモ
https://www.softel.co.jp/blogs/tech/archives/2189<VirtualHost *:80>
ServerName refirio.work
ServerAlias *.refirio.work
DocumentRoot /var/www/html
<Directory "/var/www/html">
Options Includes ExecCGI FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>