Apache

Apache(ssl版)

RingServer では Apache は /pub/net/apache/dist/httpd/, 
OpenSSL は /pub/net/openssl/source/, mod_ssl は 
/pub/net/www/mod_ssl/source/, PHP は /pub/net/www/php/distributions/ にある。
(マルチバイト対応[日本語]版は http://nxweb.dyndns.org:8080/php-i18n-download.html にある)

cd openssl-0.9.6d
./config
make
make test
make install
cd ../mod_ssl-2.8.10-1.3.26
./configure --with-apache=../apache_1.3.26
cd ../apache_1.3.26
OPTIM="-O2" SSL_BASE=../openssl-0.9.6d ./configure \
  --prefix=/usr/local/apache1326 --enable-module=so \
  --enable-module=ssl --enable-shared=ssl
makeをするとき以下の場合より引数を変える
# 証明書がない場合
make certificate TYPE=custom
# 証明書がある場合はそのパスを指定する
make certificate TYPE=existing CRT=/usr/local/ssl/certs/cert.pem KEY=/usr/local/ssl/private/key.pem
make install
cd ../php-4.2.1
./configure --with-apxs=/usr/local/apache1326/bin/apxs \
    --with-pgsql --without-mysql \
    --enable-mbstring \  (*1)
    --enable-mbstr-enc-trans \  (*2)
    --enable-mbregex  (*3)

(1)マルチバイト文字列関数(mbstring)をサポートする
(2)mbstring変換エンジンを使用したHTTP入力の文字エンコーディング変換を有効にする。
(3)マルチバイト対応正規表現ライブラリ(mbregex)をサポートする

make
make install
cp php.ini-recommended /usr/local/lib/php.ini

make certificate TYPE=custom ではいろいろなことが聞かれますので
適当に答えます。次は一例です。 

Step 2: 

1. Country Name             (2 letter code) [XY]:JP
2. State or Province Name   (full name)     [Snake Desert]:Mie Pref
3. Locality Name            (eg, city)      [Snake Town]:Ise
4. Organization Name        (eg, company)   [Snake Oil, Ltd]:xxx University
5. Organizational Unit Name (eg, section)   [Certificate Authority]:
6. Common Name              (eg, CA name)   [Snake Oil CA]:xxx University
7. Email Address            (eg, name@FQDN) [ca@snakeoil.dom]:webmaster@xxx.ac.jp
8. Certificate Validity     (days)          [365]:

Step 5: 

1. Country Name             (2 letter code) [XY]:JP
2. State or Province Name   (full name)     [Snake Desert]:Mie Pref
3. Locality Name            (eg, city)      [Snake Town]:Ise
4. Organization Name        (eg, company)   [Snake Oil, Ltd]:xxx University
5. Organizational Unit Name (eg, section)   [Webserver Team]:
6. Common Name              (eg, FQDN)      [www.snakeoil.dom]:www.xxx.ac.jp *
7. Email Address            (eg, name@fqdn) [www@snakeoil.dom]:webmaster@xxx.ac.jp
8. Certificate Validity     (days)          [365]:

* 実際にSSLを運用するホストのFQDNとする。 

このようにすると,ブラウザには次のように表示されます: 

This Certificate belongs to:
 www.xxx.ac.jp
 webmaster@xxx.ac.jp
 Webserver Team
 xxx University
 Ise, Mie Pref, JP

This Certificate was issued by:
 xxx University
 webmaster@xxx.ac.jp
 Certificate Authority
 xxx University
 Ise, Mie Pref, JP

/usr/local/apache/bin/apachectl startssl

と打ち込むとパスワードを聞かれます。黙って起動させるには,
make certificate で最後に 
Encrypt the private key now? [Y/n]: n


PHP 4.2 以降

以下の設定は /usr/local/lib/php.ini で行います。 

register_globals = Off がデフォルトになりました。
従来のようにグローバル変数を使うには register_globals = On 
にしておきます(ただしセキュリティ上問題が起きやすくなります)。 

display_errors = Off がデフォルトになりました。エラーメッセージ
を表示させるには display_errors = On とします。ついでに 
error_prepend_string,error_append_string を設定しておけばエラー
を赤で表示するといったことができます。 

error_reporting = E_ALL がデフォルトになりました。未定義の変数に
ついて警告を出してほしくなければ error_reporting = E_ALL & ~E_NOTICE 
にします。 

error_prepend_string = "<font color=ff0000>"
エラーの文字の色を指定する。

session.use_trans_sid = 1
透過的なセッション IDの付加をするかどうかを指定します。1が有効で、クッキーが
クライアントでOFFのときURLにセッションIDを付加する。

mod_gzipのインストール

# /usr/local/apache//bin/apxs -i -c mod_gzip.c
gcc -O2 -DLINUX=22 -DMOD_SSL=208110 -DUSE_HSREGEX -DEAPI -DUSE_EXPAT -I../lib/expat-lite -fpic -DSHARED_MODULE -I/usr/local/apache1326/include  -c mod_gzip.c
gcc -shared -o mod_gzip.so mod_gzip.o
cp mod_gzip.so /usr/local/apache1326/libexec/mod_gzip.so
chmod 755 /usr/local/apache1326/libexec/mod_gzip.so

でlibexec/mod_gzip.soができていればOK

httpd.confに

AddModule mod_php4.c
AddModule mod_gzip.c  <------追加


LoadModule gzip_module        libexec/mod_gzip.so


  mod_gzip_on Yes
  mod_gzip_dechunk yes
  mod_gzip_temp_dir /var/tmp
  mod_gzip_keep_workfiles No
  mod_gzip_can_negotiate Yes
  mod_gzip_minimum_file_size 1024
  mod_gzip_maximum_file_size 0
  mod_gzip_maximum_inmem_size 1000000
  mod_gzip_item_include file \.htm$
  mod_gzip_item_include file \.html$
  mod_gzip_item_include file \.php$
  mod_gzip_item_include file \.pl$
  mod_gzip_item_include mime ^text/.*
  mod_gzip_item_include mime ^application/x-httpd-php
  mod_gzip_item_include mime ^httpd/unix-directory
  mod_gzip_item_exclude mime ^image/.*


(中略)


  LogFormat "%h %l %u %t \"%r\" %>s %b \"%!!GET VALUE ERROR!!i\" \"%{User-Agent}i\" %{mod_gzip_input_size}n" combined


CustomLog /usr/local/apache/logs/access_log combined <--はじめから存在している

を追加

10.1.4.197 - center [08/Oct/2002:12:50:46 +0900] "GET /~okada/yotei/show.php 
HTTP/1.1" 200 922 "http://uso5001.matsusaka-u.ac.jp/~okada/yotei/" "Mozilla/
       出力サイズ
4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 2359
                                            入力サイズ
のようなlogがのこる

* mod_gzip Apache 設定記述子

NOTE: このドキュメントはmod-gzip version 1.3.19.1a (以降) 
に適用されます。

* mod_gzip の情報を Apache のログに追加するには

mod_gzip は Apache の 'notes' メソッドを使い、既に存在する 
access.log ファイルに情報を追加できるようにします。

下記の 'LogFormat' は、圧縮率のみを表示します。もし、
ファイルが圧縮されなかったときは '-' か '0' が圧縮率の
代わりに表示されます...

LogFormat "%h %l %u %t \"%r\" %>s %b
mod_gzip: %{mod_gzip_compression_ratio}npct."
common_with_mod_gzip_info1

下記の特別な 'LogFormat' は、圧縮されたファイルに関する
全ての詳細を表示します...

LogFormat "%h %l %u %t \"%r\" %>s %b
mod_gzip: %{mod_gzip_result}n
In:%{mod_gzip_input_size}n
Out:%{mod_gzip_output_size}n:%{mod_gzip_compression_ratio}npct."
common_with_mod_gzip_info2

実際に何らかの 'LogFormat' を使用したい場合は、
'CustomLog' エントリへ下記の Apache の記述子を用いて
記述しなければなりません。

CustomLog logs/access.log common_with_mod_gzip_info2

警告: もし、'CustomLog' エントリが 2 つ以上ある場合は、
1 回のページリクエストにつき、 2 つ以上のログエントリが
残されます。もし、複数のログエントリを残したいのでなければ、
httpd.conf ファイルの中に 'CustomLog' エントリを 1 つ以上
書かないようにしてください。

'LogFormat' や 'CustomLog' についての詳しい情報は、
Apache ドキュメントを参照してください。


* mod_gzip の設定記述子

以下は、Apache の httpd.conf に追加できる、 mod_gzip の設定記述子です。

mod_gzip_on [Yes/No]
Yes=mod_gzip を有効にします。
No =mod_gzip を無効にします。

mod_gzip_add_header_count [Yes/No]
Yes=ヘッダーのバイト数もログに出力する合計バイト数に含めます。

mod_gzip_keep_workfiles [Yes/No]
Yes=一時ファイルを残します。
No =一時ファイルを完了時に自動的に削除します。
デバッグ時のみ 'Yes' にしてください。

mod_gzip_dechunk [Yes/No]
Yes=必要なときに 'Transfer-encoding: chunked' を取り除くようにします。
PHP4 や ColdFusion のような、Certain 'Back-end' なCGI処理系は、常に
'Transfer-Encoding: chunked' を返してきます。このようなデータを
圧縮する場合は、必要なときに mod_gzip が 'Transfer-Encoding: chunked'
を取り除けるように、この設定を 'Yes' にすべきです。

mod_gzip_min_http [ 1000 or 1001 or ???? ]
最低限サポートするHTTPプロトコルを指定します。
(1000 = HTTP/1.0, 1001 = HTTP/1.1)
もし、ブラウザー(もしくは User-Agent )のプロトコルがこの値に
達しない場合、圧縮されたデータは転送されません。
この設定は Apache 自身によって使われる数字のプロトコル番号と
同じ値を使います。

mod_gzip_minimum_file_size [bytes]
圧縮すべきファイルサイズの最小値を指定します。

mod_gzip_maximum_file_size [bytes]
圧縮すべきファイルサイズの最大値を指定します。

mod_gzip_maximum_inmem_size [bytes]
圧縮に使用してもいいメモリサイズの上限を指定します。

mod_gzip_temp_dir [Win32=c:\pathname UNIX=/pathname]
一時ファイルやキャッシュに使用するディレクトリを指定します。

ディレクトリは既に存在して、サーバーの user/group が正しく
読み書きできる権限を持っていなければなりません。

パスの最後には '/' を付けないでください。

記述されていなければ、デフォルトで Windows の場合は "c:\temp" 、
UNIX の場合は "/tmp" が使用されます。

mod_gzip_item_include ARG1 ARG2
ARG1=[mime,handler,file,uri,reqheader,rspheader]
ARG2=[圧縮すべきファイル名を指定します]

mod_gzip_item_exclude ARG1 ARG2
ARG1=[mime,handler,file,uri,reqheader,rspheader]
ARG2=[圧縮すべきでないファイル名を指定します]

mod_gzip_command_version [string]
mod_gzipのバージョンコマンドに使う、ユーザー定義の文字列を指定します。

mod_gzip_can_negotiate [Yes/No]
Yes=チェックし、静的に圧縮されたファイルを送出します
No =チェックしません。


以下のコマンドはサポートされていません。

mod_gzip_add_vinfo
mod_gzip_do_static_files
mod_gzip_do_cgi
mod_gzip_verbose_debug
mod_gzip_post_on

Digest 認証のモジュールの追加

IE6のバグ?

ページアクセス時にxxx.php?data=abcのような変数渡しをするとdigest
認証でエラーする。(IE6のバグ?)
error_log
[Mon Apr 19 08:46:17 2004] [error] [client 10.99.99.100] Digest: uri \
mismatch - </~okada/yotei/edit.php> does not match request-uri \
</~okada/yotei/edit.php?date=2004:04:05:okada:okada:0>
こんなエラーが出る。

そこでmod_auth_digest.cの
1686行目くらいを以下のように修正する。

                    && d_uri.path[0] == '*' && d_uri.path[1] == '\0'))
