Apache

さいきんは Apache 2系列ばかり使っているので、それが対象になっている。
[最終更新日: 2009/02/04]

1. インストール(コンパイルオプション)

| INDEX

コンパイルオプションが毎回ながくなるので、サンプルを置いておく。worker(スレッド動作), rewrite有効, DAV有効。

> ./configure --with-mpm=worker --enable-module=so \
--enable-rewrite \
--enable-shared=yes --enable-dav=yes \

suexecとか使う場合は、それも追加する。

組み込まれた機能については以下のコマンドで。

> /usr/sbin/apache2 -l

worker.cやmod_so.cが組み込まれているか、などが確認できる。

2. 基本的な設定

| | INDEX

httpd.confを適宜編集する。サーバ名などの設定。

ServerName localhost
ServerAdmin webmaster@localhost

ドキュメントルートの設定。

DocumentRoot "/home/web"

ほか、Alias でmanual(doc)閲覧がセットされていたりするが、必要ないならコメントアウトしておいていいだろう。

#Alias /manual/ "/var/www/htdocs/manual/"

そのほか、iconsのエイリアスがある。

Alias /icons/ "/usr/share/apache2/icons/"

こちらのほうは、Alias を消すとファイル一覧のときにアイコンが表示できなくなる。

直アクセスされたときにicoファイルが一覧されるのがイヤなら、OptionsをIndexesを切っておく(-Indexes)のがよいかと。

3. 文字コード関係

| | INDEX

日本語文字化けが起こる場合は、

AddDefaultCharset off #文書のヘッダー情報を優先
LanguagePriority ja en ca ... #jaを最優先に

を試す。

また、個別のディレクティブでhtmlファイルに対するヘッダを指定することもできる。サイト内の文字コードが統一されているなら、よい方法かもしれない。

<Directory /home/www/doc/>
    AddType "text/html; charset=UTF-8" .html
</Directory>

4. やや細かい設定

| | INDEX
HostnameLookups On
アクセス元のIPアドレスをDNS名に逆引きするかどうかの設定。Offにすれば、パフォーマンスの向上が見込めるか。
ServerSignature Off
Onにしておくと、サーバが生成するページにApacheのバージョン情報などが表示される。

5. CGIの設定

| | INDEX

CGIの設定をする。

AddHandler cgi-script .cgi
ScriptAlias /cgi-bin/ "/home/web/cgi-bin/"
<Directory "/home/web/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>

cgi-bin上でhtmlファイルなどを扱う場合は、以下を足す。

    Options MultiViews ExecCGI
    AddHandler "text/html; charset=UTF-8" .html .htm .txt .css
    AddHandler image/jpeg .jpeg .jpg .jpe
    AddHandler image/gif .gif
    AddHandler image/png .png

あと、cgi-bin以外のディレクトリにあるCGIを実行可能にするには、当該ディレクティブに、ExecCGIを足す。

    Options +ExecCGI

6. SSIの設定

| | INDEX

SSIの設定をする。

  1. 拡張子を限定(shtml)して利用する場合

    Options FollowSymLinks MultiViews Includes
    # セキュリティ的には、以下のほうが良いか
    Options FollowSymLinks MultiViews IncludesNoExec
    AddType text/html .shtml
    AddHandler server-parsed .shtml
    
  2. 実行権限のあるファイル(XBitHack)で利用する場合、ディレクティブに、

    Options +Includes
    XBitHack on
    

    chmod +x index.html とかすると、index.htmlでSSIが利用できる。

7. アクセス制限(IPアドレス)

| | INDEX

以下のようにディレクティブを設定する。Orderのallowとdenyの順番に注意。

<Directory "/home/web/local">
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 192.168.1. 127.0.0.1
    Options Indexes FollowSymLinks MultiViews ExecCGI
</Directory>

IPアドレスの指定は、上のように全部もしくは一部を記載するほか、192.168.1.0/24のようなサブネットマスクでの指定も使える。

8. アクセス制限(パスワード認証)

| | INDEX
Basic認証のサンプル
AuthType Basic
AuthName "Service need Password !"
AuthUserFile /home/.htpasswd
AuthGroupFile /dev/null
Require valid-user

パスワードファイルの作成は、

> htpasswd -c /home/.htpasswd user_1
New password: [user_1に対応するパスワード]

パスワードファイルへのユーザ追加は、

> htpasswd /home/.htpasswd user_2
New password: [user_2に対応するパスワード]
Digest認証のサンプル
AuthType Digest
AuthName realm1
AuthUserFile /home/sample.digest #※
Require valid-user

#※[070719] Apache2.2で設定しようとしたら、いつのまにかAuthDigestFileがAuthUserFileに変わっていた。

