ロックオン開発チームブログ -Lockon Knowledge Repositories-

ローカル環境の Apache で複数のサイトを平行して開発する

EC-CUBE 開発チームの大河内です.

僕は普段, FreeBSD や Mac OS X といった PC-UNIX をクライアントにして開発をしています. 自機がサーバーになってしまうので, EC-CUBE などの開発は非常に楽なのですが, PHP4 と, PHP5 の動作確認を行ったり, 複数の EC-CUBE を同時にテストしようと思うと, 少々工夫が必要です.

DNS サーバーを自前で管理できれば, サブドメインを作って, ネームベースの VirtualHost で複数のドメインを動作させることができるので楽なのですが, 現在の開発環境では, localhost のみで何とかしなければならないのです.

そこで, 以下の方法を考えました.

  • Apache は ネームベースの VirtualHost ではなく, 複数のポートで動かす.
  • PHP4 と PHP5 の Apache module をインストールしておき, httpd.conf の簡単な修正で変更できるようにする.

設定方法

  1. Apache と PHP5 をインストール.

    まずは特に特殊な設定は不要なので, ports から入れてしまいました.
    Linux なら rpm や apt-get でも大丈夫だと思います.

    # portinstall -Ccr www/apache20
    # portinstall -Ccr lang/php5
    # portinstall -Ccr lang/php5-extensions
  2. PHP4 のインストール.

    PHP5 と PHP4 を簡単に切り変えるために PHP4 もインストールします.
    単純には共存できないため, こちらはソースからビルドします.

    $ tar xvjf php-4.4.7.tar.bz2
    $ cd php-4.4.7
    $ './configure' \
    '--with-layout=GNU' \
    '--with-config-file-scan-dir=/usr/local/etc/php' \
    '--with-apxs2=/usr/local/sbin/apxs' \
    '--with-regex=php' \
    '--enable-zend-multibyte' \
    '--prefix=/usr/local' \
    '--without-pear' \
    '--disable-cgi' \
    '--disable-cli' \
    '--with-gd' \
    '--enable-gd-native-ttf' \
    '--enable-gd-jis-conv' \
    '--with-iconv' \
    '--enable-mbstring' \
    '--with-mysql' \
    '--with-pgsql=/usr/local/pgsql/8.2.4' \
    '--with-zlib-dir=/usr/local' \
    '--with-jpeg-dir=/usr/local' \
    '--with-png-dir=/usr/local'
    $ make
    $ sudo make install
    

    configure オプションは各環境に合わせて調節して下さい.
    僕の場合は, Apache2 モジュール版の PHP4 のみをインストールするようにし, PostgreSQL は幾つかのバージョンを同居させているので, 8.2.4 のライブラリを読むようにしました

  3. PHP の共存設定

    PHP4 と PHP5 はインストールできたので, どちらのモジュールを有効にするかは, httpd.conf で行います.
    下記のように, LoadModule 行のどちらかをコメントアウトしてやれば良いです.(Apache2.0系の場合)

    #LoadModule php4_module        libexec/apache2/libphp4.so
    LoadModule php5_module        libexec/apache2/libphp5.so
    

    PHP4 を有効にしたければ, php5_module の行をコメントアウトして, Apache を再起動しましょう.

  4. 複数ホスト同居させる

    複数のホストを同居させるには, VirtualHost を使えば良いのですが, localhost のみではサブドメインが使えないため, Apache を複数のポートで立ち上げて対応するようにします.
    僕は, httpd.conf に VirtualHost の設定をたくさん書くのはいやなので, httpd.conf の最終行付近に下記のような設定を追加しました.

    Include etc/apache2/Includes/*.conf

    こうすると, $PREFIX/etc/apache2/Includes 以下の *.conf ファイルは, すべて httpd.conf が 読み込んでくれます.

    あとは, ホストごとに, *.conf ファイルを作っていけば良いです.

    ##--------------------------------------------------------------------
    # EC-CUBE module-update 開発用
    ##--------------------------------------------------------------------
    Listen 15000
    NameVirtualHost *:15000
    <VirtualHost *:15000>
        ServerAdmin     root@loop-az.jp
        DocumentRoot    /home/foo-user/workspace/eccube-branches/feature-module-update/html
        DirectoryIndex  index.php
        ServerName       127.0.0.1
        ErrorLog        /var/log/15000-httpd-error.log
        CustomLog       /var/log/15000-httpd-access.log combined
        AddType application/x-httpd-php .php
        php_value include_path .:/usr/local/share/pear
        <Directory /home/foo-user/workspace/eccube-branches/feature-module-update/html>
            AllowOverride All
            Options All
            <Limit GET POST OPTIONS PROPFIND>
                Order allow,deny
                Allow from all
            </Limit>
            <LimitExcept GET POST OPTIONS PROPFIND>
                Order deny,allow
                Deny from all
            </LimitExcept>
        </Directory>
    </VirtualHost>
    ##--------------------------------------------------------------------
    # EC-CUBE comu-utf8 用
    ##--------------------------------------------------------------------
    Listen 16000
    NameVirtualHost *:16000
    <VirtualHost *:16000>
        ServerAdmin     root@example.jp
        DocumentRoot    /home/foo-user/workspace/eccube-branches/comu-utf8/html
        DirectoryIndex  index.php
        ServerName       127.0.0.1
        ErrorLog        /var/log/16000-httpd-error.log
        CustomLog       /var/log/16000-httpd-access.log combined
        AddType application/x-httpd-php .php
        php_value include_path .:/usr/local/share/pear
        <Directory /home/foo-user/workspace/eccube-branches/comu-utf8/html>
            AllowOverride All
            Options All
            <Limit GET POST OPTIONS PROPFIND>
                Order allow,deny
                Allow from all
            </Limit>
            <LimitExcept GET POST OPTIONS PROPFIND>
                Order deny,allow
                Deny from all
            </LimitExcept>
        </Directory>
    </VirtualHost>
    

    ポイントは, VirtualHost ごとに, Listen するポートを分けることです. こうすることで, 定義したポートごとに VirtualHost の作成ができます.
    Listen させるポートは, 1024 番以降の空いているポートを使用するようにしましょう.
    ドメイン名は localhost のみなので, NameVirtualHost と, VirtualHost ディレクティブは, *:ポート番号 と指定すると良いです.
    上記の設定だと, ブラウザから, http://localhost:15000 及び, http://localhost:16000 にアクセスすることで, 各 VirtualHost へのアクセスが確認できると思います.

上記サンプルは, あくまでもローカル環境でのテスト用なので, AllowOverride All なんてしてありますが, VPS 等の外部サーバーでテストする場合は, 的確な設定をした方が良いでしょう...

Trackback

このエントリーのトラックバックURL:
http://www.lockon.co.jp/cgi-bin/mt/mt-tb.cgi/309

コメント

コメント (6)


Windows だと hosts ファイルに適当な名前を定義して、
それを VirtualHost で指定すれば同じポートで
複数の EC-CUBE が動作できると思います。


(例)
127.0.0.1 localhost
127.0.0.1 eccube
127.0.0.1 eccube2


ただ、PHP4 と PHP5 の共存は Windows で
試したことはないですね・・・。


また、ループバックアドレスをフルに活用するのも面白いかもしれませんね。
ただ、FreeBSD はデフォルトでは 127.0.0.1 しか使えないのですよね?
Windows や Linux では 127.0.0.2 とか利用できるのに・・・。



> Windows だと hosts ファイルに適当な名前を定義して、
> それを VirtualHost で指定すれば同じポートで
> 複数の EC-CUBE が動作できると思います。
>
> (例)
> 127.0.0.1 localhost
> 127.0.0.1 eccube
> 127.0.0.1 eccube2
>


UNIX でも, /etc/hosts を編集することで同様のことはできると思います.
完全に自ホストのみでテストするならこれでも良いんですけど, LAN 内で別の
クライアントからテストしたい場合などは不便ですよね...


> ただ、PHP4 と PHP5 の共存は Windows で
> 試したことはないですね・・・。


単純に, Apache モジュールを切り替えるだけなので, インストールさえでき
てしまえばできると思うんですけどね.


> また、ループバックアドレスをフルに活用するのも面白いかもしれませんね。
> ただ、FreeBSD はデフォルトでは 127.0.0.1 しか使えないのですよね?
> Windows や Linux では 127.0.0.2 とか利用できるのに・・・。


Windows や Linux は 127.0.0.2 とか使えるのですか!!
初めて知りました(汗)


ちなみに, RFC3330 では, ループバックアドレスは, 127.0.0.0/8 に割り合て
られていますが, 127.0.0.1/32 のみを使用するべきとのこと.


http://tools.ietf.org/rfc/rfc3330.txt


FreeBSD は厳格なんですね...



> 完全に自ホストのみでテストするならこれでも良いんですけど, LAN 内で別の
> クライアントからテストしたい場合などは不便ですよね...


なるほど。その場合は仕方ないですね・・・。


> Windows や Linux は 127.0.0.2 とか使えるのですか!!


127.0.0.0/8 すべて使えますよ。
FreeBSD だけ使えないっていうコラムを TCP/IP 関連の本で
読んだことがあって、なんでだろって思ってたのです。
カーネルのデフォルト設定?


ちなみに、Windows マシン(Cygwin上)で 127.0.0.2 に ping すると、
反応ありますね。Reply from は 127.0.0.1 になってるなぁ・・・。


$ ping 127.0.0.2


Pinging 127.0.0.2 with 32 bytes of data:


Reply from 127.0.0.1: bytes=32 time Reply from 127.0.0.1: bytes=32 time Reply from 127.0.0.1: bytes=32 time Reply from 127.0.0.1: bytes=32 time


Ping statistics for 127.0.0.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms


-------------------------------------------------------


Linux で 127.0.0.2 に ping すると反応ありますね。
Reply from は 127.0.0.2 ですw


% ping 127.0.0.2
PING 127.0.0.2 (127.0.0.2) 56(84) bytes of data.
64 bytes from 127.0.0.2: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 127.0.0.2: icmp_seq=2 ttl=64 time=0.015 ms
64 bytes from 127.0.0.2: icmp_seq=3 ttl=64 time=0.010 ms
64 bytes from 127.0.0.2: icmp_seq=4 ttl=64 time=0.009 ms


-------------------------------------------------------


FreeBSD で 127.0.0.2 に ping すると反応ないです。


$ ping 127.0.0.2
PING 127.0.0.2 (127.0.0.2): 56 data bytes
ping: sendto: Can't assign requested address
ping: sendto: Can't assign requested address
ping: sendto: Can't assign requested address
ping: sendto: Can't assign requested address



> > Windows や Linux は 127.0.0.2 とか使えるのですか!!
>
> 127.0.0.0/8 すべて使えますよ。
> FreeBSD だけ使えないっていうコラムを TCP/IP 関連の本で
> 読んだことがあって、なんでだろって思ってたのです。
> カーネルのデフォルト設定?


ちょっと気になったので, カーネルソースを grep してみました.


FreeBSD では, /usr/src/sys/netinet/in.c で決め打ちになってます.
CVS を辿ると, どうやら, 4.4BSD の頃から変ってないようです.
NetBSD のカーネルソースも見てみましたが同様でした.


どうやら, 4.4BSD 由来の OS はみんな同じなのではないでしょうか.


とりあえず, RFC では, 127.0.0.1 にするべきとされているので, Linux や
Windows は反則ということで...(笑)



> とりあえず, RFC では, 127.0.0.1 にするべきとされているので, Linux や
> Windows は反則ということで...(笑)


え~、この辺のループバックを利用したシステムって
結構たくさんあるんですよねぇ。


まあ、RFC に従えって感じなのでしょうが、
用語辞典には下記のように書かれてたりしますw


IPv6ではループバックアドレスは「::1」しか用いることができないと定義されているが、
IPv4の「127.0.0.1」は慣習的に決められたもので、正式なものではない。
このため、OSによってはこれ以外のIPアドレスをループバックアドレスとして
使用できる場合もある(が、通常は別のアドレスは使わない)。



RFC の原文も, 下記の通りで 127.0.0.1/32 を厳密に定義しているわけではな
いようです.


This is ordinarily implemented using only 127.0.0.1/32 for loopback,
but no addresses within this block should ever appear on any network
anywhere


RFC を守ってない実装なんていくらでもありますしw
結果的に, 守ってないことで不幸にならなければ良いのだと思ってます(笑)





Copyright(c) LOCKON CO.,LTD. All Rights Reserved.