Apache

2014/8/20更新

対応バージョン: 2.4.9

このメッセージはWebDAV経由のファイルのロック時にそれに先立つ他のロックがうまく動作していないことを差すが、往々にしてDAVのロックファイルに指定したディレクトリに書き込み権がないことが多いので確認して適切なパーミッションにする。

Apacheのデーモンの実行ユーザ/グループ、及びDAVのロックファイルはhttpd.confで確認できる。

% vi /etc/httpd/conf/httpd.conf
:
User apache
Group apache
:
DAVLockDB /var/lib/dav/lockdb
:

このような指定をした場合、ロックファイルは/var/lib/dav配下にlockdb.dirとlockdb.pagの2つが作られる。

2009/12/18更新

対応バージョン: 2.2.14

特定のクライアント環境(Windows XP + IE6等)においてWebDAVサーバ上でファイル/ディレクトリ操作をすると日本語が化ける。

この場合、mod_encodingを導入して対応する。

モジュール、パッチ入手

以下からモジュール本体とパッチを入手する。

% wget http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz
% wget http://webdav.todo.gr.jp/download/experimental/mod_encoding.c.apache2.20020611a-2
% wget http://www.aconus.com/~oyaji/faq/mod_encoding.c-apache2.2-20060520.patch

展開、パッチ適用

% tar zxvf mod_encoding-20021209.tar.gz 
% cd mod_encoding-20021209
% ./configure --with-apxs=/usr/local/apache2/bin/apxs
% cp ../mod_encoding.c.apache2.20020611a-2 mod_encoding.c
% patch -p0 < ../mod_encoding.c-apache2.2-20060520.patch 

iconv_hookライブラリ導入

% cd lib
% ./configure 
% make
% sudo make install
% sudo ldconfig

mod_encoding導入

% cd ..
% make
% gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -L/usr/local/lib -Llib -liconv_hook
% sudo make install
% sudo ln -s /usr/local/lib/libiconv_hook.so /usr/local/apache2/lib/libiconv_hook.so.1

httpd.conf設定

当該モジュールの動作範囲をWebDAVに限定する。

% sudo vi /usr/local/apache2/conf/httpd.conf

:
LoadModule encoding_module   modules/mod_encoding.so

<IfModule mod_dav_fs.c>
    <IfModule mod_encoding.c>
        EncodingEngine on
        SetServerEncoding UTF-8
        DefaultClientEncoding JA-AUTO-SJIS-MS SJIS

        AddClientEncoding "Microsoft .* DAV 1.1" ASCII CP932 UTF-8
        AddClientEncoding "Microsoft .* DAV" UTF-8 CP932
        AddClientEncoding "(Microsoft .* DAV $)" UTF-8 CP932
        AddClientEncoding "(Microsoft .* DAV 1.1)" CP932 UTF-8
        AddClientEncoding "Microsoft-WebDAV*" UTF-8 CP932
        AddClientEncoding "RMA/*" CP932
        AddClientEncoding "xdwin9x/" CP932
        AddClientEncoding "cadaver/" UTF-8 EUCJP-MS
        AddClientEncoding "Mozilla/" EUCJP-MS
    </IfModule>
:
</IfModule>

設定ファイルを変更したらApacheを再起動する。

2008/6/18更新

対応バージョン: 2.2.9

WebDAV用ディレクトリまでのパスツリーの間にサーバがアクセスできないディレクトリがある。

例えばサーバ実行ユーザがwwwでWebDAV用ディレクトリが/home/public/webdavだとすると、webdavディレクトリだけでなくhomeやpublicにもwwwユーザがアクセスできなければならない。

これを簡単に確認するには以下のようにする。

% sudo -u www ls /home/public/webdav
ls: cannot access /home/public/webdav: Permission denied

2009/8/11更新

対応バージョン: 2.2.13

httpd.confに以下の設定を追加してデーモンを再起動する。

ロックファイル

DavLockDB "/usr/local/apache2/var/DavLock"

/usr/local/apache2/varが作成されていない場合は作成し、デーモン実行ユーザが書き込めるようにしておく。

% sudo mkdir /usr/local/apache2/var
% sudo chown www:www /usr/local/apache2/var

WebDAV用URLの設定

DocumentRootで指定したディレクトリと違う場所をWebDAV用に使用したい場合はAlias設定を行う。

Alias /public "/foo/bar/public"

WebDAV用エリアの詳細設定

WebDAV用エリアに対して「Dav On」にてWebDAV機能をONにし、その他通常の設定を行う。

<Location "/public/">
    Dav On
    Options Indexes
    Order deny,allow
    Deny from all
    Allow from all
</Location>

WebDAVクライアント毎の不具合対応

WindowsのIEをはじめ各種ブラウザやWebDAVクライアントの不具合を解消するため、BrowserMatchにて個別にクライアント毎の設定を行う。

以下、代表的な設定の例を示す。基本的にそれぞれのクライアントに対してredirect-carefully動作(クライアントへのリダイレクトの送信を注意深く行なうようにする)を指定する。

