ローカル環境の 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 の簡単な修正で変更できるようにする.
設定方法
- Apache と PHP5 をインストール.
まずは特に特殊な設定は不要なので, ports から入れてしまいました.
Linux なら rpm や apt-get でも大丈夫だと思います.# portinstall -Ccr www/apache20 # portinstall -Ccr lang/php5 # portinstall -Ccr lang/php5-extensions
- 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 のライブラリを読むようにしました
- 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 を再起動しましょう.
- 複数ホスト同居させる
複数のホストを同居させるには, 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 等の外部サーバーでテストする場合は, 的確な設定をした方が良いでしょう...


コメント (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 とか利用できるのに・・・。
投稿者: サラトガ | 2007年09月03日 17:46
> 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 は厳格なんですね...
投稿者: nanasess | 2007年09月03日 18:18
> 完全に自ホストのみでテストするならこれでも良いんですけど, 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
投稿者: サラトガ | 2007年09月03日 18:25
> > 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 は反則ということで...(笑)
投稿者: nanasess | 2007年09月03日 18:49
> とりあえず, RFC では, 127.0.0.1 にするべきとされているので, Linux や
> Windows は反則ということで...(笑)
え~、この辺のループバックを利用したシステムって
結構たくさんあるんですよねぇ。
まあ、RFC に従えって感じなのでしょうが、
用語辞典には下記のように書かれてたりしますw
IPv6ではループバックアドレスは「::1」しか用いることができないと定義されているが、
IPv4の「127.0.0.1」は慣習的に決められたもので、正式なものではない。
このため、OSによってはこれ以外のIPアドレスをループバックアドレスとして
使用できる場合もある(が、通常は別のアドレスは使わない)。
投稿者: サラトガ | 2007年09月03日 18:51
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
結果的に, 守ってないことで不幸にならなければ良いのだと思ってます(笑)
投稿者: nanasess | 2007年09月03日 19:35