Hatena::Diary

とある技術の備忘録

2011/02/22

httpd.confについて調べたのでまとめたよ

最近学科の友人3人とサーバ/セキュリティについての勉強会を週1で行っていて、毎回何か調べてくることになっているのですが、折角だからオレはhttpd.confを選ぶぜ!ということでapacheの設定について少し調べてきました。初心者がまとめたので間違っている部分があるかもしれませんが、勉強の役に立てて頂ければ幸いです。

  • httpd.confはどこにある?
  • 最小限のhttpd.conf
  • 3つのセクション
    • セクション1: GlobalEnvironment
    • セクション2: MainServerConfiguration
    • セクション3: VirtualHosts
  • モジュールの追加
  • 外部設定ファイルの読込み
  • サーバリソースの監視方法

httpd.confはどこにある?

OSによって異なりますが、以下の階層に置いてある可能性が高いです。

CentOS、FedoraなどRed Hat系/etc/httpd/conf/
SUSE系、MacOSX/etc/apache2/
ソースからインストールした場合/usr/local/apache2/conf/



最小限のhttpd.conf

httpd.confは標準でもコメント含めて1000行くらい記述してあることが多いですが、以下の最小限の設定で動作します。httpd.confの理解を目的とするのであれば、小さな設定から徐々に設定項目を増やしていくことをお勧めします。ちなみにhttpd.confは再起動した時点で反映されます。

Listen 80
ServerRoot "/etc/httpd"
DocumentRoot "/var/www/html/"

User  nobody
Group nobody

<IfModule prefork.c>
MaxClients       150
StartServers     5
MinSpareServers  5
MaxSpareServers 10
</IfModule>

<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

MaxRequestsPerChild 0
ErrorLog logs/error_log

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>



3つのセクション

httpd.confの設定項目(ディレクティブ)は、その影響範囲によって主に下記の3つに分類されます。

Section1GlobalEnvironmentApache全体に影響を及ぼします
Section2MainServerConfigurationメインのサーバに影響を及ぼします。VirtualHost設定時のデフォルト値にもなります
Section3VirtualHosts指定したドメイン/ホストに影響を与えます

セクション1: GlobalEnvironment
# Sample
ServerRoot "/usr/local/apache2"
Listen 80
KeepAlive On
KeepAliveTimeout 15
MaxKeepAliveRequests 100
Timeout 300
ServerRootApacheをインストールした場所のパス。以降のディレクトリ指定で相対パスを利用する場合等に利用
Listen特定のIPアドレスやポート番号だけを受け付ける指定。VirtualHostではここの設定のポート範囲内のみ使用できる
KeepAliveクライアントからの接続要求時にHTTPセッションすぐにを閉じず一定時間保っておく設定。パフォーマンス向上に繋がる。ブラウザ側の対応に依存する
KeepAliveTimeoutHTTPセッションを保っておく秒数。値を大きくすると転送完了後もクライアントとの接続を維持したままになり他のクライアントへの応答が遅れる。1ページ当たりの平均的な転送時間+αが参考値。サーバのリソース消費を嫌うなら2程度の極端な値に設定するなど
MaxKeepAliveRequestsKeepAlive有効時に接続要求を受け付ける数の最大許容値。高い値に設定しておくことが推奨されている。大きな値を設定すると一度のリクエスト処理数が増える代わりに他の接続が割り込むタイミングが遅れる。1ページあたりの平均ファイル数+αが参考値
Timeoutクライアントから接続要求を受け取ってタイムアウトするまでの秒数。これを過ぎてもパケットが送信されない場合ブラウザにエラーを返す

セクション2: MainServerConfiguration
# Sample
User apache
Group apache
ServerName example.com
ServerAdmin root@example.com
DocumentRoot "/var/www/html"
<Directory /> ... </Directory>
DirectoryIndex index.html index.php
TypesConfig conf/mime.types
DefaultType text/plain
ServerTokens Prod
ServerSignature Off
Alias /icons/ "/usr/local/apache2/icons/"
User / Groupサーバーを実行する為のユーザとグループの指定。apache用に特定のユーザとグループを作成しておくことが推奨されている
ServerNameサーバ自身が使用するサーバ名とポート番号の指定。BINDで自動取得出来る場合があるが起動時の問題を避けるため指定しておくことが推奨されている
ServerAdminエラーメッセージ等に表示される管理者メールアドレス
DocumentRootドキュメントルートの指定。基本的にここより上位階層にはアクセス出来ないがSymbolicLinkやAliasを使用すれば実現可能。Aliasはmod_aliasで提供されている機能
<Directory /> ... </Directory>個々のディレクトリに対する設定。サーバールート(/)に対しての設定は必須
DirectoryIndexスラッシュ「/」で終わるURLを指定した際にデフォルトで表示するファイルを指定。指定したファイルが存在しない場合は、404または403エラーコードを返す
TypesConfigファイル拡張子とMIMEタイプのマッピングファイルの指定。.htaccessでもAddType application/x-smaf mmfなどで追加できる
DefaultTypeMIMEタイプファイルに記述が無かった場合の扱いを指定
ServerTokensエラーメッセージ出力時等のサーバ情報を制限。情報が多い順に Full, OS, Min, Minor, Major, Prod
ServerSignatureエラーメッセージ等をクライアントに返す際のフッターラインの表示を指定。On, Off, EMail(mailto:...が付く)が指定可能
Alias第1引数へのアクセスを第2引数へ繋ぐ。/icons/のように後ろにスラッシュが入った場合は/iconsというURL自体はエイリアスされないので注意