Windows (Webフォルダ)
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
MacOS X (Finder)
BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
Linux (Gnome VFSのDAVサポート)
BrowserMatch "^gnome-vfs/1.0" redirect-carefully

2008/6/18更新

対応バージョン: 2.2.9

ホスト名ベースでバーチャルホストを設定する場合、まずDNSサーバのAレコードに2つのホストを「同じIPアドレス」で登録する。

例)

serv1.sample.net  IN A  192.168.0.1
serv2.sample.net  IN A  192.168.0.1

(*) ホスト名の名前解決にDNSでなくhostsファイルを使用している場合は以下のように登録する。

192.168.0.1  serv1.sample.net
192.168.0.1  serv2.sample.net

次にhttpd.confにバーチャルホストの設定を追加する。

最初に「NameVirtualHost」ディレクティブでホスト名ベースのバーチャルホストを有効にするIPアドレスを指定して、続いて各バーチャルホストの設定を記述する。

例)

NameVirtualHost 192.168.0.1

<VirtualHost 192.168.0.1>
  ServerName serv1.sample.net
  ServerAdmin webmaster@sample.net
  DocumentRoot /Public/serv1
  ErrorLog /var/log/httpd-error_serv1.log
  TransferLog /var/log/httpd-access_serv1.log
</VirtualHost>

<VirtualHost 192.168.0.1>
  ServerName serv2.sample.net
  ServerAdmin webmaster@sample.net
  DocumentRoot /Public/serv2
  ErrorLog /var/log/httpd-error_serv2.log
  TransferLog /var/log/httpd-access_serv2.log
</VirtualHost>

これにより、同じ192.168.0.1にアクセスしても接続先ホストの違いによってどちらかのバーチャルホストの設定が適用される。

関連資料・記事

2008/6/18更新

対応バージョン: 2.2.9

IPアドレスベースでバーチャルホストを設定する場合、まず対象となるホストで2つのIPアドレスが使える必要がある。

方法としては以下の2通りがあるが、どちらの方法を使ってもよい。

NICを2枚用意してそれぞれにIPアドレスを割り当てる
1つのNICにIPエイリアスを設定する

関連資料・記事

IPアドレスが2つ用意できたらhttpd.confにバーチャルホストの設定を追加する。

例)

<VirtualHost 192.168.0.1>
  ServerName serv1.sample.net
  ServerAdmin webmaster@sample.net
  DocumentRoot /Public/serv1
  ErrorLog /var/log/httpd-error_serv1.log
  TransferLog /var/log/httpd-access_serv1.log
</VirtualHost>

<VirtualHost 192.168.0.2>
  ServerName serv2.sample.net
  ServerAdmin webmaster@sample.net
  DocumentRoot /Public/serv2
  ErrorLog /var/log/httpd-error_serv2.log
  TransferLog /var/log/httpd-access_serv2.log
</VirtualHost>

これにより、192.168.0.1にアクセスした場合は最初のバーチャルホストの設定が、192.168.0.2にアクセスした場合は次のバーチャルホストの設定がそれぞれ適用される。

関連資料・記事

2008/5/1更新

対応バージョン: 2.2.8

以下の2通りの方法がある。両者の違いはURLに「~」が含まれるかどうかなので好みに応じて使い分けるとよい。

mod_userdirを使用する

httpd.confに以下の設定を追加する。

UserDir <公開ディレクトリ> ... 各ユーザの$HOMEからの相対パス

例えば以下のように設定すると各ユーザの$HOME/public_html配下が「http://foo.bar.com/~」として参照できるようになる。

UserDir public_html

AliasMatchを使用する

httpd.confに以下の設定を追加してリクエストを実ディレクトリにマッピングする。

AliasMatch <URLパターン> <マッピング>

例えば以下のように設定すると各ユーザの$HOME/public_html配下が「http://foo.bar.com/」として参照できるようになる。mod_userdirと違いURLに「~」が含まれない。

AliasMatch ^/([^/]+)/(.*) /home/$1/public_html/$2

2008/5/1更新

対応バージョン: 2.2.8

ApacheでSSLを使用するにはまずWebサーバの証明書を作り、それを設定ファイルで適切に指定することによって行う。

以下、手順を追って説明する。

Webサーバ証明書の秘密鍵生成

まずサーバ証明書の秘密鍵を生成する。

ここではDES3方式(鍵長1024bit)のRSA秘密鍵を生成する。

% openssl genrsa -out server.key -des3 1024
Generating RSA private key, 1024 bit long modulus
.....................++++++
................++++++
e is 65537 (0x10001)
Enter pass phrase: ***** ← 秘密鍵のパスフレーズ
Verifying - Enter pass phrase: ***** ← 秘密鍵のパスフレーズ再入力

% more server.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,FC415C455FDE0363

AioXOIFL4FgvSUaMyFuYpiVGojp83KWlK1A48XVFaM10Ax3X1lsKgDgBZWSdLZw8
zkreIWlChvThDYVuG4tG5zqFC8SUkoLX/mt+9oNzLV2ebrY47U0PQ0Q27yvR2L8T
:
k+YTIKnp/iTx537D1WHzA3sFAsB1/3O7H+VDOs1YafIuf4qgkMv/srL7WkPUlFJ9
HlQExJ94R53PwDr3cFAEKYvuVPh9XlmLnHHUXdIBNPo7h+f1yRk+hw==
-----END RSA PRIVATE KEY-----