AuthNameがパスワードファイルのrealm(ここでは仮にrealm1)に対応する。

パスワードファイルの作成は、

> htdigest -c /home/sample.digest realm1 user_1
New password: [user_1に対応するパスワード]

パスワードファイルへのユーザ追加は、、

> htdigest /home/sample.digest realm1 user_2
New password: [user_2に対応するパスワード]

9. LDAPによる認証を利用する

| | INDEX

まずモジュールをロードしておく。(Debianの場合)

> a2enmod authnz_ldap

Basic認証で利用する場合は、以下のように記述できる。

    AuthType Basic
    AuthName "LDAP Auth"
    AuthBasicProvider ldap
    AuthzLDAPAuthoritative on
    AuthLDAPURL "ldap://127.0.0.1/dc=samba,dc=local"
    Require valid-user
#   Require ldap-user "Administrator" #許可するユーザを限定する場合

LDAPを検索する際にanonymousでなく、特別なユーザにBindする必要がある場合は、

    AuthLDAPBindDN "cn=hoge,dc=samba,dc=local"
    AuthLDAPBindPassword "hogehoge"

のように記述する。

10. ログのカスタマイズ

| | INDEX

ログのカスタマイズをする。リファラーなどを取得できるcombinedがデフォルトで設定されているので、CustumLog設定に、それを指定すると詳細なログが取れる。

CustomLog /var/log/apache/access_log combined

あと、ローカルからのアクセスや画像ファイルへのアクセスなど、特定のアクセスをログに取らない場合、以下のような指定が利用できる。

SetEnvIf Remote_Addr 127.0.0.1 nolog
SetEnvIf Remote_Addr 192.168.1. nolog
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" nolog
CustomLog /var/log/apache/access_log combined env=!nolog

もしくは、ローカルのアクセスを特定のログに分離する場合は、以下のようなこともできる。

SetEnvIf Remote_Addr 192.168.1. local
CustomLog /var/log/apache/access_log combined env=!local
CustomLog /var/log/apache/local_log combined env=local

11. VirtualHostを利用する

| | INDEX

NameベースのVirtualHostを設定してみる。

# EXAMPLE-1
NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@nost1.example.local
    DocumentRoot /home/web/host1
    ServerName host1.example.local
    ErrorLog /var/log/apache/host1-error_log
    CustomLog /var/log/apache/host1-access_log combined
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@host2.example.local
    DocumentRoot /home/web/host2
    ServerName host2.example.local
    ErrorLog /var/log/apache/host2-error_log
    CustomLog /var/log/apache/host2-access_log combined
</VirtualHost>

以上の設定で、host1.example.localとhost2.example.localで振り分けが可能になる。

一番上のホスト設定がデフォルトになる。

ポート番号での振り分けも可能。(Listen 8080などの設定を忘れずに)

# EXAMPLE-2
NameVirtualHost *:8080
<VirtualHost *:8080>
    ServerAdmin webmaster@example.local
    DocumentRoot /home/web8080
    ServerName example.local
    ErrorLog /var/log/apache/p8080-error_log
    CustomLog /var/log/apache/p8080-access_log combined
</VirtualHost>

なお、EXAMPLE-1のような場合、振り分けをvhost-aliasによってすることも可能。その場合は以下のような設定になるかと。

# EXAMPLE-1-alt
UseCanonicalName off
# hosts.example.localの場合 %0=全体, %1=hosts, %2=example, %3=local のようになる。
VirtualDocumentRoot /home/web/%1
VirtualScriptAlias /home/web/%1/cgi-bin

VirtualHostAliasを使った場合、ログの管理のためにLogFormatに%V,%vなどを設定する方法がある。

