| « FreeBSD 6.1-RELEASEにアップグレード | GNOME 2.14関係のportsに更新 » |
apache20からapache22のportに移行した
今まで、www/apache20のportを利用していたけど、先日、Apache 2.2.2もリリースされたようなので、遅ればせながら、これを機会に、www/apache22のportに移行してみました。以下は、そのメモです。
まず、
# portupgrade -o www/apache22 -f apache20 # portupgrade -fr www/apache22 -x www/apache22
のようにして、apacheのportを入れ換え、それに依存するportsを再ビルド。
この時、pkgtools.confで関連する箇所は、
MAKE_ARGS = {
'www/apache22' => [
'WITHOUT_DAV_MODULES=yes',
'WITHOUT_PROXY_MODULES=yes',
'WITHOUT_IPV6=yes',
],
}
のようにしていました(Webサーバは、jail(8)内で動作させることから、IPv6のサポートは無効にしてあります)。
結果、
# httpd -V Server version: Apache/2.2.2 Server built: May 3 2006 00:56:43 Server's Module Magic Number: 20051115:2 Server loaded: APR 1.2.7, APR-Util 1.2.7 Compiled using: APR 1.2.7, APR-Util 1.2.7 Architecture: 32-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_USE_FLOCK_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=128 -D HTTPD_ROOT="/usr/local" -D SUEXEC_BIN="/usr/local/bin/suexec" -D DEFAULT_PIDLOG="/var/run/httpd.pid" -D DEFAULT_SCOREBOARD="/var/run/apache_runtime_status" -D DEFAULT_LOCKFILE="/var/run/accept.lock" -D DEFAULT_ERRORLOG="/var/log/httpd-error.log" -D AP_TYPES_CONFIG_FILE="etc/apache22/mime.types" -D SERVER_CONFIG_FILE="etc/apache22/httpd.conf"
のようにビルドされていました。
起動の確認
新しいApacheの設定ファイルが
/usr/local/etc/apache22/
のディレクトリ以下にインストールされたので、まずは起動を確認するため、ここにインストールされたhttpd.confファイル内の
ListenAddressServerAdmin
の箇所を適切なものに変更(IPアドレスは、httpdを動作させるjail環境に割り当てたものを明示。当然、Listenするポートも明示)します。
そして、/etc/rc.confに
apache22_enable="YES"
を追加して、
# /usr/local/etc/rc.d/apache22.sh start
と起動させました*1。
- *1 この時、
Unable to load accf_http module
のようなメッセージが表示された。
ブラウザから、サーバに割り当てたアドレスにアクセスすると、
It works!
のように表示され、ちゃんと動作していることが確認できました。
accf_httpに関する設定
コマンド スクリプトetc/rc.d/apache22.shの設定では、apache22_http_accept_enable="NO"がデフォルトの設定値になっていて、そのままでは、accf_http(9)のサポート無しで、httpdが起動するわけだけど、設定の如何に拘らず、accf_httpモジュールがロードされていない場合、脚注*1のようなメッセージが表示されました。
そもそも、apache22を使いたいと思ったのも、accf_httpがサポートされているというのが主な理由の一つだったので、これは有効にするつもりだけど、jail内では、kldload(8)が使えないと思うので、事前に、ホスト側で、
# kldload accf_http
を実行して、カーネルモジュールを予めロードしておきました。
そして、Apacheをインストールしたjail内の/etc/rc.confに、
apache22_http_accept_enable="YES"
の行を追加しました。
また、システム起動時、自動的にaccf_http.koのモジュールをロードしてくれるよう、ホスト環境の/boot/loader.confの方に、
accf_http_load="YES"
も加えておきました。
apache20で行っていた設定の復元
後は、apache20の時と同じ状態に設定を復元するだけです。
基本的な設定は、httpd.confで行いますが、機能に特化した設定は、
/usr/local/etc/apache22/extra/
のディレクトリに、httpd-*.confといった、いくつかの設定ファイルのサンプルが用意されているので、これらのうち、必要なものを
/usr/local/etc/apache22/Includes/
のディレクトリにコピーし、自分の環境にあわせて適宜、修正することになると思います追記。
httpd.conf
まずは、httpd.confから設定します。
PHPスクリプト等の取り扱い
PHPスクリプトにアクセスした時、ソースの内容が丸見えになるのはみっともないので、まず、忘れないよう、最初に、
#AddType application/x-httpd-php .php AddHandler php-script .php AddType text/html .php AddType application/x-httpd-php-source .phps
等とhttpd.confに追加し、PHPスクリプトとして動作するように設定しておきます。
デフォルトのアクセス権
続いて、DocumentRootと、そのアクセス権を設定します。
名前ベースのバーチャルホスト(Name-based VirtualHost)を構成し、実際のコンテンツは個別のバーチャルホストで提供することにします。したがって、ここでの設定がデフォルトのものになります。
要するに、クライアントのリクエストが、実際のコンテンツを提供するどのバーチャルホストのServerNameにもマッチしない場合、ここでの設定が適用されることになります。
IPアドレスや、心当たりのない名前でやって来るアクセスには、経験上、ろくなものがないので、httpd.conf内に記述してあるDocumentRootへのアクセスは、Deny from allと設定しておきます。
したがって、全てのコンテンツは、各バーチャルホストの正しい名前を指定してきたアクセスの場合にのみ、提供することになります。
httpd.conf内のDocumentRootはあくまでもダミーなので、ServerNameも、
のように設定しておきます。dummy-host.xdelta.net:80
ログファイルの設定
アクセスログやエラーログは、sysutils/cronologを使って、パイプで渡し、
/var/log/httpd/年/月/日/httpd-access.log/var/log/httpd/年/月/日/httpd-error.log
という感じで、ローテート(ある程度、期間が過ぎれば、ディレクトリごと、tarで固めて圧縮)するようにします。
バーチャルホストを使っているけれども、各ホストごとにログファイルを分けると、その数だけ、cronologのプロセスが増えたりして、あまり良くないので、ログファイル内に、該当ホスト名を記述することにします*2。
また、ローカルの特定のネットワークからのアクセスは、ログに残す意味を感じないので、残さないことにします。
したがって、ログに関する記述は、
ErrorLog "|/usr/local/sbin/cronolog /var/log/httpd/%Y/%m/%d/httpd-error.log"
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%v\" \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-vhost
SetEnvIf Remote_Addr "^192\.168\.11\." dont-log
CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/%Y/%m/%d/httpd-access.log" combined-vhost env=!dont-log
</IfModule>
のようになります。
- *2 ただし、デフォルトのバーチャルホストへのアクセス(予め用意されたホスト名ではなく、IPアドレス・その他で偶然?にやって来たと思われるアクセス)のログは、別個のログファイルに送ることにする。大抵、ワームか何かが送信してくる意味のないアクセスだと思われるので。
以上で、httpd.confの設定は終わりです。
httpd-vhosts.conf
apache20のportの時は、/usr/local/etc/apache2/Includes/のディレクトリ内に、vhost_*.confという設定ファイルがあれば、バーチャルホストの設定ファイルとして、インクルードされていました。
しかし、apache22のportでは、Includesディレクトリ以下の*.confという名前の付いたファイルは、全てhttpd.confから同様に読み込まれてしまいます。
httpd.confを少々書き換えれば済む話ですが、バーチャルホストの設定ファイルは別個に扱いたかったので、/usr/local/etc/apache2/内に、vhostsというディレクトリを作成し、その中に、apache20の時に使用していたバーチャルホストの設定ファイル(vhost_*.conf)をコピーして使い回すことにしました。
これらの設定ファイルを呼び出すため、Includesディレクトリ内に、httpd-vhosts.confという名前で、
NameVirtualHost 192.168.11.21:80 <VirtualHost 192.168.11.21:80> ServerAdmin none ServerName dummy-host.xdelta.net:80 DocumentRoot "/usr/local/www/apache22/data" HostnameLookups On ErrorLog "/var/log/httpd-dummy-host-error.log" CustomLog "/var/log/httpd-dummy-host-access.log" combined-vhost </VirtualHost> Include etc/apache22/vhosts/vhost_*.conf
という設定のファイルを作成しました*3。
もし、アクセスしてきたクライアントのリクエストが、vhosts/vhost_*.conf内に記述されたServerNameのいずれにも該当しない場合、デフォルトのdummy-host.xdelta.net:80の規定が適用されることになります(したがって、httpd.confに記述したように、アクセスは全て拒否され、ログファイルに関しては、上記の設定が反映されて、別のファイルに出力され、ついでに普段はOffのアクセス元のホスト名の参照も有効になる)。
- *3
192.168.11.21とは、単にここで、Webサーバ(jail環境)に割り当ててあるIPアドレスのこと。
httpd-languages.conf
言語ネゴシエーションに必要な設定*4が書かれているので、extraのディレクトリから、Includeのディレクトリに、そのままコピーしました。
- *4 これがないと、Apacheのマニュアルが文字化けした。
httpd-ssl.conf
extra/httpd-ssl.confをIncludesディレクトリにテンプレートとしてコピーしました。
apache20の時との主な相異点は、SSLCertificateFileと、SSLCertificateKeyFileを置いておくPATHが変わっていたことです。
apache20の時はそれぞれ、
/usr/local/etc/apache2/ssl.crt/server.crt/usr/local/etc/apache2/ssl.key/server.key
がssl.confのデフォルトの位置だったけど、apache22では、
/usr/local/etc/apache22/server.crt/usr/local/etc/apache22/server.key
になっていました(要するに、専用のディレクトリに入らなくなっただけ)。各ファイルは、既に、生成済みだったので、パーミッション(0600)に注意して、該当の場所にコピーしました。
後は、apache20の時と同じ様に、
DocumentRootServerNameServerAdmin
の箇所を変更して、DocumentRootに指定したディレクトリを<Directory>〜</Directory>で、アクセス権等を指定した程度です。
SSLを有効にするため、apache20の時のように、/etc/rc.confに、apache2ssl_enable="YES"等を追加する必要はなく、SSLの設定が読み込まれていれば、自動的に有効になるみたい。
ただ、SSL付きの時と、そうでない時のtop(1)のSTATEの表示が異なるのが、ちょっと気になりました…。
httpd-autoindex.conf
ディレクトリにアクセスした時に、その中にあるファイル等が簡素なリスト表示だけだというのも寂しいので、extra/httpd-autoindex.confも、Includes/内にコピーしました。
その他
Digest認証を設けてあるディレクトリにアクセスしたところ、500エラーが出ました。
どうやら、
AuthName "private area" AuthType DigestAuthDigestFile /home/USER/.htdigestAuthUserFile /home/USER/.htdigest <Limit HEAD GET POST> Require valid-user </Limit>
のように該当ディレクトリの.htaccessを改めなければならなかったらしい。
しかし、その他にも、いろいろと変更点があるのだと思う。マニュアルをよく読まねば…。
Trackback address for this post
Trackback URL (right click and copy shortcut/link location)
1 comment
httpd.confの最後の方にあるように、
# Supplemental configuration # # The configuration files in the etc/apache22/extra/ directory can be # included to add extra features or to modify the default configuration of # the server, or you may simply copy their contents here and change as # necessary. # Server-pool management (MPM specific) #Include etc/apache22/extra/httpd-mpm.conf # Multi-language error messages #Include etc/apache22/extra/httpd-multilang-errordoc.conf # Fancy directory listings #Include etc/apache22/extra/httpd-autoindex.conf # Language settings #Include etc/apache22/extra/httpd-languages.conf # User home directories #Include etc/apache22/extra/httpd-userdir.conf # Real-time info on requests and configuration #Include etc/apache22/extra/httpd-info.conf # Virtual hosts #Include etc/apache22/extra/httpd-vhosts.conf # Local access to the Apache HTTP Server Manual #Include etc/apache22/extra/httpd-manual.conf # Distributed authoring and versioning (WebDAV) #Include etc/apache22/extra/httpd-dav.conf # Various default settings #Include etc/apache22/extra/httpd-default.conf # Secure (SSL/TLS) connections #Include etc/apache22/extra/httpd-ssl.conf # # Note: The following must must be present to support # starting without SSL on platforms with no /dev/random equivalent # but a statically compiled-in mod_ssl. #
の必要なもののコメントを外して、extraディレクトリの内の設定ファイルを直接インクルードするのが、多分、正しいやり方。
見慣れないファイルがいろいろあって、わかりにくかったので、今回は、Includesディレクトリ内へ、使うものだけ、一つ一つコピーするようにするというようにしてました。