Webサーバ証明書生成

続いてWebサーバのサーバ証明書を生成する。

まず認証局に提出するCSRファイルを作成する。

% openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: ***** ← サーバ秘密鍵のパスフレーズ
:
Country Name (2 letter code) [JP]: ← 国名(例:JP) (*) 必須
State or Province Name (full name) []: ← 都道府県名(例:Tokyo)
Locality Name (eg, city) []: ← 区市町村名(例:Chiyoda)
Organization Name (eg, company) [Private]: ← 組織名/会社名
Organizational Unit Name (eg, section) []: ← 部署名
Common Name (eg, YOUR name) []: ← 組織の通称 (*) 必須 ... httpd.confのServerNameと合わせる
Email Address []: ← メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← リターン
An optional company name []: ← リターン

% more server.csr
-----BEGIN CERTIFICATE-----
MIICczCCAdwCCQDwtET0MG5A7zANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJK
UDEOMAwGA1UECBMFQ2hpYmExEDAOBgNVBAcTB0thc2hpd2ExEDAOBgNVBAoTB1By
:
keXTG6HtQwBLuHsXJdaYCOcJCNsxnMAVwziZX4eA8VcQn7+qjjx1JtvQAW80PUGl
eaR9sd0HfA==
-----END CERTIFICATE-----

CSRファイルが作成できたらそれを認証局に署名してもらう。

ここではテスト用としてプライベート認証局を利用してセルフサインを行う。

証明書の有効期間は365日とする。

% openssl x509 -in server.csr -days 365 -req -signkey server.key -out server.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Chiyoda/O=Private/CN=Private Web Service/emailAddress=www@private.jp
Getting Private key
Enter pass phrase for server.key: ***** ← サーバ秘密鍵のパスフレーズ

% more server.crt
-----BEGIN CERTIFICATE-----
MIICczCCAdwCCQDwtET0MG5A7zANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJK
UDEOMAwGA1UECBMFQ2hpYmExEDAOBgNVBAcTB0thc2hpd2ExEDAOBgNVBAoTB1By
:
keXTG6HtQwBLuHsXJdaYCOcJCNsxnMAVwziZX4eA8VcQn7+qjjx1JtvQAW80PUGl
eaR9sd0HfA==
-----END CERTIFICATE-----

関連資料・記事

Apacheの設定変更

SSLの設定は通常のhttpd.confからSSL専用の設定ファイルをincludeして使用する形になるのでまずhttpd.confの以下のコメントを外す。

#Include conf/extra/httpd-ssl.conf

次にhttpd-ssl.confを編集し、サーバ証明書の格納パスなどを適切に設定する。

:
SSLCertificateFile "/usr/local/apache2/conf/server.crt" ← サーバ証明書
:
SSLCertificateKeyFile "/usr/local/apache2/conf/server.key" ← サーバ証明書の秘密鍵
:

その他のSSL関連設定については基本的にデフォルトのままでよいが必要に応じて変更する。また一般的な設定については通常のhttpd.confと同じなのでここでは割愛する。

関連資料・記事

上記パスにサーバ証明書/秘密鍵を置く。

% sudo cp server.crt server.key /usr/local/apache2/conf

サーバ起動

設定が終わったらサーバを起動する。

% sudo service apache start

通常はサーバ起動時にパスフレーズの入力を求められるが、これを省略して自動起動させたい場合は多少セキュリティに難があるが以下のようにサーバ証明書の秘密鍵からパスフレーズを削除すればよい。

% mv server.key server.key.org
% openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org: ← サーバ証明書秘密鍵のパスフレーズ
writing RSA key

確認

Webブラウザで「https://〜」としてアクセスできればOKである。

2012/4/16更新

対応バージョン: 2.4.1

以下のようにしてSSIの「#exec cmd」を実行しようとした。

<!--#exec cmd="/lib/foo.cgi"-->

しかしブラウザの画面には件名のエラーが、Apacheのログには以下のエラーがそれぞれ出力され、プログラムが実行できない。

AH01371: unknown directive "exec" in parsed doc <ファイル>

これはApacheのバージョンが2.4.1になり、利用する機能毎に明示的にモジュールをロードする仕様になったことに起因する。

SSIを有効化するにはhttpd.confにてmod_include.soをロードするが、「#exec cmd」を実行するにはさらにmod_cgid.soもロードする必要があり、ロードしていないと今回のような事象になる。

# SSI
LoadModule include_module modules/mod_include.so
# SSI(exec)
LoadModule cgid_module modules/mod_cgid.so

関連資料・記事

2008/10/9更新

対応バージョン: 2.2.9

SSIの「#exec cgi」を以下のように記述したが、該当のCGIが実行されない。

<!--#exec cgi="/lib/foo.cgi"-->

