1台のマシンにApache2を複数インスタンス建てたくなった*1んで、調べたことをメモっときます。
先に結論
Apache2の複数起動は結構泥臭いです。httpdに「-f your-httpd.conf」オプションを渡すために、init.dスクリプトを複数用意しましょう。こだわりがなければapachectlのことは忘れましょう。
基本
httpd コマンドに、 「-f ファイル名」 オプションを渡すことができれば、別のhttpd.confで起動できます。別のhttpd.confの中では、PidFileやらポート周り(Listenとか)やら*2を変えておく必要があります。
ただし、Apacheを使ってる人ならわかると思いますが、httpdコマンドを直に呼ぶことはまずありません。apachectlコマンドとinit.d scriptを利用することになると思いますが、やっかいなことにデフォルトの状態ではこの二つのコマンドは、
- ハードコーディング的(=コピペして直す必要がある)
- 互いに依存してるわけではなく、どちらも直接httpdを呼ぶ(=両方修正が必要)
- 理由は以下だそうです↓
# The semantics of these two functions differ from the way apachectl does # things -- attempting to start while running is a failure, and shutdown # when not running is also a failure. So we just do it the way init scripts # are expected to behave here.
と言う状態です。ですので、
とするのがいいんじゃないかと思います。
debian packageの場合
さて、Ubuntuだとちょっと事情が変わります。upstream版と違って以下の特徴があります。
- httpdはapache2、httpd.confはapache2.conf、apachectlはapache2ctlとなる*3
- apache2ctl の中で、 APACHE_ARGUMENTS なる環境変数をhttpdへ渡している*4
- init.d script の中から apache2 ではなく apache2ctl を呼んでいる
- apache2.conf の中で、PidFileに環境変数APACHE_PID_FILEを使っている
ちょっと道具としては乏しいんですが、これらを使ってうまく頑張ればapache2ctlをいじらずに複数インスタンス起動用のinit.d scriptを作れます。
- init.d script をコピペ
- /etc/apache2/envvars をコピペ
この方法であれば、「APACHE_ENVVARS=envvarsのファイルパス apache2ctl」とすればapache2ctlも一応使えます。
ただし、debian packageだと init.dスクリプトがupstreamで用意されてる物より大きい*5ので、コピペするのにはちょっと抵抗があるかもしれません。その場合は、envvarsファイルだけ作って、後はapache2ctlを透過的に呼ぶような init.d スクリプトを自作しちゃったほうがすっきりするかもしれないです。