パンダのメモ帳

技術系のネタをゆるゆると

/etc/httpd/conf.d 以下の設定ファイルで syntax highlight 改訂版

/etc/httpd/conf.d 以下の設定ファイルを vim で編集する際に syntax highlight を有効にする方法について、http://d.hatena.ne.jp/shogo0809/20091225/1261737524 で行った方法がよろしくなかった事を知ったので、正しい手順で再度メモ。。

1. 事前準備

必要なディレクトリを作成する。すでに存在する場合は不要。

[root@localhost ~]# mkdir ~/.vim
[root@localhost ~]# mkdir ~/.vim/ftdetect

2. ファイル判定スクリプトの記述

~/.vim/ftdetect 以下に、以下のようなファイルを作成する。

au BufRead,BufNewFile /etc/httpd/conf/*,/etc/httpd/conf.d/* set filetype=apache

名前は何でもいい(~/.vim/ftdetect/apache.vim とか)。

これだけでOK。さすがvim、ちゃんとかゆいところに手が届くようになってるんだなぁ、と痛感した。

CentOS 5.4でDNSサーバーの構築

CentOS 5.4にBINDを導入し、DNSサーバーとして動作させる。

1. 要件と仮定

今回の要件は以下の通り。

  • 保有している独自ドメイン用のゾーンサーバーとして動作させる。
  • 同時に、内部ネットワーク用のキャッシュサーバーとしても動作させる。

便宜上、設定等について以下の通り仮定する。

  • 固定IPネットワーク 123.45.67.0/29 を取得済みであるとする。
  • 内部ネットワークは 192.168.0.0/24 であるとする。
  • 保有する独自ドメインは example.com であるとする。

2. インストール

yumからインストールを行う。セキュリティを考慮してchroot環境で動作させたいので、bind-chroot も同時に導入しておく。

[root@localhost ~]# yum -y install bind bind-chroot

2009年12月24現在、yumでインストールした場合のバージョンは 9.3.6 だった。以降の手順の確認は本バージョンで行っており、以前・以降のバージョンでは異なる場合があるので注意してほしい。

3. 設定

まず、bindの設定ファイルである named.conf を作成する。bind-chrootを導入した場合のパスは /var/named/chroot/etc/named.conf だ。設定方法が複雑なため、細かくコメントを入れているが、実際のファイルにコメントを記述する必要はない。
BIND9から実装された view ステートメントにより、リクエスト元のアドレスや受信インターフェースのアドレスなどにより、namedの挙動や返答内容を変えることができる。
view 定義は先頭から順に評価され、最初に全条件にマッチした view が使用される。ここではLAN向けの view と WAN向けの view を定義し、LAN向けには再帰問い合わせを許可するようにしている。また、LANへはローカルIP、WANへはグローバルIPを返すよう、ゾーンファイルをLAN用とWAN用で分けている。

# ネットワーク定義。ローカルネットワークを定義している。
acl "lan" {
	127.0.0.1;
	192.168.0.0/24;
};
# ネットワーク定義。ゾーン転送を許可するホストを定義している。
# 有効なスレーブサーバーのIPを全て指定すればOK。
acl "slaves" {
	192.168.0.3;
};
# デフォルトオプション設定
options {
	# ゾーン情報が更新された場合にスレーブサーバーへ通知する。
	notify	  		yes;
	# バージョン情報を非公開とする。
	version	 		"unknown";
	# ゾーン情報が格納されているディレクトリ。
	# chroot環境の場合、以下の設定で /var/named/chroot/var/named となる。
	directory		"/var/named";
	# ゾーン情報が更新された場合に通知するホストのリスト。
	also-notify		{ slaves; };
	# ゾーン情報のコピー(ゾーン転送)を許可するホストのリスト。
	allow-transfer		{ slaves; };
};
# ログ設定
logging {
	# 通常のログチャンネル
	channel "log_default" {
		# ログファイルの指定とログの最大サイズ、保管世代数の指定
		file		"/var/log/default.log" versions 7 size 10m;
		# ログのレベルの指定
		severity	info;
		# ログの各行に日時を記録する
		print-time	yes;
		# ログの各行にカテゴリ名を記録する
		print-category	yes;
	};
	# セキュリティ関連ログチャンネル
	channel "log_security" {
		file		"/var/log/security.log" versions 7 size 10m;
		severity	info;
		print-time	yes;
		print-category	yes;
	};
	# 通常のログはログチャンネル log_default に記録。
	category "default"	{ log_default; };
	# セキュリティ/クライアント関連のログはログチャンネル log_security に記録。
	category "security"	{ log_security; };
	category "client"	{ log_security; };
};
# LAN用VIEW
view "internal" {
	# 条件:ローカルネットワーク内からのリクエストである事。
	match-clients		{ lan; };
	# 条件:ローカルIPへ送られてきたリクエストである事。
	match-destinations	{ lan; };
	
	# 再帰問い合わせに応答する。
	recursion		yes;
	
	# ルートヒントファイルを読み込む。
	include			"/etc/named.root.hints";
	
	# RFC1912に定義されているローカルエリア等のゾーン情報を読み込む。
	include			"/etc/named.rfc1912.zones";
	
	# LAN向け example.com 正引きゾーン定義
	zone "example.com" {
		type		master;
		file		"example.com.lan.zone";
	};
	
	# IPネットワーク 192.168.0.0/24 逆引きゾーン定義
	zone "0.168.192.in-addr.arpa" {
		type		master;
		file		"lan.rev";
	};
};
# WAN用VIEW
view "external" {
	# 条件:LAN用VIEWにマッチしなかった全ての接続が対象となる。
	match-clients		{ any; };
	match-destinations	{ any; };
	
	# 再帰問い合わせに応答しない。
	recursion		no;
	
	# WAN向け example.com 正引きゾーン定義
	zone "example.com" {
		type		master;
		file		"example.com.wan.zone";
	};
	
	# IPネットワーク 123.123.123.0/29 逆引きゾーン定義
	# ゾーン名はISPから指定された名前を設定すること。
	# また、ISPから逆引き権限が委譲されない場合、設定は不要。
	zone "sub-a.67.45.123.in-addr.arpa" {
		type		master;
		file		"wan.rev"
	}
};

次に /var/named/chroot/etc/named.root.hints を以下の様に作成する。

zone "." {
	type	hint;
	file	"named.root";
};

続いて /var/named/chroot/etc/named.rfc1912.zones を作成する。/usr/share/doc/bind-9.3.6/sample/etc/named.rfc1912.zones にあるサンプルをそのままコピーすればOK。

[root@localhost ~]# cd /usr/share/doc/bind-9.3.6/sample/etc
[root@localhost etc]# cp named.rfc1912.zones /var/named/chroot/etc/

/var/named/chroot/var/named 以下に必要なファイルをコピー(または作成)する。

[root@localhost ~]# cd /usr/share/doc/bind-9.3.6/sample/var/named
[root@localhost named]# cp local*.zone /var/named/chroot/var/named/
[root@localhost named]# cp named.* /var/named/chroot/var/named/
[root@localhost named]# chown root:named *.*
[root@localhost named]# chmod 644 *.*

ログファイルが存在しないとログの記録が開始されないため、あらかじめ用意しておく。

[root@localhost ~]# mkdir /var/named/chroot/var/log
[root@localhost ~]# touch /var/named/chroot/var/log/default.log
[root@localhost ~]# touch /var/named/chroot/var/log/secuirty.log
[root@localhost ~]# chgrp named /var/named/chroot/var/log/*.log
[root@localhost ~]# chmod 664 /var/named/chroot/var/log/*.log
[root@localhost ~]# ln -s /var/named/chroot/var/log /var/log/named

4. 正引きゾーンファイルの作成

いよいよ自ドメイン用の設定に入る。ドメインからIPを割り出すためのデータファイルは「ゾーンファイル」と呼ばれ、ドメインごとに作る必要がある。ゾーンファイルは「レコード」と呼ばれる情報を列挙する形で記述する。レコードの形式は次のようになっている。

ホスト[	TTL]	クラス	タイプ	データ[	データ[	データ]*]

「ホスト」はその名の通りホスト名を指定する。省略に関するルールが絡むので混乱しやすい。省略しない場合は「hostname.example.com.」の様に ホスト名.ドメイン名. の形となるが、ドメイン部は省略可能なので「hostname」とだけ書いても同じ意味になる。また、「@」とだけ書いた場合は「example.com.」と解釈される。また、レコードの先頭が空白文字で始まる=ホストを省略した場合、直前のレコードと同じホストが指定されたと見なされる。
TTL」はそのレコードがキャッシュされた場合の有効期限だが、レコード毎にTTLを変える事は稀であり、たいてい省略される。省略した場合、$TTL で設定した数値が指定されたと見なされる。
「クラス」は本来ネットワークの種別などを指定するために存在するが、現在ではインターネットを表す "IN" 以外の設定はまず行われない。省略しないこと。
「タイプ」はレコードの種別を表す。使用可能なタイプと簡単な説明は下記の通り。

タイプ 用途
SOA ゾーンファイルに必ず必要となるレコード。ゾーンに関する情報などを指定する。
NS ネームサーバーの指定。
MX メールサーバーの指定。
A ホスト名に対応するIPv4アドレスの指定。
AAAA ホスト名に対応するIPv6アドレスの指定。
CNAME ホストの別名(Canonical Name)の指定。
PTR PoinTeRレコード。主に逆引き設定に使用される。

「データ」はタイプ毎に必要なパラメータを指定する。必要なパラメータの内容や数はタイプによって異なる。データ部にホスト名を指定する場合、ホスト部と同様のルールで省略が可能。

各パラメータは任意の数の空白(半角スペースまたはTab文字)で区切られ、レコードとレコードの間は改行で区切られる。ただし、SOAレコードなどは1行に記述すると見づらいため、括弧でくくる事で複数行の記述も可能だ。

LAN向け正引きデータである /var/named/chroot/var/named/example.com.lan.zone を例に記述方法を解説する。

; デフォルトのTTL(キャッシュ有効期限)。以下の場合1日に設定。
$TTL 86400
; SOAレコード(詳細は後述)
@		IN	SOA	ns1	root (
				2009122401	; Serial
				3H		; Refresh
				1H		; Retry
				1W		; Expire
				1H		; Min-TTL
)
; NSレコード
; データ部にはネームサーバーのホスト名を指定する。
		IN	NS	ns1
		IN	NS	ns2
; MXレコード
; データ部には優先度とホスト名を指定する。
; 優先度が低いサーバーから使用される。
		IN	MX	10	mail
; Aレコード
; ホスト名に対応するIPアドレスを指定する。
		IN	A	192.168.0.2
mail		IN	A	192.168.0.2
router		IN	A	192.168.0.1
host01		IN	A	192.168.0.2
host02		IN	A	192.168.0.3
host03		IN	A	192.168.0.4
; CNAMEレコード
; ホスト名に対応するホスト名を指定する。
ns1		IN	CNAME	host01
ns2		IN	CNAME	host02
www		IN	CNAME	host01

SOAレコードに記述するデータは

  • NameServer
  • MailAddress
  • Serial
  • Refresh
  • Retry
  • Expire
  • Minimum

と7つもあるため、上記のように括弧を使って複数行に分けるのが通例。それぞれ次の通り設定する。

項目 設定内容
NameServer ns1 ドメインのプライマリネームサーバー、つまりBINDをセットアップ中のサーバーのホスト名を指定する。例の場合 "ns1.example.com" となる。
MailAddress root ゾーンファイルに記述されているドメインについての連絡先。例の場合 "root@example.com" となる。
Serial 2009122401 ゾーン情報の改訂番号。ゾーンファイルを更新した場合に以前より大きい数値を指定する必要がある。YYYYMMDD+2桁の連番とするのが通例。
Refresh 3H スレーブサーバーによる更新確認頻度の指定。例の場合3時間。
Retry 1H スレーブサーバーが更新確認に失敗した場合のリトライ間隔。例の場合1時間。
Expire 1W スレーブサーバーが更新を行わなかった場合のゾーン情報有効期限。指定期間以内に再び更新を行わなかったスレーブサーバーはクライアントからのリクエストに応答できなくなる。
Min-TTL 1D ネガティブキャッシュの有効期限。ネガティブキャッシュについては後述する。

ネガティブキャッシュについて説明するためには、まずDNSサーバーの役割について解説する必要がある。要件でもさらりと書いたが、DNSには大きく分けて2つの機能がある。

ゾーンサーバー
ドメインからIP、IPからドメインへの名前解決を実際に行うサーバー。ゾーン情報を保有する。
キャッシュサーバー
クライアントからの問い合わせに応じて外部のゾーンサーバーに問い合わせを行い、その結果をクライアントに返すと共に、一定期間結果をキャッシュする。

このキャッシュサーバーによる「キャッシュ」は正常な応答をキャッシュするのはもちろん、名前解決に失敗した事も記憶する。この失敗についての記憶が「ネガティブキャッシュ」だ。SOAレコードの「Min-TTL」はこのネガティブキャッシュの有効期限を指定するパラメータとなる。

ゾーンファイルを作成したら、named-checkzone コマンドで間違いがないか確認する。以下のように「OK」とでれば問題なし。

[root@localhost ~]# named-checkzone example.com /var/named/chroot/var/named/example.com.lan.zone 
zone example.com/IN: loaded serial 2009122401
OK

同様に、WAN向けのゾーンファイル example.com.wan.zone も作成し、チェックしておく。

5. 逆引きゾーンファイルの作成

次にLAN向け逆引きデータ /var/named/chroot/var/named/lan.rev を作成する。SOAレコードとNSレコードについては正引きの場合とほぼ一緒でOK。PTRレコードは同じIPについて1レコードしか記述できないので注意。

$TTL 86400
@		IN	SOA	ns1	 root (
			2009122401	; Serial
			10800		; Refresh
			3600		; Retry
			604800		; Expire
			86400		; Minimum
)
; NSレコード
		IN	NS	ns1.example.com.
		IN	NS	ns2.example.com.
; PTRレコード
; IPからドメイン名に変換する逆引き設定。
1		IN	PTR	router.example.com.
2		IN	PTR	host01.example.com.
3		IN	PTR	host02.example.com.
4		IN	PTR	host03.example.com.

こちらも named-checkzone コマンドで確認する。

[root@athena named]# named-checkzone 0.168.192.in-addr.arpa /var/named/chroot/var/named/lan.rev 
zone 0.168.192.in-addr.arpa/IN: loaded serial 2009122401
OK

同様に、WAN向け逆引きデータ wan.rev も作成し、チェックしておく。

6. namedの起動と確認

namedを起動し、次回から自動的に実行されるように設定する。

[root@localhost ~]# service named start
[root@localhost ~]# chkconfig named on

起動したら、dig コマンドで応答を確認する。

[root@localhost ~]# dig @127.0.0.1 www.example.com

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.1 <<>> @127.0.0.1 www.example.com
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43734
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 0

;; QUESTION SECTION:
;www.example.com.               IN      A

;; ANSWER SECTION:
www.example.com.        86400   IN      CNAME   host01.example.com.
host01.example.com.     86400   IN      A       192.168.0.2

;; AUTHORITY SECTION:
example.com.            86400   IN      NS      ns2.example.com.
example.com.            86400   IN      NS      ns1.example.com.

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Dec 24 18:38:41 2009
;; MSG SIZE  rcvd: 106

こんなカンジに返答が帰ってくればOK。

CentOS 5.4にPHPを導入する

Apache をインストール済みの CentOS 5.4 に PHP を導入し、PHPによるWEBアプリケーションが動作するようにする。

1. 要件

今回の要件は以下の通り。

  • ソースからではなく、yumからインストールを行う。
  • CentOS公式のパッケージはバージョンが古いが、今回は特に気にしない。
  • 以下のモジュールを同時にインストールする。

2. インストール

要件通り、yum でインストールを行う。

[root@localhost ~]# yum -y install php php-gd php-mysql php-mbstring

3. 設定

PHPの設定ファイル(/etc/php.ini)を編集する。以下に特に確認・変更を行うポイントのみを示す。なお、これらの変更は必須ではないので、デフォルトのまま使っても基本的には問題ない。

項目 変更前 変更後 理由
memory_limit 32M 16M デフォルトの16MBのままだと一部アプリケーションが動作しない場合がある。少し余裕を持たせて32Mに変更する。
log_errors On On エラーをログに記録するか否か。Onであることを確認する。
error_reporting E_ALL E_ALL & ~E_NOTICE デフォルトだと、利用するWEBアプリケーションによっては大量のログが記録されてしまう。実行に影響ないエラーは記録しないようにする。
html_errors Off コメントアウトされているので解除する。PHPのエラー表示がHTMLでうれしかった試しがない。
error_log /var/log/php.log 新しく追加するか、コメントアウトを解除して書き換える。エラーログの記録先の指定。
register_globals Off Off この設定をOnにすることはセキュリティホールを自分で作ることと同義。Offであることを確認する。
magic_quotes_gpc Off Off この設定をOnにすると、一部のWEBアプリケーションが動作しなくなる。Offであることを確認する。
date.timezone Asia/Tokyo この項目を設定しないと、一部のWEBアプリケーションが動作しなくなる。正しく設定する。

4. Apache の再起動

Apache+PHP の場合、Apacheを再起動することでPHPモジュールがロードされる。気になる人は /etc/httpd/conf.d/php.conf が作成されていることを確認しよう。確認したら、以下のコマンドで Apache を再起動。

[root@localhost ~]# service httpd graceful

5. 動作確認

試しに、どこか適当なところに下記のようなファイルを作成する。

<?php phpinfo(); ?>

アクセスすると、PHPに関する情報が確認できるページが表示される。設定内容や読み込まれているモジュールの情報が確認できるので、ここで一通り確認しよう。確認が終わったら同ファイルは削除した方がよい。

/etc/httpd/conf.d 以下の設定ファイルで syntax highlight

/etc/httpd/conf.d 以下の設定ファイルを vim で編集する際に syntax highlight を有効にする方法についてメモ。

追記(2010-01-08):以下の方法はお行儀が悪い(=やっちゃいけない)事が判明した。お行儀のよい作法については以下の記事を参照。

1. 経緯

CentOS 5.4 の Apache 2.x では /etc/httpd/conf/httpd.conf の他に /etc/httpd/conf.d 以下のファイルが自動で読み込まれる。これら設定ファイルを編集する機会は多いが、vim で開いても syntax highlight が有効にならない。気にしなければいいし、開く度に

:set syntax=apache

とすれば syntax highlight される……が、気になるし毎回コマンドを入力するのもアホらしい。どうすれば自動で判別してくれるのか。

2. 調査結果

当初、なんらかの方法でファイルを解析して判別していると思っていたのだが、何のことはない、ファイルの拡張子やパスで判別しているに過ぎなかった。その定義が /usr/share/vim/vim70/filetype.vim にある事がわかったので早速覗いてみると、以下のような行を見つけた。

" Apache config file
au BufNewFile,BufRead .htaccess                  setf apache
au BufNewFile,BufRead httpd.conf*,srm.conf*,access.conf*,apache.conf*,apache2.conf*,/etc/apache2/*.conf*,auth_mysql.conf*,auth_pgsql.conf*,ssl.conf*,perl.conf*,php.conf*,python.conf*,squirrelmail.conf* call s:StarSetf('apache')

ここで Apache に関するファイルの定義を行っているわけだが、注目したのは

/etc/apache2/*.conf*

の部分。Debian などの場合これでいいっぽいが、CentOSの場合は /etc/httpd 以下に設定ファイル群がインストールされる。この差が syntax highlight されない原因だと断定。

3. 対応

/usr/share/vim/vim70/filetype.vim の該当部分を以下のように書き換えた。

" Apache config file
au BufNewFile,BufRead .htaccess                  setf apache
au BufNewFile,BufRead httpd.conf*,srm.conf*,access.conf*,apache.conf*,apache2.conf*,/etc/httpd/*.conf*,auth_mysql.conf*,auth_pgsql.conf*,ssl.conf*,perl.conf*,php.conf*,python.conf*,squirrelmail.conf* call s:StarSetf('apache')

書き換えたら保存して、改めて /etc/httpd/conf.d 以下のファイルを開いてみると、バッチリ色づけされている。これで気持ちよく Apache の設定ファイルを編集することができそうだ。

CentOS 5.4でWEBサーバーの構築

CentOS 5.4 に Apache を導入し、WEBサーバーとして動作させる。

1. 要件

今回の要件は以下の通り。

  • バーチャルホスト設定による複数ドメイン運用を行う。
  • アクセス頻度が低い小規模サーバーの構築を目的とする。
  • MPMは導入時のデフォルトである prefork を前提としている。

便宜上、設定等について下記の通り仮定する。

2. インストール

例によって yum からインストールする。

[root@localhost ~]# yum -y install httpd

3. httpd.confの編集

Apacheの設定ファイルは /etc/httpd/conf/httpd.conf にある。以下、主に標準設定から変更した部分についてのみ記述する。詳しい情報は公式のリファレンスマニュアルを参照。いくつかの項目はディレクティブ以下にあるので注意。

項目名 デフォルト 変更後 説明
ServerTokens OS Min エラーページやレスポンスヘッダに含めるサーバー情報の指定。OSやモジュールの情報を含めないようにする。
Timeout 120 60 タイムアウトまでの秒数。120秒では長すぎるので60秒に設定。
KeepAlive Off On 有効にすることで、一度の接続で複数のリクエストを処理できるようになる。
KeepAliveTimeout 15 5 リクエストを受信しない状態で何秒接続を維持するかを秒数で指定する。少なめでOK。
StartServers 8 8 サービス起動時に生成する子プロセスの数。
MinSpareServers 5 3 待機プロセス数の最小値。小規模の場合、あまり大きくしない方がよい。
MaxSpareServers 20 10 待機プロセス数の最大値。小規模の場合、あまり大きくしない方がよい。
ServerLimit 256 128 起動プロセス数の最大値 = 同時接続数。小規模の場合、あまり大きくしない方がよい。
MaxClients 256 128 同上。
LoadModule - - 沢山あるLoadModuleには不要な物も多い。別表を参考に不要なモジュールをコメントアウト。
ServerAdmin root@localhost 実際のメールアドレス サーバー管理者のメールアドレスを指定する。

Apache 2.x系ではモジュール体系(特に認証系)が複雑でわかりづらいので少し説明をする。ここで行った分類は独自調査と独断による分類なので、過信は禁物。

認証フロントエンド(認証F)
アクセス制御にユーザー/パスワード認証を採用する際に、実際にクライアントと認証情報をやりとりする際の手法を決定する。標準ではBasic(平文)認証とMD5-DIGEST認証が使用可能。
認証プロバイダ(認証P)
認証フロントエンドが使用できるユーザー情報には複数の形式があり、認証プロバイダ系モジュールはその各形式を使用するのに必要となる。
認証バックエンド(認証B)
各種アクセス制御の実現に必要となる。アクセス制御にはIP/ホスト単位やユーザー単位、グループ単位などがあり、それぞれ対応したモジュールが必要となる。
認証総合
認証プロバイダと認証バックエンドを兼ね備えたモジュール。
標準
多くの運用において、事実上必須となるモジュール。特に理由がない限り有効にしたほうがよい。
拡張
なくても特に困らないが、場合によっては必要となるモジュール。使用する予定がなければ無効にしてもよい。
WebDAV
WebDAV機能を利用する場合に必要となるモジュール。WebDAVを使用しない場合は無効でよい。
Proxy
プロクシ機能を利用する場合に必要となる。意図的にProxyサーバーとする場合以外、無効にするべき。

実際に標準の httpd.conf で読み込まれているモジュールは下記の通り。

モジュール名 分類 用途
mod_auth_basic 認証F Basic認証を行う場合に必要。
mod_auth_digest 認証F MD5-DIGEST認証を行う場合に必要。
mod_authn_file 認証P テキストファイル(.htpasswd)によるユーザー/パスワード認証に必要。
mod_authn_alias 認証P 認証エイリアスを設定を使用する場合に必要。
mod_authn_anon 認証P 認証時にAnonymous接続を許可する場合に必要。
mod_authn_dbm 認証P DBMファイル(簡易DB)によるユーザー/パスワード認証に必要。
mod_authn_default 認証P 複数の認証プロバイダを同時に使用した場合、いずれのプロバイダでも認証できなかったアクセスを拒否する?
mod_authz_host 認証B IPやホスト名によるアクセス制御を実現する。特定のIP/ホストからのアクセスを拒否したい場合などに用いる。
mod_authz_user 認証B ユーザー単位のアクセス制御を実現する。認証に成功した場合にも、特定のユーザーのみにアクセスを許可したい場合などに用いる。
mod_authz_owner 認証B ユーザー単位のアクセス制御を実現する。認証に成功した場合にも、ファイルの所有者のみにアクセスを許可したい場合などに用いる。公開WEBサーバーでは必要性は低い。
mod_authz_groupfile 認証B グループ単位のアクセス制御を実現する。認証に成功した場合にも、特定のグループに所属するユーザーのみにアクセスを許可したい場合などに用いる。グループの設定はテキストファイルで行う。
mod_authz_dbm 認証B グループ単位のアクセス制御を実現する。認証に成功した場合にも、特定のグループに所属するユーザーのみにアクセスを許可したい場合などに用いる。グループの設定はDBMファイルで行う。
mod_authz_default 認証B 複数の認証バックエンドを同時に使用した場合、いずれのバックエンドでも認証できなかったアクセスを拒否する?
mod_ldap 拡張 LDAP接続の管理を行うモジュール。mod_authz_ldapを使用する場合は必須。
mod_authz_ldap 認証総合 LDAPによるユーザー/パスワード認証、およびアクセス制御を実現する。
mod_include 拡張 SSI機能を使用する場合に必要。
mod_log_config 標準 アクセスログの記録に必要。
mod_logio 標準 アクセスログに入出力データサイズを記録するのに必要。
mod_env 標準 CGIなどに環境変数を渡すのに必要。
mod_ext_filter 拡張 有効にすることで、レスポンス内容に任意のフィルタリング処理を行うことができるようになる。あまり使用されない。
mod_mime_magic 標準 拡張子などからMIMEタイプが判別できなかった場合に、ファイルの内容からMIMEタイプを識別する。
mod_expires 拡張 有効にすることで、ExpireヘッダとCache-Controlヘッダを動的に制御できるようになる。
mod_deflate 拡張 有効にすることで、レスポンス内容を圧縮して転送量を軽減する DEFLATE フィルターを使用できるようになる。
mod_headers 拡張 有効にすることで、リクエストヘッダ/レスポンスヘッダの制御を行うことができるようになる。
mod_usertrack 拡張 有効にすることで、Cookieによるユーザー追跡が可能になる。アクセス解析で必要とされない限りいらない。
mod_setenvif 標準 リクエスト内容に応じて環境変数を設定する機能を提供。
mod_mime 標準 MIMEタイプの判定や、MIMEタイプ/拡張子別の設定を行うのに必要。
mod_dav WebDAV WebDAV機能のメインモジュール。
mod_status 拡張 有効にすることで、Web上でサーバーの動作状況を確認できるようになる。セキュリティリスクに注意。
mod_autoindex 拡張 有効にすることで、indexファイルが存在しない場合にディレクトリ内容を表示できるようになる。
mod_info 拡張 有効にすることで、Web上でApacheの設定状況を確認できるようになる。セキュリティリスクに注意。
mod_dav_fs WebDAV WebDAV機能のファイルシステム制御モジュール。
mod_vhost_alias 拡張 有効にすることで、動的バーチャルホスト機能が利用できるようになる。
mod_negotiation 拡張 有効にすることで、HTTP/1.1のコンテンツネゴシエーション機能が利用できるようになる。
mod_dir 標準 DirectoryIndexなど、ディレクトリに関するいくつかの設定を行うのに必要。
mod_actions 拡張 有効にすることで、特定のリクエストメソッドやMIMEタイプが呼び出された際に自動でCGIスクリプトを実行できるようになる。まず不要。
mod_speling 拡張 有効にすることで、ユーザーが入力ミスをした場合にも正しいコンテンツに誘導することを試みる機能が利用できるようになる。まず不要。
mod_userdir 拡張 有効にすることで、http://www.example.com/~user/ のようなユーザー毎の公開ディレクトリを設定できる様になる。
mod_alias 標準 エイリアス設定を行うのに必要。
mod_rewrite 拡張 有効にすることで、特定のパスを別のパスにマッピングするリライト機能が利用できるようになる。
mod_proxy Proxy HTTP/1.1 プロキシ/ゲートウェイサーバ−。
mod_proxy_balancer Proxy Proxyサーバーに負荷分散機能を提供する。
mod_proxy_ftp Proxy ProxyサーバーでFTPサーバーへアクセスできる様にする。
mod_proxy_http Proxy ProxyサーバーでHTTPサーバーへアクセスできる様にする。
mod_proxy_connect Proxy ProxyサーバーでCONNECTリクエストを扱うのに必要となる。
mod_cache 拡張 有効にすることで、各種キャッシュ機能を利用できるようになる。
mod_suexec 拡張 有効にすることで、CGIスクリプトを実行するユーザー/グループを設定できるようになる。
mod_disk_cache 拡張 有効にすることで、動的コンテンツの出力結果などをディスク上にキャッシュできるようになる。
mod_file_cache 拡張 有効にすることで、特定のファイルを起動時にメモリ上にキャッシュできるようになる。
mod_mem_cache 拡張 有効にすることで、動的コンテンツの出力結果などをメモリ上にキャッシュできるようになる。
mod_cgi 標準 CGIスクリプトの実行に必要。
mod_version 拡張 有効にすることで、Apacheのバージョン別の設定を行うことができるようになる。

今回は下記のモジュールを無効化した。

  • mod_authn_anon
  • mod_authn_dbm
  • mod_authz_owner
  • mod_authz_groupfile
  • mod_authz_dbm
  • mod_include
  • mod_ext_filter
  • mod_usertrack
  • mod_dav
  • mod_status
  • mod_autoindex
  • mod_info
  • mod_dav_fs
  • mod_vhost_alias
  • mod_negotiation
  • mod_actions
  • mod_speling
  • mod_rewrite
  • mod_proxy
  • mod_proxy_balancer
  • mod_proxy_ftp
  • mod_proxy_http
  • mod_proxy_connect
  • mod_cache
  • mod_suexec
  • mod_disk_cache
  • mod_file_cache
  • mod_mem_cache
  • mod_version

LDAP認証を行うつもりなのでLDAP系のモジュールは無効化していない。LDAP認証を行うつもりがなければ

も無効化していいだろう。mod_rewriteなどはよく使われるモジュールだが、必要となった際に有効化すればよいと考えた。また、mod_autoindex と mod_negotiation を無効化したため、

  • IndexOptions
  • AddIconByEncoding
  • AddIconByType
  • AddIcon
  • DefaultIcon
  • ReadmeName
  • HeaderName
  • IndexIgnore
  • LanguagePriority
  • ForceLanguagePriority

の各行をコメントアウトした。

4. conf.d/*.conf の編集

最近のApachehttpd.conf 以外にも /etc/httpd/conf.d 以下の設定ファイルを読むようになっている。今回のインストールでは

  • proxy_ajp.conf
  • welcome.conf

の2ファイルがインストールされていた。welcome.conf は不要、proxy_ajp.conf もProxyを使用しない限り不要なので、全て内容をコメントアウトしておく。

[root@localhost ~]# vim /etc/httpd/conf.d/proxy_ajp.conf
(内容を全てコメントアウトして保存)
[root@localhost ~]# vim /etc/httpd/conf.d/welcome.conf
(内容を全てコメントアウトして保存)

5. バーチャルホスト設定

続いてバーチャルホストの設定を行う。httpd.confに直接記述しても構わないのだが、バーチャルホストが増えたりする度にhttpd.confを編集するのは気が引ける。よって /etc/httpd/conf.d 以下に virtualhost.conf を作成し、バーチャルホスト関連の設定はそこで行うことにする。今回は以下の内容で virtualhost.conf を作成した。また、今回設定するバーチャルホストの管理はhogeユーザーに行わせることとし、DocumentRootはhogeユーザーのホームディレクトリ以下とした。

NameVirtualHost *:80

<Directory "/home/hoge/public_html">
  Options	All -Indexes
  AllowOverride	All
  Order		allow,deny
  Allow		from all
</Directory>

<VirtualHost *:80>
  ServerName	www.example.com
  DocumentRoot	/home/hoge/public_html/www.example.com
  ServerAdmin	hoge@example.com
  CustomLog	logs/access_log combined
  ErrorLog	logs/error_log
</VirtualHost>

<VirtualHost *:80>
  ServerName	hoge.example.com
  DocumentRoot	/home/hoge/public_html/hoge.example.com
  ServerAdmin	hoge@example.com
  CustomLog	logs/access_log combined
  ErrorLog	logs/error_log
</VirtualHost>

ここで指定した DocumentRoot が存在しないと起動時にエラーが表示されてしまうので、hogeユーザーでログインし、ディレクトリを作成しておく。

[root@localhost ~]$ mkdir public_html
[root@localhost ~]$ mkdir public_html/www.example.com
[root@localhost ~]$ mkdir public_html/hoge.example.com

さらに、テストのためのページを作成しておこう。

[root@localhost ~]$ echo 'This is test.' > public_html/www.example.com/index.html

6. 起動と動作確認

設定を完了したらApacheを起動する。

[root@localhost ~]# service httpd start

WEBブラウザから http://www.example.com/ へアクセスし、先程設定した"This is test."が表示されることを確認する。確認できたら、次回から起動時に実行されるように設定する。

[root@localhost ~]# chkconfig httpd on