CGIが実行されない原因には様々なものがあるのでCGI、呼出側のHTML、サーバの設定(*)それぞれで考えられる原因を挙げる。

(*) 利用者が自分で設定できる.htaccessを含む。

CGI

CGIの実行パスが間違っている
CGIに実行権がない

755や750など、適切な実行権を付ける。

CGIそのものだけでなく、CGIを設置してある場所に至る途中のディレクトリの権限も適切に設定されている必要がある。

CGIを設置できる場所が規定外

サーバの設定で以下のようになっていたら「/cgi-bin」配下にしかCGIを設置できない。

<Directory />
    :
    Options Includes
    :
</Directory>

<Directory /cgi-bin/>
    :
    Options ExecCGI
    :
</Directory>
CGIの拡張子が規定外

サーバの設定で以下のようになっていたら「.cgi」「.pl」以外の拡張子は使えない。

<IfModule mime_module>
    :
    AddHandler cgi-script .cgi .pl
    :
</IfModule>

CGI(ソース)

構文エラー

CGI中に構文エラーがあったり、PerlやRubyなどのスクリプト言語を使う場合に1行目に記述する言語のパスが違っている可能性がある。

例) /usr/binにインストールされているPerlを使用する場合

#!/usr/bin/perl
Content-type行を出力していない

一番最初にContent-type行を出力する必要がある。

例) Perlで記述する場合

print "Content-type: text/html\n\n";

Content-type行の次に空行を出力する必要があることに注意する。

呼出側のHTML

SSIを利用できる場所が規定外

サーバの設定で以下のようになっていたら「/admin」配下でしかSSIが利用できない。

<Directory />
    :
    Options None
    :
</Directory>

<Directory /admin/>
    :
    Options Includes
    :
</Directory>
SSIを利用するHTMLファイルの拡張子が規定外

サーバの設定で以下のようになっていたら「.shtml」以外の拡張子は使えない。

<IfModule mime_module>
    :
    AddHandler server-parsed .shtml
    :
</IfModule>

サーバの設定

SSIを使用する設定になっていない

関連資料・記事

2008/6/18更新

対応バージョン: 2.2.9

httpd.confのOptionsディレクティブにてIncludesを指定する。

例)

<Directory />
    :
    Options Includes [他のオプション] ...
    :
</Directory>

また以下のハンドラを定義してSSIを利用するHTMLファイルの拡張子を指定する。

<IfModule mime_module>
    :
    AddHandler server-parsed .shtml
    :
</IfModule>

リクエストが「/」で終わっている場合に.shtmlファイルを読み込む場合は以下のように設定する。

<IfModule dir_module>
    :
    DirectoryIndex index.shtml [他のファイル] ...
    :
</IfModule>

2009/8/11更新

対応バージョン: 2.2.13

mod_rewriteを使用する。

例えば以下のような転送をしたい場合、

http://foo.sample.com/ -> /Public/foo/

http://bar.sample.com/ -> /Public/bar/

サブドメイン名をマッチング対象として、httpd.confに以下のように記述する。

RewriteEngine on
RewriteCond %{HTTP_HOST}  ^[^.]+\.sample\.jp$
RewriteRule (.*) %{HTTP_HOST}$1  [C]
RewriteRule ^([^.]+)\.sample\.jp(.*) /Public/$1/$2  [L]

2010/3/15更新

対応バージョン: 2.2.15

mod_proxyを使用する。

例えば以下のようにサブディレクトリへのリクエストを別のサーバにマッピングしたい場合、

http://foo.com/ -> 自サーバ
http://foo.com/sub -> http://bar.com/

httpd.confに以下のように記述する。

フォワードプロキシリクエストを無効化

自サーバがオープンプロキシにならないようにする。

ProxyRequests Off

マッピング指定

ProxyPass /sub http://bar.com/

リバースプロキシされたサーバから返されたHTTP応答ヘッダのURLを調整

HTTPリダイレクト応答のLocation、Content-Location、URLヘッダの内容を書き換え、プロキシ先のホスト名をクライアントに見せないようにする。

内容はProxyPassと同じにする。

ProxyPassReverse /sub http://bar.com/

2008/6/18更新

対応バージョン: 2.2.9

Apacheにはabというベンチマークツールが付属するのでこれを使用してWebサーバのベンチマークを取ることができる。

以下にabの主なオプションを示す。

-n <数値>

テストで発行するリクエストの回数を数値で指定

-c <数値>

テストで同時に発行するリクエストの数を数値で指定

-t <数値>

サーバからのレスポンスの待ち時間(秒)を数値で指定

-p <ファイル名>

サーバへ送信するファイルがある場合に指定

-T <コンテンツタイプ>

サーバへ送信するコンテンツヘッダを指定

-v <数値>

指定した数値に応じた動作情報を表示

-w

結果をHTMLで出力

-i

GETリクエストの代わりにHEADを使用

-x <属性>

HTML出力のtableタグに属性を追加

-y <属性>

HTML出力のtrタグに属性を追加

-z <属性>

HTML出力のtdまたはthタグに属性を追加

-C =<値>

Cookie値を渡してテストする

-H <属性>