セクション3: VirtualHosts
# Sample
<VirtualHost *:80>
   ServerAdmin root@example.com
   ServerName example.com
   DocumentRoot /var/www/html
   ErrorLog logs/error_log
   TransferLog logs/access_log 
   ErrorDocument 403 /error/403.html
   ErrorDocument 404 /error/404.html
</VirtualHost>

NameVirtualHostについてあとで書く。



モジュールの追加

Apacheの基本的な機能と設定の説明は以上ですが、Apacheはモジュールを追加することで機能を拡張することが出来ます。Apacheに組み込めるモジュールの種類は大きく分けて以下の2つに分類されます。

  1. コンパイル時に組み込まれるモジュール
  2. 実行時に組み込まれるモジュール

httpdに-lオプションを渡して実行すればコンパイル時に追加されているモジュールを確認できます。またApache2.0以降ではDSO(DynamicSharedObject)という機能で実行時にもモジュールを取り込めます。実行時にモジュールを組み込むにはhttpd.conf等に以下のように設定します。標準でもかなり多くのモジュールが設定されていますが、パフォーマンスに影響を与えるので、理解可能であれば必要最低限のモジュールのみ読み込むように設定した方が良いです。

$ /usr/sbin/httpd -l
$ cat /etc/httpd/conf/httpd.conf | grep LoadModule
LoadModule php5_module modules/libphp5.so
LoadModule ...
LoadModule ...
# LoadModule ...
LoadModule ...
LoadModule ...
  ...



外部設定ファイルの読込み

Fedora Core / SUSE / Turbo 等のOSではconf.d/*.confという外部ファイルに設定を分け、それらを起動時に読み込む設定をhttpd.confに書くが常套手段となっています。ここのパスはServerRootで指定されたディレクトリからの相対パスなので注意してください。

Include conf.d/*.conf



サーバリソースの監視方法

本題とは少し内容が逸れますが、設定のために必要になったのでサーバリソースの監視方法についても少し調べました。Apacheでは使用するプロセス数を設定出来ますが、これにはApacheのプロセスがサーバのリソースにどれだけ影響を与えるかを見極める必要があります。1プロセスあたりのメモリ使用量はpsコマンドやtopコマンドで調べられます。psはシステムで実行中のプロセスを表示するコマンドです。$ ps aux | grep apache、のように使用します。

ps [-] [acefhjlmnrsuvwxS] [txx] [O[+|-]k1[[+|-]k2...]] [pids]

オプション

a自分以外のユーザーのプロセスも表示する
ctask_structに格納されているコマンド名を表示する
e「実行命令 + 」に環境変数を付加する
fツリー形式で表示する
hヘッダーを表示しない
jpgidとsidを表示する
l標準のPID,TTY,TIME,CMDに加え,F,S,UID,PPID,C,PRI,NI,ADDR,SZ,VSZ,RSS,WCHAN,STATも表示する
mスレッドも表示する
nUSERとWCHANを数字で表示する
r実行中のプロセスだけ表示する
sシグナル形式で表示する
uユーザー名と開始時刻を表示する
vvm 形式で表示する
w1行追加して表示を拡大する。wを増やすことによって行数をさらに増やせる
x制御端末のないプロセスの情報も表示する
S子プロセスのCPU消費時間とページ・フォルトを合計する
txxtty xxのプロセスのみ表示する
pids表示するプロセスIDを指定する

表示される要素の意味

Fプロセスの状態を示すフラグ。16進数で表されている。それぞれ,00:プロセスが終了している,01:システム・プロセス(常にメモリー上に存在する), 02:親プロセスからトレースされている,04:親プロセスからトレースされ,停止している,08:プロセスがシグナルで起動できない,10:プロセスがメモリー上にあり,イベント終了までロックされている,20:プロセスがスワップできない,ことを意味している。
USERプロセスの所有ユーザ
UIDユーザーID
PIDプロセスID
&CPUCPUの占有率
&MEM実メモリでの占有率
SIZE仮想分も含めた使用サイズ[kB]
VSZ仮想メモリの全サイズ
RSS使用中の物理メモリー量
TTY制御端末の種類および番号
STAT/Sプロセスのステータス。Rは実行可能,Sは停止,Dは割り込み不可の停止,Tは停止またはトレース中,Zはゾンビ・プロセス,Wはスワップ・アウトしたプロセス,Nはナイス値が正であることを表す
PPID親プロセスID
PRI優先度
NIナイス値
WCHANプロセスが休眠状態の時のカーネル関数名
STARTプロセスの開始時刻
TIMEプロセスの総実行時間
COMMAND/CMDプロセスのコマンド名

参考

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/r7kamura/20110222/1298371277