WWWサーバの構築(CentOS編)


WWW サーバは、CentOS 標準の Apache を使用しました。おやじが気が付いたことを以下に示します。
  1. CentOS 標準の Apache は2.0系で、2005.04現在で Apache 2.0.52 である。

  2. 下記のようにデフォルトで suEXEC 対応になっているので、CGIの設置には少し注意が必要である。

    # suexec -V
     -D AP_DOC_ROOT="/var/www"
     -D AP_HTTPD_USER="apache"
     -D AP_LOG_EXEC="/var/log/httpd/suexec.log"
     -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
     -D AP_GID_MIN=100
     -D AP_UID_MIN=500
     -D AP_USERDIR_SUFFIX="public_html"

  3. PHP はデフォルトで使用でき、mbstring 付きでコンパイルされているので日本語も問題ない。但し、デフォルトではインストールされないので別途 php-mbstring をインストールする必要がある。

■Apache のインストール

Apache のインストールが済んでいない場合は、Yumでインストールしてください。


# yum install httpd
Setting up Install Process
Setting up Repos
update                    100% |=========================| 951 B 00:00
base                      100% |=========================| 1.1 kB 00:00
addons                    100% |=========================| 951 B 00:00
extras                    100% |=========================| 1.1 kB 00:00
Reading repository metadata in from local files
update    : ################################################## 66/66
base      : ################################################## 1404/1404
addons    : ################################################## 2/2
extras    : ################################################## 25/25
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Package httpd.i386 0:2.0.52-9.ent.centos4.1 set to be updated
--> Running transaction check
--> Processing Dependency: httpd-suexec for package: httpd
--> Restarting Dependency Resolution with new changes.
--> Populating transaction set with selected packages. Please wait.
---> Package httpd-suexec.i386 0:2.0.52-9.ent.centos4.1 set to be updated
--> Running transaction check

Dependencies Resolved
Transaction Listing:
  Install: httpd.i386 0:2.0.52-9.ent.centos4.1 - base

Performing the following to resolve dependencies:
  Install: httpd-suexec.i386 0:2.0.52-9.ent.centos4.1 - base
Total download size: 905 k
Is this ok [y/N]:
y[Enter]
Downloading Packages:
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: httpd 100 % done 1/2
Installing: httpd-suexec 100 % done 2/2

Installed: httpd.i386 0:2.0.52-9.ent.centos4.1
Dependency Installed: httpd-suexec.i386 0:2.0.52-9.ent.centos4.1
Complete!

■Apache の設定