ヘッダに属性を追加(例:Accept-Encoding: gzip)

-A <ユーザ名>:<パスワード>

ベーシック認証が必要なコンテンツをテストする

-P <ユーザ名>:<パスワード>

認証の必要なプロキシを通じてテストする

-X <プロキシサーバ名>:<ポート>

プロキシ経由でリクエストする場合に指定

-V

abのバージョン番号を表示

-k

HTTP/1.1のKeepAliveを有効にしてテストする

-d

テストの進捗度合を表示しない

-S

信頼性に間する評価を表示しない

-g <ファイル名>

収集結果をgnuplotフォーマットでファイルに出力する

-e <ファイル名>

収集結果をCSVフォーマットでファイルに出力する

-h

abのヘルプを表示

-Z

SSL/TLSのCipher Suite(暗号アルゴリズムとハッシュアルゴリズムの組み合わせ)を指定する(例:RC4_128_SHA)

-f <プロトコル>

SSL/TLSのプロトコルを指定する(例:SSL3)

実行例) 1回に100リクエストを発行し、合計1000リクエストを処理する。

% /usr/local/apache2/bin/ab -n 1000 -c 100 http://foo.bar.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking foo.bar.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests

Server Software:      Apache/2.2.9
Server Hostname:      foo.bar.com
Server Port:          80

Document Path:        /
Document Length:      11198 bytes

Concurrency Level:    100
Time taken for tests: 20.783763 seconds
Complete requests:    1000
Failed requests:      0
Write errors:         0
Total transferred:    3965749 bytes
HTML transferred:     3783567 bytes
Requests per second:  48.11 [#/sec] (mean) ← 1秒間に処理されたリクエスト数
Time per request:     2078.376 [ms] (mean)
Time per request:     20.784 [ms] (mean, across all concurrent requests)
Transfer rate:        186.30 [Kbytes/sec] received ← 転送速度

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   6.5      0      43 ← 接続時間
Processing:   432 2020 288.5   2071    2781 ← 処理時間
Waiting:      429 1811 331.2   1875    2652 ← 待ち時間
Total:        445 2022 285.7   2072    2797

Percentage of the requests served within a certain time (ms)
  50%   2072
  66%   2114
  75%   2147
  80%   2181
  90%   2277
  95%   2336
  98%   2385
  99%   2552
 100%   2797 (longest request)

2014/4/22更新

対応バージョン: 2.4.7

過去のApacheのログはJVNDB-2003-000047のような脆弱性を持っていたが制御コードをエスケープすることでこの問題に対応した。

それと引き換えに日本語などの文字列がそのままでは読めない状態になったので、例えば以下のPerlのワンライナーで元の文字列に戻すことができる。

アクセスログ (URLエンコード)
% tail access_log
... /%E6%97%A5%E6%9C%AC%E8%AA%9E ...

% tail access_log | perl -ne 'use URI::Escape; print uri_unescape($_);'
... /日本語 ...
エラーログ (エスケープ)
% tail error_log
... /\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e ...

% tail error_log | perl -ne 's/\\x(..)/pack("C",hex($1))/eg;print $_;'
... /日本語 ...

2008/6/18更新

対応バージョン: 2.2.9

ログのローテート方法にはいくつかの種類があるが、ここではApacheに組み込まれているrotatelogsを使用する方法を説明する。

設定はhttpd.confのCustomLogにて行う。

例えばローテートなしの状態で

CustomLog /var/log/httpd-access.log combined

のようになっている設定の場合、

CustomLog "| /usr/local/apache2/bin/rotatelogs /var/log/httpd-access.log 86400" combined

のようにすればよい。

最初の|(パイプ)でログをrotatelogs経由で出力するようにし、ログファイル名の後ろの数字でローテートのタイミングを指定する。

指定の方法には「秒」と「ファイルサイズ」の両方がある。

例)

3600

1時間(60秒 x 60分)

86400

1日 (60秒 x 60分 x 24時間)

604800

7日 (60秒 x 60分 x 24時間 x 7日)

5M

5MBytes

2008/5/17更新

対応バージョン: 2.2.8

LDAPサポートを組み込もうと以下のオプションを付けてconfigure、makeするとエラーになる。

% ./configure --enable-authnz-ldap --enable-ldap
% make
:
mod_authnz_ldap.c:41:2: error: #error mod_authnz_ldap requires APR-util to have LDAP support built in. To fix add --with-ldap to ./configure.
:

エラーメッセージのとおりAPR-utilが足りないのが原因なので、別途組み込んでもよいが(*)、--with-ldapオプション付でconfigureすれば自動的に組み込んでくれる。

% ./configure --with-ldap --enable-authnz-ldap --enable-ldap
% make
:

(*) APR-utilはApache配布物のsrclib/apr-util配下に格納されている。

関連資料・記事

2008/5/17更新

対応バージョン: 2.2.8

LDAPでベーシック認証を使用するにはまず以下のオプションを付けてApacheをconfigure、make、インストールする。

--with-ldap

APR-util組み込み

--enable-authnz-ldap

LDAP認証

--enable-ldap

