Apache2.2

リナックスで動くもっとも有名なHTTP サーバーです。多機能で安定してます。
更新日 2016-02-13

概要

Apache は歴史も長く、今も開発が続いている有名なウェッブサーバーです。多数の機能がプラグインでも 用意されており、業界標準となっているので安心です。

インストール

Apache HTTP SERVER PROJECT から最新版(2.2系)をダウンロードします。
最初にコンパイルの設定を行います。モジュールをスタティックに組んだり要らないモジュールを削る等、 オプションで設定します。http://httpd.apache.org/docs/2.2/mod/ 主なモジュール一覧です。ステータスがBase に分類 されているモジュールはデフォルトで組み込まれます。外すには--disable_プレフィックスを付けたオプションを明示しないといけません。

コンパイル

./configure コマンドでコンパイルの設定を行います。--prefix= にはインストール先のディレクトリパスを設定します。 ヴァージョンで作っておいて、後に/usr/local/apache2 にシンボリックリンクを張ります。
yum install zlib zlib-devel

cd /usr/local/src
wget "http://ftp.riken.jp/net/apache/httpd/httpd-2.2.29.tar.gz"
tar zxvf httpd-2.2.29.tar.gz
cd httpd-2.2.29

./configure\
 --prefix=/usr/local/apache2.2.29\
 --with-included-apr\
 --enable-deflate\
 --enable-usertrack\
 --enable-ssl\
 --enable-headers\
 --enable-proxy\
 --enable-proxy-balancer\
 --enable-proxy-ajp\
 --enable-rewrite\
 --enable-cache\
 --enable-disk-cache\
 --enable-mem-cache\
 --enable-so\
 --enable-expires

make
make install

// apache2 にシンボリックリンクを張ります
ln -s /usr/local/apache2.2.29 /usr/local/apache2

再度コンパイルする時

make clean を忘れずに実行して、前回コンパイル時の生成物をクリアしましょう。

コンパイルエラー

yum install gcc は必須です。
configure の段階で[configure: error: mod_deflate has been requested but can not be built due to prerequisite failures] というエラーが出た場合、yum install zlib-devel を実行します。
configure の段階で[configure: error: ...No recognized SSL/TLS toolkit detected] というエラーが出た場合、yum install openssl-devel を実行します。

apache 起動スクリプト

chkconfig を使って自動起動を簡単に指示できます。
vi /etc/init.d/httpd

 #!/bin/sh
 #
 # chkconfig: 35 86 14
 # description: apache 2.2.29

 case "$1" in
  start|stop|restart|status)

 /usr/local/apache2/bin/apachectl $@
 ;;
 esac


// 起動権限を与えて、自動スタートをオンに
chmod 755 /etc/init.d/httpd
chkconfig httpd on
まだ起動せずに初期設定を続けて行います。

初期設定

専用ユーザーやグループの設定

apache 専用ユーザーhttpd を作成。公開するドキュメントルート以下は全て所有者httpd、グループはwebuser とする。 各ドキュメントのあるホームディレクトリのユーザーは皆グループwebuser に属する。
useradd httpd
groupadd webuser

httpd.conf の設定

Apache が参照する設定ファイルです。apache2.2 からはデフォルトの設定がより見やすく書かれています。virtualhost や SSL 回りも準備されてるので、旧来よりのアップグレードの場合でも雛形から再設定した方が無難かもしれません。(以前使って いたhttpd.conf はエラーになったので)
cd /usr/local/apache2/conf
cp original/httpd.conf ../

vi httpd.conf
 ServerName FQDN:80


// httpd 子プロセスの実行ユーザー
#User nobody
User httpd

// httpd 子プロセスの実行グループ
#Group -1
Group webuser

// サーバー管理者のアドレス error画面等で表示される
#ServerAdmin admin@your-domain.com
ServerAdmin webadmin@qt-space.com

// 外部に公開したいドメインを一つだけ設定する。
// (仮想ホストを利用する場合は無意味かもしれませんが・・・)
#ServerName www.domain.com:80
ServerName www.qt-space.com:80


// mod_deflate を組み込んでいますので、コンテンツ圧縮の設定を
// 最終行に追記します。
<IfModule deflate_module>
	SetEnv gzip-only-text/html 1
	SetOutputFilter DEFLATE
	DeflateCompressionLevel 8
	AddOutputFilterByType DEFLATE text/html text/plain text/xml
	<Location "/">
		SetOutputFilter DEFLATE
		BrowserMatch ^Mozilla/4 gzip-only-text/html
		BrowserMatch ^Mozilla/4\.0[678] no-gzip
		BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
		SetEnvIfNoCase Request_URI \.(?:gif|jpg?g|png)$ no-gzip dont-vary
		Header append Vary User-Agent env=!dont-vary
	</Location>
</IfModule>


// アクセスログにサーバー攻撃系の(やたらに長い引数を伴う事が多い)URL が
// 記載されないようにする為のカスタム・ログフォーマットを定義します。
LogFormat "%h\"%{%Y/%m/%d %H:%M:%S}t\"%m\"%U\"worm?\"%H\"%>s\"%B\"%{User-agent}i"\
 worm_format
LogFormat "%h\"%{%Y/%m/%d %H:%M:%S}t\"%m\"%U\"%q\"%H\"%>s\"%B\"%{User-agent}i"\
    user_format

