1. インストール(コンパイルオプション)
コンパイルオプションが毎回ながくなるので、サンプルを置いておく。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. 基本的な設定
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. 文字コード関係
日本語文字化けが起こる場合は、
AddDefaultCharset off #文書のヘッダー情報を優先
LanguagePriority ja en ca ... #jaを最優先に
を試す。
また、個別のディレクティブでhtmlファイルに対するヘッダを指定することもできる。サイト内の文字コードが統一されているなら、よい方法かもしれない。
<Directory /home/www/doc/>
AddType "text/html; charset=UTF-8" .html
</Directory>
5. CGIの設定
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
7. アクセス制限(IPアドレス)
以下のようにディレクティブを設定する。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のようなサブネットマスクでの指定も使える。
9. LDAPによる認証を利用する
まずモジュールをロードしておく。(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. ログのカスタマイズ
ログのカスタマイズをする。リファラーなどを取得できる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を利用する
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を利用する
コンパイル時に以下のようなオプションを指定しておく。指定されている値は、設定例。
- --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を利用する
はじめに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で日本語ファイル名を利用する
上の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を利用する
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をカスタマイズする
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で指定したファイルなどで適正に処理する。