IMPOV::In My Point Of View

仕事、SEO、ウェブマーケティング、時事問題、健康、生き方などなど、書きたいことを勝手に書き倒しているブログです。とどのつまり「便所の落書き」

マルチドメイン - VirtualHostの設定(初心者がさくらのVPSを立ち上げるまで - その8)

ディレクトリ構成を考える

名前の解決ができない場合の挙動

VirtualHostを設定した場合で、ドメイン名の解決ができない場合、一番最初に読み込まれたVirtualHostが表示される。

たとえば、このサーバーのIPが指定されたドメインでアクセスしてきたが、まだVirtualHostの設定が行われていない場合、一番最初に読み込まれたVirtualHost(別のドメイン)が表示されてしまうことになる。

Not Foundページを用意する

このルールを逆手に取って、VirtualHostの一番最初に読み込ませるサイトに、
"Not Found*1"とでも書いたindex.htmlを一枚だけ置いておけば良い。

これで、このサーバーに来たけれど行き先のない(名前の解決ができなかった)アクセスが、すべてこのページに集まることになる。

ディレクトリ構造

公開用のディレクトリについては、デフォルトで /var/www/html/ というディレクトリが用意されているが、今回は、このディレクトリには管理用のサブドメイン*2を当てて、一般公開できないツール類を寄せることにする。もちろん、この /html/ ディレクトリには、Digest認証(もしくはBasic認証)をあてて限定的な公開とする

また、メインのドメインやその他のドメイン・サブドメインについては、それぞれ別のディレクトリを作り、公開していくこととした。

これを図示すると、以下のようになる。

f:id:impov:20140216232635p:plain

エイリアスに注意

phpMyAdminのインストール時に設定されたエイリアスなど、VirtualHostの記述の外で読み込まれたエイリアスは、VirtualHostの外枠で効力を発揮してしまう。

上の例で言うと、
admin.hoge.com/phpmyadmin/ でもアクセスできるし、
hoge.com/phpmyadmin/ や
fuga.com/phpmyadmin/ でもアクセスできてしまうのだ。

これらのエイリアスは全て削除し、アクセスできるドメインを設定したVirtualHostの記述の内側に移動しなければならない。

意外と見落としがちなのに非常に危険なので、後から青くならないためにも十分に配慮したい。

マルチドメインの管理

マルチドメインの管理を簡略にするため、notfound 以外の全てのドメインは、一つのドメイン毎に1つの設定ファイルを用意し、専用のディレクトリにまとめて保存することとした。

httpd.confの設定

#13 VirtualHostの設定をしよう (1) | さくらのVPS入門 - プログラミングならドットインストール
マルチドメインの設定 | 初心者でもわかる!さくらVPS | Sakura VPS 設定マニュアル
大枠の設定については、参考サイト通りで良いと思うが、今回は以下のように設定してみた。

参考サイトとの大きな違いは、以下の2点だ。

  • Section 2 の /var/www/html/ ディレクトリ設定の削除*3
  • VirtualHost用設定ファイル群の Include を追加

設定例 httpd.conf

コメント行を削除し、モジュールなども不要なものをなるべく読み込まないように削っている。*4

### Section 1: Global Environment
ServerTokens Prod
ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 60
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

## Server-Pool Size Regulation (MPM specific)
<IfModule prefork.c>
StartServers      10
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients        60
MaxRequestsPerChild  1000
</IfModule>

<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

Listen 80
Listen 443

# Dynamic Shared Object (DSO) Support
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
LoadModule alias_module modules/mod_alias.so
LoadModule substitute_module modules/mod_substitute.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
LoadModule cgid_module modules/mod_cgid.so
LoadModule dbd_module modules/mod_dbd.so
LoadModule filter_module modules/mod_filter.so
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_svn_module modules/mod_dav_svn.so
#LoadModule authz_svn_module modules/mod_authz_svn.so