LDAPコネクションプール、及び問合せ結果のキャッシュ

httpdには以下のモジュールが組み込まれる。

% ./httpd -l|grep ldap
  mod_authnz_ldap.c
  util_ldap.c

関連資料・記事

Apacheの準備ができたらhttpd.confや.htaccessに設定を追加する。

設定パラメータ

まず主な設定パラメータについて説明する。

AuthName

認証時に表示されるダイアログの文字列を指定する。

例)

AuthName "User authentication"
AuthType

認証方法を指定する。ベーシック認証ではBasicを指定する。

AuthType Basic
AuthBasicProvider

ベーシック認証のサービス提供元を指定する。LDAPによる認証の場合はldapを指定する。

AuthBasicProvider ldap
AuthzLDAPAuthoritative {on|off}

LDAP認証で失敗した場合に他の認証サービスに移るかどうかを指定する。

onは移る、offは移らない(LDAP認証のみ)。デフォルトはon。

通常はoffにして他の認証サービスを使用しないが、Requireで指定する許可ユーザの指定が一般的なvalid-user(*)意外の場合はこの設定をonにする必要がある。

(*) 認証サービスの種類に関わらず正当なユーザを許可

AuthLDAPUrl

LDAP認証サーバとベースの識別名(DN:Distinguished Name)、及び検索に用いる属性(*)をURL形式で指定する。

(*) 通常は組織単位People内のuid

例)

AuthLDAPUrl ldap://www.bar.com/ou=People,dc=bar,dc=com?uid
AuthLDAPGroupAttribute

検索時のuidをLDAPグループレコード内のどの属性を一致させるかを指定する。

AuthLDAPGroupAttribute memberUid
Satisfy {Any|All}

Requireによる条件指定が複数あった場合にアクセスを許可するためにすべての条件を満たす必要があるかどうかを指定する。

どれか一つでも条件満たせばよい場合はAny、すべての条件を満たす必要がある場合はAll。デフォルトはAll。

Satisfy Any

使用目的別設定例

次に使用目的による設定の違いをいくつか紹介する。

AuthName、AuthType、AuthBasicProviderはいずれも同じ設定なのでここでは省略する。

LDAPディレクトリ内の(正当な)全ユーザに対してアクセスを許可する
AuthzLDAPAuthoritative off
AuthLDAPUrl ldap://www.bar.com/ou=People,dc=bar,dc=com?uid
Require valid-user
LDAPディレクトリ内のfooとbarユーザにのみアクセスを許可する
AuthzLDAPAuthoritative on
AuthLDAPUrl ldap://www.bar.com/ou=People,dc=bar,dc=com?uid
Require ldap-user foo bar
LDAPディレクトリ内のにdiv1グループに属するユーザにのみアクセスを許可する
AuthzLDAPAuthoritative on
AuthLDAPUrl ldap://www.bar.com/ou=People,dc=bar,dc=com?uid
AuthLDAPGroupAttribute memberUid
Require ldap-group div1
Require ldap-attribute gidNumber=420

関連資料・記事

2008/6/18更新

対応バージョン: 2.2.9

httpd.confのAllowOverrideディレクティブにて該当のディレクトリに対する.htaccessの設定が無効になっている。

例)

<Directory />
    :
    AllowOverride None ← .htaccess無効
    :
</Directory>

このNoneを適切な値に変更することによって.htaccess内での設定が全て、あるいは一部有効になる。

指定できる値は以下のとおり。

AuthConfig

認証に関するディレクティブの使用を許可する(AuthTypeなど)

FileInfo

ドキュメントのタイプとメタデータを制御するディレクティブの使用を許可する(DefaultType、BrowserMatch、RewriteEngineなど)

Indexes

ディレクトリインデックスを制御するためのディレクティブの使用を許可する(DirectoryIndexなど)

Limit

ホストへのアクセス制御を行うためのディレクティブの使用を許可する(Allow、Deny、Order)

Options[=Option,...]

特定のディレクティブを個別に許可する。カンマで区切って複数指定可能

例)

AllowOverride FileInfo Indexes

上記の例ではFileInfoとIndexesのどちらにも属さないディレクティブはすべて内部サーバエラーとなる。

2008/6/18更新

対応バージョン: 2.2.9

CGIやSSIに引き渡す環境変数を設定するにはhttpd.confにて以下のいずれかの方法で行う。

SetEnvディレクティブ(新たに設定内容を指定する)

例)

SetEnv HTTP_PROXY http://192.168.10.1:8080/

PassEnvディレクティブ(Apacheを起動したシェルの環境変数を引き継ぐ)

例)

PassEnv LD_LIBRARY_PATH

(*) PassEnvにて指定した環境変数がApacheを起動したシェルで定義されていない場合、Apache起動時に以下のようなメッセージが出る。

[warn] PassEnv variable <環境変数> was undefined

逆に、指定した環境変数を取り除くにはUnsetEnvディレクトリを使用する。

UnsetEnv LD_LIBRARY_PATH

2016/9/20更新

対応バージョン: 2.4.18

ApacheでZeroconf(Avahi)を有効にするには以下の手順を実施する。

