FreeBSDでApacheモジュールを静的リンクしてインストールする(+PHP4)

初出:2005/04/09
更新:2005/07/18

まえがき

 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

 DSOの利点は、httpd本体からモジュールを分離することにより、機能の追加と削除を容易にできることだ。静的リンクだとモジュールの追加/削除を行うには、Apacheをインストールしなおす必要があるが、DSOならばhttpd.confの記述を変えるだけですむ。機能の拡張を柔軟に行うことが出来るわけだ。また、httpd本体を小さく出来るため、メモリ使用量を減らすことが出来る。
 一方、DSOの欠点は、パフォーマンスが低下することだ。httpd本体とモジュールファイルの間でデータのやり取りをする必要があるため、その分余計な手間がかかる。

 静的リンクにすれば、httpdとモジュールは一体化しているため、パフォーマンスの低下は起きない。ただし、httpd本体が肥大化するため、メモリ使用量が増えることになる。

 中負荷程度ならDSOによるパフォーマンス低下は気にならないが、高負荷ではその影響が現れてくる。

Apacheモジュールを静的リンクしてインストールする

<手順>

  1. ApacheのPortsへ移動する。

  2. cd /usr/ports/www/apache13
  3. 既にApacheをインストールした場合は、アンインストールしておく。

  4. make deinstall
    make distclean
    make rmconfig

  5. 念のため、Makefileのバックアップをしておく。

  6. cp Makefile Makefile.bak

  7. Makefileをエディタで開く。
  8. configureオプションを修正する。

  9. 黄色い文字のところが修正個所。「--disable-module=all」でいったんすべてのモジュール追加を無効にし、「--enable-module」オプションで必要なモジュールだけを指定する。指定するモジュール名は「mod_xxxx」の「xxxx」部分だけを記述する。例えば「mod_access」が使いたいならば「--enable-module=access」と指定する。モジュール名の一覧参照。

    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

  10. ファイルを保存する。
  11. あとは通常どおり、make install
  12. インストールが終わったら、モジュールの組み込みを確認する。

  13. httpd -l

<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?)

 これは、Portsのアンインストール情報がDSOを前提にして記述されているからだ。静的リンクしたのだからsoファイルが存在せず、削除できないのは当然である。無視して問題ないが、エラー表示を出したくないならば、apache13ディレクトリ内にある「pkg-plist」を開いて、該当するエラーのファイルを無効にすればよい。

PHP4モジュールをApacheに静的リンクしてインストールする

 通常、PHP4モジュール(mod_php4)はDSOとしてインストールするが、Apacheに静的リンクすることでパフォーマンスが向上し、高負荷時の耐久性が強くなる。

<手順>

  1. ApacheのPortsへ移動する。

  2. cd /usr/ports/www/apache13
  3. 既にApacheをインストールした場合は、アンインストールしておく。

  4. make deinstall
    make distclean
    make rmconfig

  5. 念のため、Makefileのバックアップをしておく。

  6. cp Makefile Makefile.bak

  7. Makefileをエディタで開く。
  8. configureオプションを修正する。

  9. 黄色い文字のところが修正個所。「--disable-module=all」でいったんすべてのモジュール追加を無効にし、「--enable-module」オプションで必要なモジュールだけを指定する。指定するモジュール名は「mod_xxxx」の「xxxx」部分だけを記述する。例えば「mod_access」が使いたいならば「--enable-module=access」と指定する。
    モジュール名の一覧参照。
    ピンク文字のところがPHP4モジュールを組み込むオプションである。

    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

  10. ファイルを保存する。
  11. Apacheソースをダウンロードして展開する。

  12. make extract
  13. configureする。

  14. cd work/apache_1.3.33/
    ./configure

  15. 既にPHP4拡張機能をインストールした場合は、アンインストールしておく。

  16. cd /usr/ports/lang/php4-extensions
    make deinstall
    make distclean
    make rmconfig

  17. 既にPHP4をインストールした場合は、アンインストールしておく。

  18. cd /usr/ports/lang/php4
    make deinstall
    make distclean
    make rmconfig

  19. PHP4のPortsへ移動する。

  20. cd /usr/ports/lang/php4
  21. 念のため、Makefileのバックアップをしておく。

  22. cp Makefile Makefile.bak

  23. Makefileをエディタで開く。
  24. configureオプションを修正する。

  25. 「--with-xxxx」オプションでPHPで使用する拡張機能を指定する。下記の例ではGDを指定した。またマルチバイトに対応するために「--enable-mbxxxx」を指定した。なお、PHPヘルプで「デフォルトで有効となっています」と記述されている機能については指定する必要はない。
    「--with-apache」オプションで、Apacheソースの存在するディレクトリを指定する。

    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

  26. DSOの記述を無効にする。

  27. デフォルトではphp4モジュールをDSOとしてインストールするようになっているため、以下のブロックをコメントアウトする。

    #.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

  28. PHPをインストールする。

  29. make install
    ※Options画面が表示された場合は、全部チェックを外しておく。

  30. ApacheのPortsへ移動する。

  31. cd /usr/ports/www/apache13
  32. Apacheをインストールする。

  33. make install
  34. インストールが終わったら、モジュールの組み込みを確認する。「mod_php4.c」が入っていれば成功。

  35. httpd -l

    実行例
      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?)

 これは、Portsのアンインストール情報がDSOを前提にして記述されているからだ。静的リンクしたのだからエラーになるのは当然である。無視して問題ないが、エラー表示を出したくないならば、php4ディレクトリ内にある「pkg-plist」を開いて、該当するエラーのファイルを無効にすればよい。

戻る


Copyright © 2005 H'Imagine.
All rights reserved.