インストールが済んだら、Apache の設定をしていきます。本ページでは、基本となる設定 ( CGI 、Userdir 、PHP 等)のみ示し、SSL 化 ( https ) 、DAV 、バーチャルホストについては各ページ参照ください。
Apacheの基本的な設定は、/etc/httpd/conf/にあるhttpd.confで行います。 (青字は削除、赤字は追加、緑字は変更したものです。)

  1. 不要モジュールの設定

    デフォルトでは全てのモジュールが組み込まれるようになっているが、リソースの無駄遣いなので使う予定のないものをロードしないように設定(コメントアウト)する。モジュールの概要については、Apacheのドキュメントを参照のこと。

    # Example:
    # LoadModule foo_module modules/mod_foo.so
    #
    LoadModule access_module modules/mod_access.so
    LoadModule auth_module modules/mod_auth.so
    #LoadModule auth_anon_module modules/mod_auth_anon.so
    LoadModule auth_dbm_module modules/mod_auth_dbm.so
    LoadModule auth_digest_module modules/mod_auth_digest.so
    #LoadModule ldap_module modules/mod_ldap.so
    #LoadModule auth_ldap_module modules/mod_auth_ldap.so
    LoadModule include_module modules/mod_include.so
    LoadModule log_config_module modules/mod_log_config.so
    LoadModule env_module modules/mod_env.so
    #LoadModule mime_magic_module modules/mod_mime_magic.so
    #LoadModule cern_meta_module modules/mod_cern_meta.so
    LoadModule expires_module modules/mod_expires.so
    #LoadModule deflate_module modules/mod_deflate.so
    #LoadModule headers_module modules/mod_headers.so
    #LoadModule usertrack_module modules/mod_usertrack.so
    LoadModule setenvif_module modules/mod_setenvif.so
    LoadModule mime_module modules/mod_mime.so
    LoadModule dav_module modules/mod_dav.so
    #LoadModule status_module modules/mod_status.so
    LoadModule autoindex_module modules/mod_autoindex.so
    #LoadModule asis_module modules/mod_asis.so
    #LoadModule info_module modules/mod_info.so
    LoadModule dav_fs_module modules/mod_dav_fs.so
    #LoadModule vhost_alias_module modules/mod_vhost_alias.so
    LoadModule negotiation_module modules/mod_negotiation.so
    LoadModule dir_module modules/mod_dir.so
    #LoadModule imap_module modules/mod_imap.so
    LoadModule actions_module modules/mod_actions.so
    #LoadModule speling_module modules/mod_speling.so
    LoadModule userdir_module modules/mod_userdir.so
    LoadModule alias_module modules/mod_alias.so
    LoadModule rewrite_module modules/mod_rewrite.so
    LoadModule proxy_module modules/mod_proxy.so
    #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_connect_module modules/mod_proxy_connect.so
    #LoadModule cache_module modules/mod_cache.so
    LoadModule suexec_module modules/mod_suexec.so
    #LoadModule disk_cache_module modules/mod_disk_cache.so
    #LoadModule file_cache_module modules/mod_file_cache.so
    #LoadModule mem_cache_module modules/mod_mem_cache.so
    LoadModule cgi_module modules/mod_cgi.so


  2. サーバ管理者のメールアドレスの設定

    エラーメッセージなどで表示されるサーバ管理者のメールアドレスを設定する。

    #ServerAdmin root@localhost
    ServerAdmin webmaster@mail.aconus.com


  3. サーバ名称の設定

    この設定は、リダイレクトする URL を生成する際に利用されるので、サーバのマシン名ではなくサーバアクセス時のFQDNを指定する。DNSで牽ける名前を設定すること。

    #ServerName new.host.name:80
    ServerName www.aconus.com:80


  4. ドキュメントルートの変更(基本的に変更不可)

    CentOSでは SuEXEC 環境になっているので、これを変更するとドキュメントルート配下で CGI が動作しない。従って、基本的には変更不可である。 CGI を cgi-bin ディレクトリ配下で動作させるなら変更も可能なので、その場合は一例であるが以下のようにセットで変更する。

    #DocumentRoot "/var/www/html"
    DocumentRoot "/home"

    #
    # This should be changed to whatever you set DocumentRoot to.
    #
    #<Directory "/var/www/html">
    <Directory "/home">


  5. ドキュメントルートでのCGI/SSIの実行権付与とインデックスリストの非表示 

    CentOS のデフォルトでは Options デレクティブは Indexes と FollowSymLinks が指定されているが、ドキュメントルートでは CGI が動作しないので必要なら指定する。また、Indexesがあると、ドキュメントルートにindex.html等のDirectoryIndexで指定したファイルがないとインデックスリストが表示されてしまうので、削除するほうがよい。

    ・Indexes  : インデックスリストの表示
    ・FollowSymLinks : Symlink の使用許可
    ・Includes : SSI の実行権付与
    ・ExecCGI : CGI の実行権付与

    # Options Indexes FollowSymLinks
    Options FollowSymLinks Includes ExecCGI


  6. ドキュメントルートでのディレクトリアクセス制御

    CentOS のデフォルトでは AllowOverride デレクティブは None となっているので、.htaccess による制御や認証等が行えない。必要に応じて変更すること。詳細は Apache のドキュメントを参照のこと。

    ・FileInfo      : ファイル関係の制御
    ・AuthConfig : 認証関係
    ・Limit    : アクセス制御(.htaccess)

    AllowOverride None
    AllowOverride FileInfo AuthConfig Limit


  7. ユーザディレクトリの有効化と配下でのCGI/SSIの実行権付与とインデックスリストの非表示

    Userdir を有効にするため、以下のように設定する。<Limit> ディレクティブは、アクセス制御の範囲を 指定された HTTP メソッドに限定するもので、それ以外のメソッドは、影響を受けない。つまり、下記では、GET POST OPTIONS PROPFIND のメソッドに対してのみアクセスの制御を行ない(ここではアクセス許可)、 それ以外のメソッドについてはアクセス制御がかからない。
    <LimitExcept> は、<Limit> セクションの反対の動作をし、 標準のメソッドと標準外や未認識のメソッドの場合の両方を設定できる。下記では、GET POST OPTIONS PROPFIND のメソッド以外のアクセス制御が行われ、ここでの設定では不許可になる。<LimitExcept>は未設定のメソッド全てに制御がかかるので、こちらで設定したほうが確実である。
    CGI/SSIの実行権付与とインデックスリストの非表示に関する設定内容は、5項/6項に準じて行えばよい。おやじが行ったのは、Indexesの削除とExecCGIの追加である。
    なお、CentOSの場合、デフォルトで/home/usersのパーミッションが700になっているためアクセスすると403エラーとなるので、701/711に変更が必要である。

    <IfModule mod_userdir.c>
        #
        # UserDir is disabled by default since it can confirm the presence
        # of a username on the system (depending on home directory
        # permissions).
        #
        #UserDir disable

        #
        # To enable requests to /~user/ to serve the user's public_html
        # directory, remove the "UserDir disable" line above, and uncomment
        # the following line instead:
        #
        #UserDir public_html
        UserDir public_html

    </IfModule>

    #
    # Control access to UserDir directories. The following is an example
    # for a site where these directories are restricted to read-only.
    #
    #<Directory /home/*/public_html>
    #    AllowOverride FileInfo AuthConfig Limit
    #    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    #    <Limit GET POST OPTIONS>
    #       Order allow,deny
    #       Allow from all
    #    </Limit>
    #    <LimitExcept GET POST OPTIONS>
    #       Order deny,allow
    #       Deny from all
    #    </LimitExcept>
    #</Directory>
    <Directory /home/*/public_html>
       AllowOverride FileInfo AuthConfig Limit
       Options MultiViews SymLinksIfOwnerMatch IncludesNoExec ExecCGI
    #   <Limit GET POST OPTIONS>
    #     Order allow,deny
    #      Allow from all
    #   </Limit>
       <LimitExcept GET POST OPTIONS>
          Order deny,allow
          Deny from all
       </LimitExcept>
    </Directory>


  8. ディレクトリアクセス時に検索するファイル名の追加

    ディレクトリアクセス時(http://www.aconus.com/~oyaji/のように/で終わっていたり、ディレクトリで終わっているようなアクセスの時)、ApacheはDirectoryIndexで指定されているファイルがそのディレクトリ配下にないか、左側のファイル名から順番に探しにいき、存在すればそのファイルを返送する。
     おやじは、index.htmを基本にしているので、それを追加した。検索は左優先なので、どのように並べるかはそれぞれの環境に依存する。なお、SquirrelMailでindex.phpがデフォルトのファイルになっているが、CentOSでは、これに関してはphp.confで設定されているのでここでは設定不要。

    DirectoryIndex index.html index.htm index.html.var


  9. ホストネームでのログ収集

    この機能を使うと、DNSの逆牽きで負荷が重くなるとともに応答が遅くなるが、アクセスがまだまだ少ないのとホストネームのほうが常連さんならすぐにわかるため、あえて使用しています。ただ、逆牽き設定をしていないDNSや設定が誤っているDNSが多くエラーログがかなり出てしまいます。(BINDの設定でログらないようにしています。)

    #HostnameLookups Off
    HostnameLookups On


  10. ログのカスタマイズ

    おやじは管理上、以下のような方法でユーザ毎のログの分離や家庭内からのアクセス、worm 等のログを分離して収集しています。

    #CustomLog logs/access_log combined
    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 logs/home_log common env=homelog
    CustomLog logs/akirin_log combined env=akirinlog
    CustomLog logs/worm_log common env=wormlog
    CustomLog logs/access_log combined env=!nolog


    ・1行目のCustomLog logs/access_log common をコメントアウトし、以下を記述。
    ・2/8行目で、家庭内からのアクセスをhome_logに採取。不要ならコメントアウト。
    ・3/9行目で、娘のサイトへのアクセスをakirin_logに採取。common -> combinedとしてreferrerを採取。
    ・4行目でCodeRed、5〜7行目でNimudaからアタックを識別し、10行目でworm_logに採取。不要ならコメントアウト。
    ・11行目で残りのアクセスをaccess_logに採取。common -> combinedとしてreferrerを採取。おやじのサイトへのアクセスは、ここに含まれる。

  11. 日本語表示の設定(ブラウザのエンコード自動選択時の文字化け対策: 1個所。詳細は、こちらを参照のこと。)

    CentOSのApacheは、デフォルトで強制的にUTF-8キャラクタセットで表示するようになっており、下記のようにコンテンツのMETAタグで「charset=Shift_JIS」等の指定をしていても文字化けしてしまう。

       <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

    一般的な対処方法としては、AddDefaultCharset ディレクティブをコメントアウトするか、「AddDefaultCharset Off」とすれば良い。但し、このような設定をすると、ドキュメントで必ずcharsetを指定しないと文字化けする。おやじのコンテンツには、EUC-JP と shift-jis の両方があるようなケースではこれ以外の方法はなく、ドキュメントに依存して表示させるしかない。そのため、一部の CGI 等も改造しているので注意が必要である。
    shift-jis のコンテンツしかないなら、 AddDefaultCharset shift_jis とすれば良い。

    #AddDefaultCharset UTF-8


  12. CGI ファイル拡張子の定義

    おやじのようにcgi-binディレクトリ以外でCGIを動作させたい場合、本ディレクティブのコメントアウトを外し(行頭の#を削除)、CGI として動作させたい拡張子を記述する。おやじは、「.pl」を追加した。

    # To use CGI scripts outside of ScriptAliased directories:
    # (You will also need to add "ExecCGI" to the "Options" directive.)
    #
    AddHandler cgi-script .cgi .pl


■Apacheの起動設定

システム起動時に自動起動するように、設定をしておきます。

# chkconfig httpd on
# chkconfig --list httpd
httpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
これで、システム起動時に自動的にApacheが起動されるようになります。


Top Pageへ