#ifdef  NOT_FOR_ME    <---追加
           /* check that query matches */
            || (d_uri.query != r_uri.query
                && (!d_uri.query || !r_uri.query
                    || strcmp(d_uri.query, r_uri.query)))
#endif <---追加
            ) {
            ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
                          "Digest: uri mismatch - <%s> does not match "
                          "request-uri <%s>", resp->uri, resp-&gy;raw_request_uri)

	(略)
              }

ここから本来のインストール

$ cd apache_1.3.28/src/modules/experimental

$ /usr/local/apache1328/bin/apxs  -c -D DEV_RANDOM mod_auth_digest.c
gcc -O2 -DLINUX=22 -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -fpic \
-DSHARED_MODULE -I/usr/local/apache1328/include -DDEV_RANDOM  -c \
mod_auth_digest.c
gcc -shared -o mod_auth_digest.so mod_auth_digest.o

$ ls
Makefile.tmpl      mod_auth_digest.o    mod_mmap_static.c
mod_auth_digest.c  mod_auth_digest.so*
$ su
# /usr/local/apache1328/bin/apxs -i mod_auth_digest.so
cp mod_auth_digest.so /usr/local/apache1328/libexec/mod_auth_digest.so
chmod 755 /usr/local/apache1328/libexec/mod_auth_digest.so