#Read External Conf
Include conf.d/*.conf

User apache
Group apache

### Section 2: 'Main' server configuration
ServerAdmin root@localhost
UseCanonicalName Off
DocumentRoot "/var/www/html"
ServerName admin.hoge.jp:80 #コントロールパネルで指定したサーバーネームを入れる

#Root settings
<Directory />
    Options -Indexes FollowSymLinks
    AllowOverride None
</Directory>

DirectoryIndex index.html index.php index.cgi

AccessFileName .htaccess
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

TypesConfig /etc/mime.types
DefaultType text/plain
HostnameLookups Off
ErrorLog logs/error_log
LogLevel warn
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log combined

ServerSignature Off

Alias /icons/ "/var/www/icons/"

<Directory "/var/www/icons">
    Options -Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

DefaultIcon /icons/unknown.gif

ReadmeName README.html
HeaderName HEADER.html

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

AddLanguage en .en
AddLanguage ja .ja

LanguagePriority ja en

ForceLanguagePriority Prefer Fallback

AddDefaultCharset UTF-8

AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl

AddHandler cgi-script .cgi .pl
AddHandler type-map var

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

Alias /error/ "/var/www/error/"

<IfModule mod_negotiation.c>
<IfModule mod_include.c>
    <Directory "/var/www/error">
        AllowOverride None
        Options IncludesNoExec
        AddOutputFilter Includes html
        AddHandler type-map var
        Order allow,deny
        Allow from all
        LanguagePriority en
        ForceLanguagePriority Prefer Fallback
    </Directory>
</IfModule>
</IfModule>

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
BrowserMatch "^gnome-vfs/1.0" redirect-carefully
BrowserMatch "^XML Spy" redirect-carefully
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully

### Section 3: Virtual Hosts

#Virtual Host
NameVirtualHost *:80
NameVirtualHost *:443

# Primary Access to Virtual Host
# notfound
<VirtualHost *:80>
    DocumentRoot /var/www/notfound/public_html
    ServerName notfound.hoge.jp   #名前解決しないアクセス用なので適当な名前で良い

    RewriteEngine on
    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
    RewriteRule .* - [F]

    ErrorLog logs/error_log
    CustomLog logs/access_log combined

    <Directory "/var/www/notfound/public_html">
        DirectoryIndex index.html
        Options -Indexes FollowSymLinks
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

#Include Virtual Host Setting
Include conf.vh/*.conf

VirtualHost用の設定を作る

VirtualHost用のconfファイルを保存するディレクトリを作成
mkdir /etc/httpd/conf.vh
chmod 755 /etc/httpd/conf.vh
VirtualHost用の公開ディレクトリを作成
mkdir -p /var/www/[ドメイン名]/public_html
chown -R apache:apache /var/www/[ドメイン名]
chmod 775 /var/www/[ドメイン名]/public_html
confファイルの追加
vim /etc/httpd/conf.vh/[ドメイン名].conf

前出のディレクトリ名も、ここで作るファイル名も、実はなんでも良いのだが、ドメイン名にしておくとあとあとわかりやすい。

以下のテキストを貼り付けて、適当に編集する。

# ドメイン名.com
<VirtualHost *:80>
    DocumentRoot /var/www/ドメイン名.com/public_html
    ServerName ドメイン名.com
    ServerAlias www.ドメイン名.com
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(www\.ドメイン名\.com)(:80)? [NC]
    RewriteRule ^/(.*) http://ドメイン名.com/$1 [R=301,L]
    ErrorLog logs/error_log
    CustomLog logs/access_log combined

    <Directory "/var/www/ドメイン名.com/public_html">
        DirectoryIndex index.html index.htm index.php index.cgi index.html.var
        Options -Indexes ExecCGI FollowSymLinks
      #mod_deflate設定
      <IfModule mod_deflate.c>
        SetOutputFilter DEFLATE
        AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/css
      </IfModule>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

# ssl ドメイン名.com
<VirtualHost *:443>
    DocumentRoot /var/www/ドメイン名.com/public_html
    ServerName ドメイン名.com
    ServerAlias www.ドメイン名.com
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(www\.ドメイン名\.com)(:80)? [NC]
    RewriteRule ^/(.*) https://ドメイン名.com/$1 [R=301,L]
    ErrorLog logs/error_log
    CustomLog logs/access_log combined

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

    SSLCertificateKeyFile /etc/httpd/conf/server.key
    SSLCertificateFile /etc/httpd/conf/server.crt


    <Directory "/var/www/ドメイン名.com/public_html">
        DirectoryIndex index.html index.htm index.php index.cgi index.html.var
        Options -Indexes ExecCGI FollowSymLinks
      #mod_deflate設定
      <IfModule mod_deflate.c>
        SetOutputFilter DEFLATE
        AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/cs#
      </IfModule>
        Order deny,allow
        Allow from all
    </Directory>

    SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
</VirtualHost>

サーバー証明を持ってない場合は、sslのブロックは全部削除。
admin用のファイルでは、

<Directory "/var/www/ドメイン名.com/public_html">

の部分を

<Directory "/var/www/html">

とする。

また、上記は、www無しに統一しているパターンなので、www有りにURLを統一したい場合は、該当部分を以下に差し替える。

    ServerName www.[ドメイン.名]
    ServerAlias [ドメイン.名]
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(ドメイン\.名)(:80)? [NC]
    RewriteRule ^/(.*) http://www.ドメイン.名/$1 [R=301,L]


    ServerName www.[ドメイン.名]
    ServerAlias [ドメイン.名]
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(ドメイン\.名)(:80)? [NC]
    RewriteRule ^/(.*) https://www.ドメイン.名/$1 [R=301,L]

phpmyadminのエイリアスの設定

vim /etc/httpd/conf.d/phpMyAdmin.conf

設定ファイルを開いたら、エイリアスの設定をコメントアウトして無効にする。

Alias /phpMyAdmin /usr/share/phpMyAdmin
   ↓
#Alias /phpMyAdmin /usr/share/phpMyAdmin

admin.hoge.com用に追加した設定ファイルを開き、

Alias /phpMyAdmin /usr/share/phpMyAdmin

を追加する。なお、このときにphpMyAdmin部分をわかりづらい名前にしておくとなお良い。*5

httpd再起動

service httpd configtest
service httpd restart

目次

一連の記事の目次は、以下のページにあります。
初心者がさくらのVPSを立ち上げるまで - その1

*1:実際には、もうちょっと気の利いたことを考えて書いてください。

*2:たとえば、admin.hoge.com

*3:VirtualHostでadminサブドメインをぶつけるので不要

*4:実際に使用しているものを、掲載にあたり改変しているので、転載ミスがあったら教えてください。スイマセン。

*5:たとえば、Alias /hoge-phpMyAdmin /usr/share/phpMyAdmin とすると、アクセスも、admin.hoge.com/hoge-phpMyAdmin となるのでセキュリティ的に気休めにはなる。