WindowsのApache2.2で実験したところでは、VirtualDocumentRootを設定した場合、IPアドレスでアクセスした場合(http://127.0.0.1/など)もIPアドレスのマッチ部分を使って振り分けがされる。

IPアドレスでのアクセスの場合はVirtualDocumentRootを使用しない設定とかはできないものか・・・。

12. suexecを利用する

| | INDEX

コンパイル時に以下のようなオプションを指定しておく。指定されている値は、設定例。

--enable-suexec
suexecの有効化
--with-suexec-caller=apache
apacheのユーザを指定
--with-suexec-docroot=/home
VirtualHostからsuexecを使う場合、その動作を認めるディレクトリ。シンボリックリンクは効かないので、このディレクトリの配下のみしかつかえない。
--with-suexec-userdir=public_html
ユーザディレクトリを指定(ユーザディレクトリ /~hoge で動作するCGIはそのディレクトリのユーザになる)
--with-suexec-uidmin=500
suexecでスイッチできるユーザのもっとも小さいユーザID(権限の大きいユーザは外す)
--with-suexec-gidmin=500
suexecでスイッチできるユーザのもっとも小さいグループID
--suexec-safepath=/usr/local/bin:/usr/bin:/bin
CGIに渡される安全なPATH環境変数を指定
--suexec-umask=022
サーバ・スクリプトのUMASKを設定
--with-suexec-bin=/usr/local/apache2/bin/suexec
バイナリのパス
--suexec-logfile=/usr/local/apache2/logs/suexec_log
ログのパス

ports (FreeBSD) の場合は、以下のような指定(最小限)。

> make WITH_SUEXEC=yes SUEXEC_DOCROOT=/home/www SUEXEC_UIDMIN=500 SUEXEC_GIDMIN=500

VineLinux2.6ではバイナリは置いてあるが、パーミッション的に動作しないようにしてあった。/usr/sbin/suexecのパーミッションを4711に変更。

# 設定の確認
> suexec -V

なお、suexecは危険視されるようなパーミッションではCGIの動作を許可しない。以下のような例だとよいだろうか。

  • ディレクトリ = 701
  • CGIファイル = 700
  • CGIから書き込まれるファイル = 600

13. WebDAVを利用する

| | INDEX

はじめにLockFileを作成しておく。(忘れやすい)

# LOCKFILEの作成
> mkdir -p /var/apache
# Apacheのユーザにパーミッションを与える
> chown apache:apache /var/apache

httpd.conf に以下のような設定を足す。

Alias /share /home/share
DAVLockDB /var/apache/DAVLock
<Location /share>
    Dav on
    Header add MS-Author-Via "DAV" #Windows対策
    Options Indexes MultiViews
    Order allow,deny
    Allow from all
</Location>

ユーザ認証をWebDAVでの操作のみについて導入したい場合、LimitやLimitExcept節を利用する。

Dav            on
AuthType       Digest
AuthName       "dav"
AuthUserFile   /home/.davpass
AuthGroupFile  /dev/null
<LimitExcept GET OPTIONS>
    Require        valid-user
</LimitExcept>

もちろん、すべてのアクセス(ブラウザなどを含む)に対してユーザ認証を求める場合は、LimitやLimitExcept節は必要ない。

余談: WindowsXPでのWebDAVのユーザ認証の問題

WindowsXPの「ネットワークプレースの追加」から利用しようとすると、ユーザ認証時になぜかユーザ名の前にサーバのドメイン名を付けるという余計なことをしてくれる模様。

WindowsXPのSP2以降であれば、WebDAVのアドレスの最後に「?」を追加してアクセスすれば回避できる

ほかの回避方法については、マイクロソフトのサポートページをどうぞ。

一時的にWebClientサービスを停止して、「ネットワークプレースの追加」をすればいいらしい。

14. WebDAVで日本語ファイル名を利用する

| | INDEX

上のWebDAVの設定だけでは、サーバ文字コードとクライアント文字コードが不一致の場合、日本語ファイル名は使えない。

そこで、mod_encodingを利用することにする。設定例は以下のとおり。

EncodingEngine        on
SetServerEncoding     UTF-8
DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
AddClientEncoding "cadaver/" EUC-JP #Linuxなどのcadaver用
NormalizeUsername     on

サーバの文字コード設定などにあわせて調整する。

NormalizedUsernameは、Windows XPのExplorerでユーザ認証をした場合に、クライアントから送られてくるユーザ名が「ホスト名\ユーザ名」となる問題に対応するため・・・らしい。

15. PHPを利用する

| | INDEX

httpd.confより抜粋。(PHP5の場合。PHP4の場合は5の数字を4にする)

# Windows
LoadModule php5_module "php5apache2.dll"
<IfModule mod_php5.c>
    AddType application/x-httpd-php .php
    Addtype application/x-httpd-php-source .phps
    PHPIniDir "/php5"
</IfModule>

PHPIniDirはその名のとおり、php.iniの場所を指定する。

16. autoindexをカスタマイズする

| INDEX

mod_autoindexであれこれする。以下、例。

# HTMLTableは実験的にApache 2.0.23 以降, XHTMLはApache 2.0.49 以降
IndexOptions FancyIndexing XHTML HTMLTable VersionSort
ReadmeName README.html  #各ディレクトリのREADME.htmlを読む。
HeaderName /HEADER.html #常にトップディレクトリのHEADER.htmlを読む。
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t *ico

SuppressHTMLPreambleを指定すると、勝手に<html><body>やそのクローズなどが挿入されなくなる。その場合はHeaderNameで指定したファイルなどで適正に処理する。

.