Hatena::ブログ(Diary)

IT memorandum

2009年04月24日

Apacheの設定

| 10:35

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
    <VirtualHost *:80>
        ServerName exmaple.com
        ServerAlias www.exmaple.com
        DocumentRoot /var/www/exmaple/public
    </VirtualHost>

// 作成した設定ファイルを有効にする
$ 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
    <VirtualHost *:443>
        ServerName exmaple.com:443
        ServerAlias www.exmaple.com:443
        DocumentRoot /var/www/exmaple/public
    
        SSLEngine On
        SSLCertificateFile ****
        SSLCertificateKeyFile ++++
    </VirtualHost>

$ 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
    
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    </Directory>
    
    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
    </Directory>
    
    ## サイト別設定
    
    NameVirtualHost *:80
    
    <VirtualHost *:80>
        ServerName exmaple-a.com
        ServerAlias www.exmaple-a.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/exmaple-a/public
    </VirtualHost>

$ cat /etc/apache2/sites-available/exmaple-a-ssl
    <IfModule mod_ssl.c>
        NameVirtualHost *443:
        <VirtualHost *:443>
            ServerName exmaple-a.com
            ServerAlias www.exmaple-a.com
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/exmaple-a/public
    
            SSLEngine on
            SSLCertificateFile    ****
            SSLCertificateKeyFile ++++
            <FilesMatch "\.(cgi|shtml|phtml|php)">
                SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
            </Directory>
            BrowserMatch ".*MSIE.*" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        </VirtualHost>
    </IfModule>

$ cat /etc/apache2/sites-available/exmaple-b
    <VirtualHost *:80>
        ServerName exmaple-b.com
        ServerAlias www.exmaple-b.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/exmaple-b/public
    </VirtualHost>

$ cat /etc/apache2/sites-available/exmaple-b-ssl
    <IfModule mod_ssl.c>
        <VirtualHost *:443>
            ServerName exmaple-b.com
            ServerAlias www.exmaple-b.com
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/exmaple-b/public
    
            SSLEngine on
            SSLCertificateFile    XXXX
            SSLCertificateKeyFile ----
            <FilesMatch "\.(cgi|shtml|phtml|php)">
                SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
            </Directory>
            BrowserMatch ".*MSIE.*" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        </VirtualHost>
    
    </IfModule>

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

上記のServerNameディレクティブの下に

ServerAlias example2.com

といった感じです。


もちろんexample.comやexample2.comのDNS設定(Aレコード)は、

ドメインの管理画面だったり、LAN内のみの場合はルータの管理画面とかで別途設定が必要です。

トラックバック - http://d.hatena.ne.jp/jun-ya/20090424/1240536959