まずlibapache2-mod-dnssdをインストールする。

% sudo apt install libapache2-mod-dnssd

これにより以下のファイルがインストールされる。

/usr/lib/apache2/modules/mod_dnssd.so

/etc/apache2/mods-available/dnssd.load
/etc/apache2/mods-available/dnssd.conf

/etc/apache2/mods-enabled/dnssd.load -> /etc/apache2/mods-available/dnssd.load
/etc/apache2/mods-enabled/dnssd.conf -> /etc/apache2/mods-available/dnssd.conf

mod_dnssd.soの有効化はそれぞれ以下のファイルに記述されており、Apacheの設定ファイル/etc/apache2/apache2.conf内で/etc/apache2/mods-enabled/*.{load,conf}をインクルードする設定になっているので特にapache2.confを修正する必要はない。

/etc/apache2/mods-available/dnssd.load
LoadModule dnssd_module /usr/lib/apache2/modules/mod_dnssd.so
/etc/apache2/mods-available/dnssd.conf
DNSSDEnable on

このあとApacheを再起動すればZeroconf(Avahi)で割り当てられたホスト名でHTTPアクセスすることが可能になる。

% sudo systemctl restart apache2
% curl http://xxx.local/
<!DOCTYPE html>
:
:
:
</html>

尚、Zeroconfのサービスとして細かい定義をしたい場合は/etc/apache2/apache2.confのLocationディレクティブやVirtualHostディレクティブ等に以下のような記述を追加してApacheを再起動する。

例) WebDAVサービスとして定義

% sudo vi /etc/apache2/apache2.conf
:
<VirtualHost xxx.local>
        Dav On
        :
        DNSSDServiceName "Internal WebDAV Server"
        DNSSDServiceTypes _webdav._tcp
</VirtualHost>
:

% sudo systemctl restart apache2

サービス名を検索すると上記の定義が反映されていることがわかる。

% avahi-browse -a -t
:
+ enp3s0 IPv4 Internal WebDAV Server     WebDAV File Share  local
:

関連資料・記事

参考サイト

2008/7/29更新

対応バージョン: 2.2.9

サーバにアクセスする際に外部からのアクセスにはベーシック認証を用い、内部からのアクセスは認証不要にさせたいような場合、両者の設定を記述しておいて「Satisfy any」を指定することによってどちらかの条件のみを満たせばアクセスを可能にすることができる。

具体的には以下のように設定する。

ベーシック認証

/usr/local/apache2/.htpasswdに記載されたアカウントのみアクセス可能

AuthUserFile /usr/local/apache2/.htpasswd
AuthGroupFile /dev/null
AuthName "Require UserAuthentication: "
AuthType Basic
require valid-user
ホスト制限

192.168.0.*からのみアクセス可能

order deny,allow
allow from 192.168.0.0/24
deny from all
上記のどちらかがOKならアクセス可能にする
Satisfy any

以上の設定を.htaccessに記述することによって、この例では192.168.0.*からのアクセスは認証不要、それ以外のホストからのアクセスは認証が必要となる。

AuthUserFile /usr/local/apache2/.htpasswd
AuthGroupFile /dev/null
AuthName "Require UserAuthentication: "
AuthType Basic
require valid-user

Satisfy any

order deny,allow
allow from 192.168.0.0/24
deny from all

尚、Satisfyをallに指定するとアクセスできるのは両方の設定を満たした場合のみになる。つまり、アクセス可能なホストは192.168.0.*のみで、かつユーザ認証が必要となる。

関連資料・記事

2008/6/18更新

対応バージョン: 2.2.9

以下の手順にて設定する。

ユーザ認証用データベース作成

まずhtpasswdを使用してユーザ認証用のデータベースを作成する。

ここではユーザfooについてパスワードデータベースを作成する。

-cオプションは新規にデータベースを作成する指定である。

パスワードデータベースはhttpd.confのServerRootで指定したディレクトリに作成する。

% sudo /usr/local/apache2/bin/htpasswd -c /usr/local/apache2/.htpasswd foo
New password:
Re-type new password:
Adding password for user foo

.htaccess設置

次にユーザ認証を行いたいファイルのあるディレクトリに.htaccessを置く。内容は以下のようにする。

AuthUserFile

ユーザ認証ファイルをフルパスで指定する。

AuthUserFile /usr/local/apache2/.htpasswd
AuthGroupFile

グループ単位での認証ファイルを指定する。認証ファイルがない、あるいは不必要な場合は/dev/nullを指定する。

AuthGroupFile /dev/null
AuthName

認証時に表示されるダイアログの文字列を指定する。

AuthName "Require UserAuthentication: "
AuthType

認証方法。ベーシック認証なら「Basic」、ダイジェスト認証なら「Digest」を指定するが事実上ダイジェスト認証をサポートしているWebブラウザが存在しないので通常は「Basic」を指定する。

AuthType Basic
Limit

リクエストの種類(GET、POST等)毎にアクセス制限などを記述する。

<Limit GET>
  :
  require valid-user foo bar com... ← (1)
  :
</Limit>

(1) この制限でアクセスを許可するユーザやグループを指定する。ユーザやグループを個別に指定する場合はスペースで区切って複数指定可能。パスワードファイルに含まれる全てのユーザに許可を与える場合はユーザ/グループは不要。

確認

最後に.htaccessを置いたファイルにアクセスしてみてユーザ認証用のダイアログが表示されユーザ認証が成功すればOKである。

関連資料・記事

2014/6/12更新

対応バージョン: 2.4.9

公式サイト

準備

あらかじめインストールしておくもの

OpenSSL (SSLを利用する場合)
OpenLDAP (LDAPを利用する場合)

関連資料・記事

pcreライブラリ
% sudo apt-get install libpcre3-dev

導入OS

Ubuntu 14.04

管理用アカウント作成

% sudo groupadd -r apache
% sudo useradd -r -g apache -s /bin/false -d /nonexistent apache

APRインストール

配布ファイル展開

% tar jxvf apr-1.5.1.tar.bz2 
% cd apr-1.5.1

make,インストール

% ./configure
% make
% sudo make install

インストール物 (man,infoは除く)

/usr/local/apr/*/*