<IfModule mod_setenvif.c>
	SetEnvIf Request_URI "\.(gif|jpg|png|css|ico|js)"	no-logging
	SetEnvIf Request_URI "^/_mem_bin/"	worm-log no-logging
	SetEnvIf Request_URI "^/_vti_bin/"	worm-log no-logging
	SetEnvIf Request_URI "^/c/"			worm-log no-logging
	SetEnvIf Request_URI "^/d/"			worm-log no-logging
	SetEnvIf Request_URI "^/msadc/"		worm-log no-logging
	SetEnvIf Request_URI "^/MSADC/"		worm-log no-logging
	SetEnvIf Request_URI "^/scripts/"	worm-log no-logging
	SetEnvIf Request_URI "NULL\.IDA"	worm-log no-logging
	SetEnvIf Request_URI "default\.ida" worm-log no-logging
	SetEnvIf Request_URI "root\.exe"	worm-log no-logging
	SetEnvIf Request_URI "cmd\.exe"		worm-log no-logging
	SetEnvIf Request_URI "Admin\.dll"	worm-log no-logging
</IfModule>
リクエストURI 中にスパムアクセス特有の文字列があるかどうかを調べ、環境変数としてworm-log やno-loggin を設定しています。 この環境変数はリクエスト毎に任意の名前で設定できます。CustomLog ディレクティブやmod_rewrite において、環境変数を条件分岐に 使う事ができます。
apache2/bin/apachectl -t と打てばhttpd.conf の構文チェックを行う事ができます。

名前ベースの仮想ホストを使う

どちらも同じIP とポート(80)ですが、ブラウザから渡されるFQDN を元に判断します。まずhttpd.conf にてextra/httpd-vhosts.conf を Include するよう設定。
vi /usr/local/apache2/conf/httpd.conf

 // 名前ベースの仮装ホストを行いたいのでコメントを外す
 #Include conf/extra/httpd-vhosts.conf
 Include conf/extra/httpd-vhosts.conf
仮装ホストの設定はhttpd.conf のあるディレクトリの中にあるextra/httpd-vhosts.conf にて記述します。テンプレートが記載済みなので 編集して使っても良いでしょう。apache2.2 以降からはデフォルトで全てのディレクトリにアクセス制限されてますので、公開したいディレクトリ 毎にアクセス許可も記述します。
<VirtualHost *:80>
	ServerAdmin test@qt-space.com
DocumentRoot/home/test
ServerName test.qt-space.com // 公開したいバーチャルドメイン名 ErrorLog logs/vhosts-error_log
CustomLog "|bin/rotatelogs /home/logs/test_access_log.%y%m%d 86400 540" user_format env=!no-logging" CustomLog "|bin/rotatelogs /home/logs/worm_log.%y%m%d 86400 540" worm_format env=worm-log" <Directory /home/test > Order deny,allow Allow from all </Directory> </VirtualHost>
上記の例ではカスタムログを/home/logs に保存しています。ディレクトリも合わせて作っておきます。スパムアクセスは途方もなく長い クエリを付けて来る事もありログファイルがパンクしがちなので、環境変数を識別して異なるログに分けて出力しています。

CGI やSSI を動かす

httpd.conf を編集します。
// 以下を有効にします。
<IfModule mime_module>
	AddType text/html .shtml
	AddOutputFilter INCLUDES .shtml
</IfModule>

// 記載のフォルダ以下に配置された.shtml からSSIを実行する事を許可します。
<Directory /usr/local/apache2/htdocs>
	Options +ExecCGI +Includes
	AddHandler cgi-script .cgi .pl
</Directory>

SSI の記述について

/cgi-bin/ といったスクリプトエイリアスを経由する場合はvirtual 属性を用いるようです。
<!--#include file="count.pl" -->
<!--#include virtual="/cgi-bin/count.pl" -->

mod_rewrite を使う

mod_rewrite はリクエスト情報を判別して異なるページを返したい時に利用します。Alias と似ていますが、柔軟なパスの再構築や、 他のサイトのページすらフォワード(内部プロキシ)できる点が決定的にちがいます。Tomcat などのサーブレットコンテナにAJP で接続する場合に コレを使います。

使い方

最初のmod_rewrite を使う旨を示す"RewriteEngine on" を書きます。続けて処理パターン"RewriteRule" を定義していゆきます。
RewriteEngine on
RewriteLogLevel 3
RewriteLog logs/rewrite.log

# [P,L] P はProxy として動作, L をRewruteRule をこれ以降は適用しない
RewriteRule ^/(images|swf)/(.*)		http://localhost/$1/$2	[P,L]

RewriteRule ^/shopping_cart.html$ ajp://localhost:8009/AST/shopping_cart.action [P,L]

# [PT] はRewriteRule 適用後に、再度Alias 等のマッチングを行います
RewriteRule ^/jquery.js$		/jquery-1.3.min.js		[PT, L]
()で囲んだ文字列は、前から順に$1, $2 で使う事ができます。上記の様にログ出力を利用すれば、どのように書き換えられて行くかデバッグできます。

RewriteCond

パス以外の情報を処理したい場合に使います。
RewriteCond %{QUERY_STRING}		keyword=(.*)
RewriteRule ^(.*)$		

Apache の動作チェック

http://192.168.1.2/ にアクセスして表示が出れば動作中です。起動が確認できない場合、まずlogs ディレクトリの中のerror_log あたりを読んでください。原因が書かれています。