FreeBSDでApacheモジュールを静的リンクしてインストールする(+PHP4)
FreeBSDのPortsからApacheをインストールすると、すべてのモジュールがDSO形式となる。これはこれで便利なのだが、DSOは高負荷に弱いため、Apacheのパフォーマンスに影響してくる。そのため、DSOをやめて必要なモジュールをすべてApacheへ静的リンクすると、高負荷に強くなる。
これを行うためには、自分でソースをダウンロードしてきて設定する方法もあるが、やはりPortsの便利さは捨てがたい。ここでは、Portsのインストール用ファイルをいじって静的リンク用に書き直す方法を紹介する。
また、PHP4を使っている場合は、mod_php4モジュールも静的リンクするとさらに負荷に強くなる。こちらもPortsをいじってインストールする方法を紹介する。
なお、OSの対象はFreeBSD4とする。
<コラム:静的リンクとDSO> 静的リンクとは、モジュールをすべて実行ファイルに取り入れる方式である。Apacheの実行ファイルはhttpdなので、静的リンクするとモジュールの機能はhttpd本体に取り込まれる。 DSO(Dynamic Shared Object)とは、モジュールを別個のファイルとして作成し、httpd本体から必要なときだけモジュールを使用する方式である。
DSOの利点は、httpd本体からモジュールを分離することにより、機能の追加と削除を容易にできることだ。静的リンクだとモジュールの追加/削除を行うには、Apacheをインストールしなおす必要があるが、DSOならばhttpd.confの記述を変えるだけですむ。機能の拡張を柔軟に行うことが出来るわけだ。また、httpd本体を小さく出来るため、メモリ使用量を減らすことが出来る。 静的リンクにすれば、httpdとモジュールは一体化しているため、パフォーマンスの低下は起きない。ただし、httpd本体が肥大化するため、メモリ使用量が増えることになる。 中負荷程度ならDSOによるパフォーマンス低下は気にならないが、高負荷ではその影響が現れてくる。 |
<手順>
CONFIGURE_ARGS+= \ --prefix=${PREFIX} \ --server-uid=www \ --server-gid=www \ --with-layout=FreeBSD \ --datadir=${DATADIR} \ --htdocsdir=${DOCUMENT_ROOT} \ --cgidir=${CGIBIN_ROOT} \ --disable-module=all \ --enable-module=access \ --enable-module=alias \ --enable-module=dir \ --enable-module=log_config \ --enable-module=mime \ --enable-module=setenvif \ --enable-module=cgi |
<Portsを使ったアンインストールの注意>
上記方法でインストールしたApacheのアンインストールは、通常のPortsどおりに「make deinstall」「make clean」などで行える。ただし、deinstallしたときに以下のようなエラーメッセージが表示される。拡張子「.so」ファイルの削除に失敗している状態だ。
make deinstall ===> Deinstalling for www/apache13 ===> Deinstalling apache-1.3.33_1 pkg_delete: file '/usr/local/libexec/apache/httpd.exp' doesn't really exist pkg_delete: file '/usr/local/libexec/apache/libproxy.so' doesn't really exist pkg_delete: file '/usr/local/libexec/apache/mod_access.so' doesn't really exist (中略) pkg_delete: couldn't entirely delete package (perhaps the packing list is incorrectly specified?) |
通常、PHP4モジュール(mod_php4)はDSOとしてインストールするが、Apacheに静的リンクすることでパフォーマンスが向上し、高負荷時の耐久性が強くなる。
<手順>
CONFIGURE_ARGS+= \ --prefix=${PREFIX} \ --server-uid=www \ --server-gid=www \ --with-layout=FreeBSD \ --datadir=${DATADIR} \ --htdocsdir=${DOCUMENT_ROOT} \ --cgidir=${CGIBIN_ROOT} \ --disable-module=all \ --enable-module=access \ --enable-module=alias \ --enable-module=dir \ --enable-module=log_config \ --enable-module=mime \ --enable-module=setenvif \ --enable-module=cgi \ --activate-module=src/modules/php4/libphp4.a |
CONFIGURE_ARGS= --with-layout=GNU \ --with-config-file-scan-dir=${PREFIX}/etc/php \ --with-gd \ --with-jpeg-dir=/usr/local/lib \ --with-png-dir=/usr/local/lib \ --with-zlib-dir=/usr/lib \ --enable-mbstring \ --enable-mbregex \ --enable-mbstr-enc-trans \ --with-apache=/usr/ports/www/apache13/work/apache_1.3.33 |
#.if defined(WITH_APACHE) #.if exists(${LOCALBASE}/include/apache2/httpd.h) #WITH_APACHE2= yes #APACHE_MPM!= ${APXS} -q MPM_NAME #.endif #.if defined(WITH_APACHE2) #APACHE_MPM?= ${WITH_MPM} #APACHE_PORT= www/apache2 #CONFIGURE_ARGS+=--with-apxs2=${APXS} #SAPI_FILE= libexec/apache2/libphp4.so #.if ${APACHE_MPM} == "worker" #EXT_DIR:= ${EXT_DIR}-zts #.endif #.else #APACHE_PORT?= www/apache13 #CONFIGURE_ARGS+=--with-apxs=${APXS} #SAPI_FILE= libexec/apache/libphp4.so #.endif #BUILD_DEPENDS+= ${APXS}:${PORTSDIR}/${APACHE_PORT} #RUN_DEPENDS+= ${APXS}:${PORTSDIR}/${APACHE_PORT} #.endif |
実行例
Compiled-in modules: http_core.c mod_log_config.c mod_mime.c mod_dir.c mod_alias.c mod_access.c mod_setenvif.c mod_php4.c |
<Portsを使ったアンインストールの注意>
上記方法を使ったインストールでも、Portsの「make deinstall」などでアンインストールできる。Apacheに関する注意は上述参照。
PHP4のアンインストールを行うと、以下のようなエラーメッセージが表示される。
make deinstall ===> Deinstalling for lang/php4 ===> Deinstalling php4-4.3.10_2 (略) pkg_delete: unexec command for '/usr/local/sbin/apxs -e -A -n php4 shtool' failed pkg_delete: couldn't entirely delete package (perhaps the packing list is incorrectly specified?) |