APR-utilインストール

配布ファイル展開

% tar jxvf apr-util-1.5.3.tar.bz2
% cd apr-util-1.5.3

make,インストール

% ./configure --with-apr=/usr/local/apr/bin/apr-1-config
% make
% sudo make install

インストール物 (man,infoは除く)

/usr/local/apr/*/*

httpdインストール

配布ファイル展開

% tar jxvf httpd-2.4.9.tar.bz2
% cd httpd-2.4.9

make,インストール

% ./configure <オプション>

必要に応じて<オプション>でモジュールを組み込むことができる。ここでは以下のモジュールを有効にする。

Rewriteサポート
--enable-rewrite

関連資料・記事

Proxyサポート
--enable-proxy

また、デフォルトで有効になるモジュールのうち必要ないものはあらかじめ無効にしておくことでパフォーマンスアップが図れる。ここでは以下のモジュールを無効にする。

ユーザホームディレクトリ参照
--disable-userdir

関連資料・記事

% make
% sudo make install

インストール物 (man,infoは除く)

/usr/local/apache2/*/*

セキュリティの観点から以下のファイルは削除しておく。

/usr/local/apache2/cgi-bin/*

各種設定

/usr/local/apache2/conf/httpd.confにて基本的な設定を行う。

以下、主な設定項目について説明する。

サーバルート

Apacheの各種ファイルがインストールされているディレクトリを設定する。

後述する設定の中で相対パスが指定された場合、このディレクトリが起点となる。

(*) コンテンツの格納場所であるドキュメントルートは別途設定する。

ServerRoot = "/usr/local/apache2"

サーバの待ち受けポート

Listen 80

モジュール組み込み

使用するモジュールを機能毎に明示する。

例) RewriteモジュールとProxyモジュール

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so

デーモン実行ユーザ/グループ

<IfModule unixd_module>
User daemon
Group daemon
</IfModule>

サーバ管理者のメールアドレス

ServerAdmin you@example.com

ドキュメントルート

コンテンツが格納されているディレクトリを設定する。

DocumentRoot "/usr/local/apache2/htdocs"

コンテンツ毎の詳細な設定

Apacheではコンテンツ(サブディレクトリ)毎にアクセス制御や各種機能のON/OFFが詳細に設定できる。

まずはデフォルトの設定として「/」(トップディレクトリ)に対する設定を行い、各コンテンツに対する設定はデフォルトの設定を継承して必要な部分をオーバーライドする形で行う。

各設定の詳細については割愛する。

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

インデックスファイル

リクエストが「/」で終わっている場合にインデックスファイルとして検索するファイルを指定する。

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule> 

エラーログ

エラーログの出力先、出力レベル、及びログファイルのフォーマットを指定する。

ErrorLog logs/error_log
LogLevel warn

アクセスログ

アクセスログのフォーマット(複数指定可能)と出力先ファイルを指定する。

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    :
</IfModule>

MIMEタイプマッピング

リクエストされたファイルの拡張子とMIMEタイプのマッピングを行う。

基本的なマッピングはTypesConfigで指定する別ファイルで行うが、追加で設定したいMIMEタイプはここで設定する。

また、拡張子によるハンドラ設定(CGI、SSIなど)もここで行う。

<IfModule mime_module>
    TypesConfig conf/mime.types 
    :
    AddType application/x-gzip .tgz
    :
    #AddHandler cgi-script .cgi
    :
</IfModule>

動作確認

デーモンを起動する。

% sudo /usr/local/apache2/bin/apachectl start

待ち受けポートがLISTENになっているか確認する。

% netstat -nat|egrep '(Proto|:80)'
Proto 受信-Q 送信-Q 内部アドレス            外部アドレス            状態      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     

WebブラウザでlocalhostにアクセスできればOKである。

initスクリプト設置

% sudo install -o root -g root -m 755 /usr/local/apache2/bin/apachectl /etc/init.d/apache

% sudo update-rc.d apache defaults 85 15