Apacheの設定


Apacheの設定を行います。


まずディレクトリ構成からですが、
通常Apacheをインストールした直後は/var/www以下が公開ディレクトリとなっています。
そこで今回は複数ホスト(マルチドメイン)を分かりやすく扱う為に以下のようにディレクトリ構成の変更を行いました。


/var/www/default/public ⇒ デフォルトの公開ディレクト


こうして後はサイトが増えるごとに


/var/www/任意のサイト名/public


として、追加していきます。




次にApacheのバーチャルホストの設定を行います。
Apacheにはバーチャルホストと言って、一つのWEBサーバで複数のホストを扱う機能があります。


バーチャルホストには2種類あって、一つはIPベースのバーチャルホスト。
これは一つのサーバに複数のIPアドレスを割り当て、Apache側でIPアドレスごとに公開ディレクトリを振り分けるという方式です。
もう一つは名前ベースのバーチャルホストです。
こっちは一つのIPアドレスに向いている複数のホストをホスト名ごとに公開ディレクトリに振り分けるという方式です。
今回調べたのは名前ベースのバーチャルホストの方です。


まずVirtualHostを有効にするための宣言を行います。

$ sudo vim /etc/apache2/sites-available/exmaple
NameVirtualHost *:80
※*の部分、別にIPベースのバーチャルホストを実施している場合はサーバに割り当てらているIPアドレスの内、使いたい方のIPアドレスを記します。
(LAN接続でNAT変換を行っている場合等はローカルIPアドレス、point to pointで接続している場合とかはグローバルIPアドレスが入りますね。)


これでApacheの80番ポートにてVirtualHostが可能になりました。


次に、ホスト名がexample.comで、公開ディレクトリをexampleとした場合

// 設定ファイルを作成
$ sudo vim /etc/apache2/sites-available/exmaple

ServerName exmaple.com
ServerAlias www.exmaple.com
DocumentRoot /var/www/exmaple/public

// 作成した設定ファイルを有効にする
$ sudo a2ensite exmaple

// Apacheの再起動
$ sudo apache2ctl graceful

後はブラウザでexmaple.comにアクセスして/var/www/exmaple/publicが公開ディレクトリして使用されているか確認です。


次にSSLでのバーチャルホストです。
SSLの仕組上、名前ベースのバーチャルホストではSSLの運用が不可能のように思えますが(※)
それは認証局でのSSL認証を行いたい場合での話です。
(※SSL通信ではアクセス時にまず最初にSSL認証が行われますが、この時Apache側ではホスト名はまだ分からないので、
先頭の443番のVirtualHostディレクティブに記載されているSSLCertificateKeyFileの鍵ファイルが認証に使用されてしまう為です。)
テストサイトなどで認証が不正でも別に良い場合は、80番ポートの時と同じことを繰り返せば良い訳です。


つまり

$ sudo vim /etc/apache2/sites-available/exmaple-ssl
NameVirtualHost *:443
を宣言し

$ sudo vim /etc/apache2/sites-available/exmaple-ssl

ServerName exmaple.com:443
ServerAlias www.exmaple.com:443
DocumentRoot /var/www/exmaple/public

SSLEngine On
SSLCertificateFile ****
SSLCertificateKeyFile ++++

$ sudo a2ensite exmaple-ssl

$ sudo apache2ctl graceful

ということです。


また、どうしても複数サイトでSSL認証が必要な場合はポートでサイトを分ければそれはそれでOK。
ホスト名が一緒だから認証が通って当然ですね。


一例として僕のApache設定ファイル群を記します。(備忘録として書いているだけですが。。)
サイトexmaple-a(デフォルトファイル), exmaple-bをそれぞれHTTPとHTTPSで使用しています。

$ cat /etc/apache2/sites-available/exmaple-a
## デフォルトの設定

DocumentRoot /var/www/exmaple-a/public

LogLevel warn
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log


Options FollowSymLinks
AllowOverride None


ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch


Alias /doc/ "/usr/share/doc/"

Options Indexes MultiViews FollowSymLinks


## サイト別設定

NameVirtualHost *:80


ServerName exmaple-a.com
ServerAlias www.exmaple-a.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/exmaple-a/public

$ cat /etc/apache2/sites-available/exmaple-a-ssl

NameVirtualHost *443:

ServerName exmaple-a.com
ServerAlias www.exmaple-a.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/exmaple-a/public

SSLEngine on
SSLCertificateFile ****
SSLCertificateKeyFile ++++

SSLOptions +StdEnvVars


SSLOptions +StdEnvVars

BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

$ cat /etc/apache2/sites-available/exmaple-b

ServerName exmaple-b.com
ServerAlias www.exmaple-b.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/exmaple-b/public

$ cat /etc/apache2/sites-available/exmaple-b-ssl


ServerName exmaple-b.com
ServerAlias www.exmaple-b.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/exmaple-b/public

SSLEngine on
SSLCertificateFile XXXX
SSLCertificateKeyFile ----

SSLOptions +StdEnvVars


SSLOptions +StdEnvVars

BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0



ちなみに別のホスト名で同じ公開ディレクトリを使用したい場合(パークドメイン)を行う場合は
上記のServerNameディレクティブの下に

ServerAlias example2.com
といった感じです。


もちろんexample.comやexample2.comのDNS設定(Aレコード)は、
ドメインの管理画面だったり、LAN内のみの場合はルータの管理画面とかで別途設定が必要です。