WWWサーバの構築(SuSE編)
WWW サーバは、SuSE 標準の Apache を使用しました。おやじが気が付いたことを以下に示します。
- SuSE 標準の Apache は2.0系で、2004.05現在で Apache 2.0.48 になっており比較的新しい。
- 下記のようにデフォルトで suEXEC 対応になっているので、CGIの設置には少し注意が必要である。
・AP_DOC_ROOT="/srv/www/htdocs"
・HTTPD_USER="wwwrun"
・LOG_EXEC="/var/log/apache2/suexec.log"
・SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
・USERDIR_SUFFIX="public_html"
・GID_MIN=96
・UID_MIN=96
- PHP はデフォルトで使用でき、mbstring 付きでコンパイルされているので日本語も問題ない。DAV等は、YaST
で必要なモジュールを組み込めば使用できる。
- https はデフォルトで動作するかと思ったが、conf ファイルの設定だけでは駄目で
YaST から起動スクリプトの設定をする必要がある。(おやじは、かなりはまった。)
- 設定は用途毎に分割されて多数の conf ファイルを、基本となる httpd.conf から
include する形になっており、いろいろ追加設定するおやじとしては全体の設定が非常に見えにくかった。一旦、
include している conf ファイルを全て httpd.conf にコピーし全体を把握してから変更したほどである。
- 基本的に YaST が管理している /etc/apache2/conf.d ディレクトリ内の conf
ファイルは、手動で変更できないので注意が必要である。仮に変更しても Apache
やシステムを再起動すると、YaST で設定した /etc/sysconfig/apach2 の内容に従い上書きされてしまうので無駄である。
■Apache のインストール
Apache のインストールが済んでいない場合は、YaST を起動してインストールしてください。
- YaST コントロールセンタを起動し、「ソフトウェア」の「ソフトウェアのインストール/削除」を起動する。
- 「フィルタ」 を 「選択グループ」 とし下の欄の 「Apache2 を使用する単純な
WWW サーバー」 にチェックマークを入れて 「了解」 を押しておしまい。
■Apache の設定
インストールが済んだら、Apache の設定をしていきます。本ページでは、基本となる設定
( CGI 、Userdir 、PHP 等)のみ示し、SSL 化 ( https ) 、DAV 、バーチャルホストについては各ページ参照ください。
前述したように、 SuSE では下記のように設定ファイルが分かれており、httpd.conf
から各 conf ファイルを include する形態になっているため全体像が分かりにくく、気をつけないと二重定義になったりしますので、注意が必要です。
# Overview of include files, chronologically:
#
# httpd.conf
# |
# |-- uid.conf . . . . . . . . . . . . . . UserID/GroupID to run under
# |-- server-tuning.conf . . . . . . . . . sizing of the server (how many processes to start, ...)
# |-- sysconfig.d/loadmodule.conf . . . . . [*] load these modules
# |-- listen.conf . . . . . . . . . . . . . IP adresses / ports to listen on
# |-- mod_log_config.conf . . . . . . . . . define logging formats
# |-- sysconfig.d/global.conf . . . . . . . [*] server-wide general settings
# |-- mod_status.conf . . . . . . . . . . . restrict access to mod_status (server monitoring)
# |-- mod_info.conf . . . . . . . . . . . . restrict access to mod_info
# |-- mod_autoindex-defaults.conf . . . . . defaults for displaying of server-generated directory listings
# |-- mod_mime-defaults.conf . . . . . . . defaults for mod_mime configuration
# |-- errors.conf . . . . . . . . . . . . . customize error responses
# |-- ssl-global.conf . . . . . . . . . . . SSL conf that applies to default server _and all_ virtual hosts
# |
# |-- default-server.conf . . . . . . . . . set up the default server that replies to non-virtual-host requests
# | |--mod_userdir.conf . . . . . . . . enable UserDir (if mod_userdir is loaded)
# | `--conf.d/apache2-manual?conf . . . add the docs ('?' = if installed)
# |
# |-- sysconfig.d/include.conf . . . . . . [*] your include files
# | (for each file to be included here, put its name
# | into APACHE_INCLUDE_* in /etc/sysconfig/apache2)
# |
# `-- vhosts.d/ . . . . . . . . . . . . . . for each virtual host, place one file here
# `-- *.conf . . . . . . . . . . . . . (*.conf is automatically included)
|
◆ 基本的な設定
まずは YaST を使って基本的な設定を行います。
- YaST コントロールセンタを起動し、「システム」の「/etc/sysconfig エディター」を起動する。
- 「設定のオプション」 で 「Network」 -> 「WWW」 -> 「Apache2」 と開き、必要なパラメータをクリックして選択して「設定」欄で設定し、最後に
「完了」 ボタンを押す。
パラメータ |
設 定 概 要 |
設定値 |
APACHE_HTTPD_CONF |
マスタ設定ファイルを hddpd.conf 以外にする場合の指定。 |
|
APACHE_MPM |
Apache2 から採用された MPM の設定。prefork、worker、leader、metuxmpmが指定できるが、デフォルトは空欄で
prefork となる。Apache1.3系との互換性を重視した非マルチスレッドの MPM で、Apache2系で
confugure 時に未指定ならこのモードになる。一般的に、 prefork で問題になることはないはず。 |
|
APACHE_SERVERADMIN |
デフォルトサーバ(バーチャルホストは非関与)の管理者のメールアドレスを指定。 |
webmaster@mail.aconus.com |
APACHE_SERVERNAME |
デフォルトサーバのサーバ名を指定。DNSで牽ける名前を設定すること。 |
www.aconus.com |
APACHE_CONF_INCLUDE_FILES |
ユーザ定義の include したいファイル名を指定。 |
|
APACHE_CONF_INCLUDE_DIRS |
ユーザ定義の include したい複数ファイルがあるディレクトリ名を指定。 |
/etc/apache2/my_conf |
APACHE_MODULES |
ロードする module を指定。必要に応じて追加、削除する。 |
dav dav_fs rewrite |
APACHE_SERVER_FLAGS |
サーバ起動時のフラグを指定。SSL使用時は、「-D SSL」と指定する事を忘れずに。おやじはハマッタ。
|
-D SSL |
APACHE_DOCUMENT_ROOT |
ドキュメントルートを指定。空欄ならデフォルトの /srv/www/htdocs となる。SuEXEC
されている事等を考慮して必要なら変更する。 |
|
APACHE_START_TIMEOUT |
スタートアップスクリプトでサーバが正常に立ち上がったかを監視する時間を指定。SSL証明書でパスフレーズを入力するような場合は、この値(デフォルト2秒)を大きくすること。 |
|
APACHE_SERVERSIGNATURE |
Apache が生成するドキュメントのフッタを設定。ServerSignature ディレクティブに反映される。デフォルトは「on」なので、サーバのバージョン、
稼動中のホストの ServerName の書かれた行を追加し、「email」にした場合はさらに参照されたドキュメントに対する
ServerAdmin を指す "mailto:" が追加される。何も出したくなければ、「off」に設定。 |
|
APACHE_LOGLEVEL |
ログレベルの設定。通常はデフォルトの warn で問題ないが、テスト中などは変更しても良い。 |
|
APACHE_ACCESS_LOG |
アクセスログのフォーマットを指定。デフォルトではリファラーを採る conbined
になっている。おやじは、CustomLog でいろいろ設定するので削除した。 |
削除 |
APACHE_USE_CANONICAL_NAME |
Apache が自分自身の名前とポートを決定する方法を設定。UseCanonicalName ディレクティブに反映される。デフォルトの
off で問題になることはない(クライアントの指定のまま)はず。詳しくは、Apache
のドキュメント参照のこと。 |
|
APACHE_SERVERTOKENS |
HTTP 応答ヘッダの内容を指定。ServerTokens ディレクティブに反映される。デフォルトは
os なので、Apache/2.0.48 (Unix) レベルまで応答する。詳しくは、Apache のドキュメント参照のこと。 |
|
APACHE_EXTENDED_STATUS |
mod_status 使用時に拡張情報(CPU使用率等)を取得する場合、「on」とする。ExtendedStatus
ディレクティブに反映される。詳しくは、Apache のドキュメント参照のこと。 |
|
APACHE_BUFFERED_LOGS |
意味不明。 |
|
APACHE_TIMEOUT |
各イベントについて、リクエストを失敗させるまでに Apache が待つ時間を設定。Timeout
ディレクティブに反映される。デフォルトの300秒のままとする。詳しくは、Apache
のドキュメント参照のこと。 |
|
- 設定が完了したら、Apache を再起動する。このとき実際に、conf ファイル /etc/sysconfig/apache2
の内容を元に反映される。
# /etc/init.d/apache2 restart |
一応、/etc/apache2/sysconfig.d ディレクトリ配下の conf ファイルの内容を確認しておく。
◆ httpd.conf の設定
SuSE では用途毎に conf ファイルが分かれているので、実際に見てみれば分かるとおり
httpd.conf で設定する項目はほとんどありません。
設定が必要なのは DirectoryIndex ディレクティブの設定で、クライアントがディレクトリアクセスしてきたときに補完するファイル名の指定ぐらいです。例えば、http://www.aconus.com/~oyaji/
とアクセスしてきたときに、表示させたいファイル名を指定しますが、おやじは基本的に拡張子を
.htm にしているので、それを追加するとともに、Squirrelmail 用に .phpも追加しました。PHP関係は、Squirrelmail
を動作させるぐらいならこの設定ぐらいで、他には何も設定はいりません。(赤字:追加)
- DirectoryIndex index.html index.htm index.html.var index.php
なお、ルートディレクトリに関する設定があるので、ルートディレクトリ配下で認証を行いたい場合などは、こちらで変更することになります。
以下、各 conf ファイルで機能毎の設定をしていきます。基本的に、httpd.conf
で Include されている順番で記載します。なお、以下のファイルは基本的な動作では変更不要なため、ここでは扱いません。各機能毎のページで記載します。
なお、mod_status と mod_info がデフォルトで有効になっています。localhost
からしかアクセスはできないようになっていますが、設定を誤ると外部からも見ることができるようになってしまいます。是非必要と思われる方以外は、これらの
conf ファイル (mod_status.conf、mod_info.conf) を Include している行をコメントアウトすることを薦めます。
No. |
conf 名
|
概 要
|
1
|
sysconfig.d/*.conf |
sysconfig.d ディレクトリ配下にある global.conf、incude.conf、loadmodule.conf
は YaST で扱うので触手厳禁。 |
2
|
ssl-global.conf |
SSL関連なので基本動作に関係なし。SSL化しても通常は変更不要。 |
3
|
mod_log_config.conf |
ログの基本フォーマットを定義したファイルで通常は変更不要。 |
4
|
mod_status.conf |
Apache の動作状態を表示するためのファイルで変更は不要。必要ないなら、httpd.conf
の include 行をコメントアウトする。 |
5
|
mod_info.conf |
Apache のさまざまな情報を表示するためのファイルで変更は不要。必要ないなら、httpd.conf
の include 行をコメントアウトする。 |
6
|
mod_autoindex-defaults.conf |
自動インデックス生成に関する設定で通常は変更不要。 |
7
|
errors.conf |
エラーメッセージに関する設定で通常は変更不要。カストマイズする方はこちらで。 |
◆ uid.conf の設定
Apache がデフォルトサーバで実行されるときの、ユーザ/グループ ( wwwrun/www
) が指定されているだけです。SuSE では Apache は SuEXEC 環境で動作しますので、デフォルトサーバで
CGI を使用する場合は変更すると CGI が動作しませんので、基本的に変更不可です。どうしても変更したければ、下記で
Apache を SuEXEC で動作しないように変更する必要がありますが、セキュリティ上はあまりお薦めはしません。ただ、この方法は
CGI がうまく動作しないときに、一時的に SuEXEC の影響かどうかを判断する場合にも有効です。
SuEXEC を解除するには、YaST の 「/etc/sysconfig エディター」 で APACHE_MODULES
内の 「suexec」 を消して登録しなおすだけです。これで、通常モードで起動するので、こちらで
CGI を含めた動作確認をしてから suEXEC 化されると良いでしょう。
◆ server-tuning.conf の設定
ここでは、Apache の MPM と KeepAlive に関する設定を行いますが、通常は変更は不要です。おやじはホストネームでのログ収集を行っているので、ここに追加しました。
この機能を使うと、DNSの逆牽きで負荷が重くなるとともに応答が遅くなるが、アクセスがまだまだ少ないのとホストネームのほうが常連さんならすぐにわかるため、あえて使用しています。ただ、逆牽き設定をしていないDNSや設定が誤っているDNSが多くエラーログがかなり出てしまいます。(BINDの設定でログらないようにしています。)
◆ listen.conf の設定
ここでは、Apache 待ち受けるポート(IP)を指定しますが、通常はデフォルトのままで問題はありません。SSL
を使用しない場合でも特に変更は必要ありませんが、443番で起動しないように下記部分をコメントアウトしておくと良いでしょう。(赤字:追加)
#<IfDefine SSL>
# <IfDefine !NOSSL>
# <IfModule mod_ssl.c>
# Listen 443
# </IfModule>
# </IfDefine>
#</IfDefine>
|
なお、名前ベースのバーチャルホストの指定もここに書くようなコメントがありますが、おやじは、vhosts.d
ディレクトリ配下にバーチャルホスト関係の設定は集めたほうが良いと思います。
◆ mod_mime-defaults.conf の設定
ここでは、mod_mime (リクエストされたファイルの拡張子とファイルの振る舞い
(ハンドラとフィルタ)、内容 (MIME タイプ、言語、文字セット、エンコーディング)
とを関連付ける) に関する設定を行います。おやじが、変更したのは下記の3個所です。
- 日本語表示の設定(ブラウザのエンコード自動選択時の文字化け対策: 1個所。詳細は、こちらを参照のこと。)
LanguagePriority は、MultiViews 環境でブラウザが言語の優先順位を提供してない場合の優先度を指定するもので、通常はコンテンツも対応していないので変更不要。
まず、LanguagePriority は ja を先頭(左)に持ってくること。また、AddDefaultCharset で下記の設定をした場合は、ドキュメントで必ずcharsetを指定しないと文字化けする。おやじのコンテンツには、EUC-JP
と shift-jis の両方があるためこのようにして(AddDefaultCharset Offとしても良い)、ドキュメントに依存して表示させている。そのため、一部の
CGI 等も改造しているので注意が必要である。
shift-jis のコンテンツしかないなら、 AddDefaultCharset shift_jis とすれば良い。(赤字:追加、緑字:削除)
<IfModule mod_negotiation.c>
LanguagePriority ja en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
ForceLanguagePriority Prefer Fallback
</IfModule>
#AddDefaultCharset ISO-8859-1
|
- CGI ファイル拡張子の定義
CGI ファイル拡張子の定義がどこにもないので、ここで追加しておく。CGI として動作させたい拡張子を記述する。
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options"
directive.)
#
AddHandler cgi-script .cgi .pl
|
◆ default-server.conf の設定
ここで Apache のデフォルトサーバの設定を行います。おやじは、IP ベースのバーチャルホストで動かしていますので、コメントアウトする項目が多いですが、基本的な設定はここで行います。下記以外は、基本的には変更は不要のはずです。Userdir
を使用しないなら、関連のところをコメントアウトしてください。なお、Userdir
の詳細設定は、mod_userdir.conf で行います。
◆ mod_userdir.conf の設定
ここで Userdir に関する設定を行いますが、SuSE では基本的な設定が済んでいるので、ほとんど変更は不要です。おやじが行ったのは、ユーザディレクトリ配下でのCGIの実行権付与とインデックスリストの非表示だけです。
- ユーザディレクトリ配下でのCGIの実行権付与とインデックスリストの非表示
Indexesがあると、ドキュメントルートにindex.html等のDirectoryIndexで指定したファイルがないと、インデックスリストが表示されてしまう。(赤字:追加、緑字:削除)
<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
|
◆ その他の設定
以上で主要な設定は終了ですが、基本的な設定でも示したとおりおやじは管理面からログをカストマイズしているのと、rewite
を使ったアクセス制御を行っていますので、これらの設定を追加しました。
これらの追加には、YaST で設定する APACHE_CONF_INCLUDE_DIRS を使って行いました。具体的には、/etc/apache2/my_conf
というディレクトリを作成し、この配下に追加する conf ファイルを作成することにより
Include させました。作成したのは、ログ用の custom_log.conf と Rewite 用の
rewrite.conf です。
- ログのカストマイズ
おやじは管理上、以下のような方法でユーザ毎のログの分離や家庭内からのアクセス、worm
等のログを分離して収集しています。この内容を、新規に作成した /etc/apache2/my_conf
ディレクトリ配下に custom_log.conf として作成しました。なお、YaST で APACHE_ACCESS_LOG
を削除しておかないと、二重登録になってしまうので注意が必要です。
# Custom_Log config
SetEnvIf Remote_Addr 192.168.1. homelog nolog
SetEnvIf Request_URI "~akirin" akirinlog nolog
SetEnvIf Request_URI "default.ida" wormlog nolog
SetEnvIf Request_URI "root.exe" wormlog nolog
SetEnvIf Request_URI "cmd.exe" wormlog nolog
SetEnvIf Request_URI "Admin.dll" wormlog nolog
CustomLog /var/log/apache2/home_log common env=homelog
CustomLog /var/log/apache2/akirin_log combined env=akirinlog
CustomLog /var/log/apache2/worm_log common env=wormlog
CustomLog /var/log/apache2/access_log combined env=!nolog
|
・1行目は単なるコメント。
・2/8行目で、家庭内からのアクセスをhome_logに採取。不要ならコメントアウト。
・3/9行目で、娘のサイトへのアクセスをakirin_logに採取。combinedとしてreferrerを採取。
・4行目でCodeRed、5〜7行目でNimudaからアタックを識別し、10行目でworm_logに採取。不要ならコメントアウト。
・11行目で残りのアクセスをaccess_logに採取。combinedとしてreferrerを採取。おやじのサイトへのアクセスは、ここに含まれる。
- アクセス制御
おやじの環境では、ユーザディレクトリ配下でCGIを動かしているので、ログファイルに直接アクセスすると中身が見えてしまいます。そのため、特定の拡張子については、rewrite
を使用して見えないように以下のような対策をしています。詳細は、こちらを参照のこと。
この内容を、新規に作成した /etc/apache2/my_conf ディレクトリ配下に rewrite.conf
として作成しました。
# mod_rewrite.conf
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteLog "/var/log/apache2/rewrite_log"
RewriteLogLevel 0
RewriteCond %{REQUEST_URI} "\.(dat|log)$" [NC]
RewriteRule /.* /error/HTTP_NOT_FOUND.html.var
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/webmail/(.*)?$ https://%{HTTP_HOST}/webmail/$1 [L,R]
</IfModule>
|
■logrotateの設定
おやじの場合、上記のようにログをカストマイズしているので、そのままではデフォルトのログ以外はログローテーションされません。そこで、/etc/logrotate.d
配下にある apache2 を参考に追加したログがローテーションされるようにします。なお、おやじは最終的には
Webalizer での表示用に自分でローテーションするようにしますので、下記設定は削除(logrotate.d
からの apache の削除)してあります。
SuSE のログローテーションは、RedHat とはかなり異なった形で行われています。管理の方法や考え方の違いと思いますが、おやじとしては
RedHat のほうが合っている気がしますので、こちらの例もあげておきますので、自分にあった方を採用すればいいでしょう。
- SuSE形式
SuSE の形式は、下記のようにログ毎にローテーション条件が書かれており、ローテションの方法は以下のようになっており、1週間に1回実行されるので、同様に新しく作成したログについても追記していけば良い。
/var/log/apache2/access_log {
compress #ローテション後のファイルを gzip で圧縮。
dateext #ローテション後のファイルにYYYYMMDDと付与。
maxage 365 #ローテション後のファイルを残す日数。
rotate 99 #ログファイルのローテーション回数。
size=+4096k #ログファイルが指定サイズを超過したらローテーションを開始。
notifempty #ログファイルが空ならローテーション未実施。
missingok #ログファイルが無くても処理を正常終了。
create 644 root root #新ログファイルをパーミッション(644)、所有者(root)、グループ(root)で生成。
postrotate #このコマンドとendscriptの間にログファイルのローテーション後に実行するコマンドを記述。
/etc/init.d/apache2 reload #Apache をリロード。
endscript #postrotate の終わり。
}
|
- RedHat形式(もどき)
基本は、/etc/logrotate.conf で指定されており、1週間に1回、非圧縮で4週間分のデータを残すことになっているので、これをベースにRedHat風にしたもの。もっと残したければ、上記のように
rotate で指定すればよい。
/var/log/apache2/*log {
notifempty #ログファイルが空ならローテーション未実施。
missingok #ログファイルが無くても処理を正常終了。
create 644 root root #新ログファイルをパーミッション(644)、所有者(root)、グループ(root)で生成。
sharedscripts #1行目で複数指定されたlogファイルに対し、postrotate以降設定されたコマンドを実行。
postrotate #このコマンドとendscriptの間にログファイルのローテーション後に実行するコマンドを記述。
/etc/init.d/apache2 reload #Apache をリロード。
endscript #postrotate の終わり。
}
|
Top Pageへ