これで
/usr/local/apache1328/libexec/に
mod_auth_digest.soが入る

httpd.confに
230行目くらいに
LoadModule  digest_auth_module libexec/mod_auth_digest.so
262行目くらいに(すべてのLoadModuleの記述の後に入れる必要がある)
AddModule mod_auth_digest.c
を追加

(以下を確認)
<Directory />
#    AllowOverride None
    AllowOverride All
</Directory>

<Directory "/usr/local/apache1328/htdocs">
##    AllowOverride None
    AllowOverride All

</Directory>


パスワードの作成
$ /usr/local/apache1328/bin/htdigest -c /home/okada/hogehoge/htdtpsswd ism abc
                                                                       ^^^(1)

.htaccessに以下のように設定

<Limit HEAD GET POST>
        AuthDigestFile /home/okada/hogehoge/htdtpsswd
        AuthName ism  <---(1)にあわせる
        AuthType Digest
        Require valid-user
</Limit>


追加でなくはじめからインストールのときは./configureのとき
--enable-module=auth_digest
を追加しておけばよい
(このときは組み込まれためapache/libexec/mod_auth_digest.soはない。
よってhttpd.confにもLoadModule  digest_auth_module libexec/mod_auth_digest.so
の記述は不要)

確認

$ ./httpd -l
Compiled-in modules:
  http_core.c
  mod_env.c
  mod_log_config.c
  mod_mime.c
  mod_negotiation.c
  mod_status.c
  mod_include.c
  mod_autoindex.c
  mod_dir.c
  mod_cgi.c
  mod_asis.c
  mod_imap.c
  mod_actions.c
  mod_userdir.c
  mod_alias.c
  mod_access.c
  mod_auth.c
  mod_auth_digest.c   <--ここ
  mod_so.c
  mod_setenvif.c
suexec: disabled; invalid wrapper /usr/local/apache1331/bin/suexec

Log ローテーション and Status

httpd.confを変更

ローテーションを時間で指定(24時間ごと)
TransferLog "| /usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log 86400"

出来るファイルは
-rw-r--r--    1 root     root         2848 Dec  5 21:59 access_log.1070582400
-rw-r--r--    1 root     root         4331 Dec  5 22:20 access_log.1070629200

logs/access_log.nnnnn
nnnnnはシステム時間

ステータス表示は
http://www.xxx.ne.jp/server-status
でアクセス

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from .matsusaka-u.ac.jp <--アクセス可能アドレスを指定。
    Allow from 219.109.252.82
</Location>

ページアクセス時のエラーページの表示について

authreq.php ,forbidden.php, missing.phpなどエラー時に表示するページ
を作成し、それぞれのエラーコードで表示させるには

httpd.confの941行目あたりに

ErrorDocument 401 /authreq.php
ErrorDocument 403 /forbidden.php
ErrorDocument 404 /missing.php

と記述する。