読者です 読者をやめる 読者になる 読者になる

パンダのメモ帳

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

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