Apacheを起動する前に

昨日はデフォルトでインストールしましたが、まず起動する前にconf/httpd.confの内容をチェックします。このときに不要な設定項目は省き、セキュリティホールになりそうな項目は修正します。
私の場合、userとgroupをnobodyに設定し、OptionのIndexesは削除、ExecCGIの追加、CGIハンドラの追加を行いました。

因みにApache2.2.0に関しては、標準の状態でエラー画面上へバージョン情報を載せたり、マニュアルページのエイリアスや、index.htmlが『It works!』とだけ表示するものだったり色々と考慮されています。(もしかすると現在だけかも知れませんが…)。また言語関係の設定等あまり弄ることの無い項目は別ファイルに分離されていてhttp.conf自体はかなりスッキリしています。バーチャルホストやSSLも別ファイルになっておりました。尚、それらの別ファイルはconf/extra/の下にあります。但しmagicとmime.typesだけはconf/の下に残っています。初期状態の設定のコピーはconf/original/の下にあります。

これらの設定が完了したら、
# /usr/local/apache/bin/apachectl start
で起動します。

因みにログのローテーションはrotatelogを使用しました。Linux等ではOSにインストールされているlogrotateを使用する方法もありますが、ローテーションの度にApacheを再起動する事になるのでこちらを選択。但しrotatelogは世代管理をしないので別途過去ログを処理するプログラムを設置しないとずっと溜まり続けてスペースを圧迫します。

rotatelogを使用して毎日ログを分ける場合の設定内容。ネットではTransferLogを使ってそれを分割する例が多いのですがそれでは元々の本体がそのまま残っていて2倍スペースを圧迫するだけなので直接CustomLogに記述します。

CustomLog “|/usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/access_log.%Y-%m-%d 86400” combined

自動起動とログの区分けについてはまた明日設定します。
ログの区分けは、ワーム等からのリクエストや、favicon.ico、検索ロボット等アクセス解析には不要なアクセスを分離するために行います。

Apache2.2.0を導入

最近2.1シリーズが開発されているなぁと見ていたが既に2.2.0がリリースされていたのでインストールをしてみることにしました。元々準備しているサーバーではメモリーも少なくスワップ行きになりそうで恐いのですがどの道必要になってくるので導入。

最終構成としては、セキュリティレベルを上げるためのSUEXECとSSL通信(これはゲーム用アカウントの認証に使用)

とは言っても新しいバージョンになるので最初は標準インストール。

# tar zxf httpd-2.2.0.tar.gz
# cd httpd-2.2.0
# ./configure –prefix=/usr/local/apache
# make
# make install

インストール終了後はどのような構成か確認。
# /usr/local/apache/bin/httpd -V
Server version: Apache/2.2.0
Server built: Feb 12 2006 00:39:58
Server’s Module Magic Number: 20051115:0
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_HAVE_IPV6 (IPv4-mapped addresses enabled)
-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/apache”
-D SUEXEC_BIN=”/usr/local/apache/bin/suexec”
-D DEFAULT_PIDLOG=”logs/httpd.pid”
-D DEFAULT_SCOREBOARD=”logs/apache_runtime_status”
-D DEFAULT_LOCKFILE=”logs/accept.lock”
-D DEFAULT_ERRORLOG=”logs/error_log”
-D AP_TYPES_CONFIG_FILE=”conf/mime.types”
-D SERVER_CONFIG_FILE=”conf/httpd.conf”

# /usr/local/apache/bin/httpd -l
Compiled in modules:
core.c
mod_authn_file.c
mod_authn_default.c
mod_authz_host.c
mod_authz_groupfile.c
mod_authz_user.c
mod_authz_default.c
mod_auth_basic.c
mod_include.c
mod_filter.c
mod_log_config.c
mod_env.c
mod_setenvif.c
prefork.c
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_so.c

dateコマンドで前日を取得

日付をファイル名に含んだログファイルをバッチ処理する際に前日の計算が必要になります。最初は前日の計算でネット検索していましたが、今日の日付から閏年まで考慮して自前で計算するスクリプトばかり出てきたので、なんとかもっとスマートな方法は無いかとdateコマンドの仕様を探って見つけた方法を紹介。

Linuxの場合
date –date ‘1 day ago’

FreeBSDの場合
date -v -1d

で前日を取得できます。
これをログファイルのフォーマットに合わせてシェルスクリプトに定義すると、

Linuxの場合
date=`date –date ‘1 day ago’ +%Y-%m-%d`
logfile=access_log.$date

FreeBSDの場合
date=`date -v -1d +%Y-%m-%d`
logfile=access_log.$date

で解決します。