インストールメモ:Cygwin + Apache on Windows 2000

2004年1月。
ローカル環境の HTTP サーバとして、 これまでは Windows 版 Apache を使っていたが、 これを Cygwin + Apache (Cygwin版) に変更した。
若干難儀した箇所があったので自分用にメモ。 (一応自分用だけどヘンなところが冗長。その割にところどころ情報不足)

追記: ここでは Apache 1.3 について記述してある。 Apache 2 (2.2) の場合はまた若干手順が違うので 「インストールメモ:Cygwin + Apache2 on Windows XP」 の方 (に書いてある参照サイト達) を参照のこと。

相変わらずウソを書いてる可能性があるのでご注意。

参照サイト


0. Apache の Windows版と Cygwin版の (ユーザから見た) 違い

Windows版の場合、設定ファイル (httpd.conf、 .htaccess) や CGI などのパス記述にドライブレター (C: など) が必要だが、 Cygwin版の場合はこれが不要。 なので、 HTML コンテンツを UNIX 上の Web サーバにアップロードする前にローカルでチェックしたい、 などの用途には Cygwin版 Apache の方がなにかと便利。 (特に CGI の動作もローカルでチェックできるのとできないのの差は大きい、と思う)
これが今回 Windows版から Cygwin版に乗り換えた最大 (かつ唯一?) の理由。

追記: Cygwin版 Apache の CGI からは、 ドライブレター付パスもちゃんと認識される模様。 う〜ん…なんかちゃんと把握してなかった。 例えば Cygwin の bash 上から「cd c:/」と入れると、 ちゃんと「/cygdrive/c/」に移動するんだ。 ずっと Cygwin からはドライブレターは使えないモノと思い込んでいた…。(^^;

ただ Windows版は普通にインストールして起動させれば、 あとは Windows 起動時に自動的にサービスが起動するようになるが、 Cygwin版の場合は別途 cygrunsrv というプログラムが必要。
cygrunsrv を使うこと自体大した手間ではないが、 この形での「Windows のサービスへの登録」にはちょっとクセがあるようなのでそこんとこだけ注意。
なお cygrunsrv は Cygwin の setup からインストールできる。

1. Windows版 Apache の削除

既に Windows用 Apache がインストール・動作している場合はサービスを止めてアンインストールしとく。

2. Cygwin版 Apache と cygrunsrv のインストール

Cygwin 用の setup.exe で最新版をインストール。
Cygwin版 Apache の最新版のバージョン番号は一般的 (?) にリリースされているものより古いが、 セキュリティ面の手当てなどは済んでいるので心配無用、らしい…。

3. cygrunsrv について (ちょびっと)

cygrunsrv --help の出力。↓

Usage: cygrunsrv [OPTION]...

Main options: Exactly one is required.
  -I, --install <svc_name>  Installes a new service named <svc_name>.
  -R, --remove <svc_name>   Removes a service named <svc_name>.
  -S, --start <svc_name>    Starts a service named <svc_name>.
  -E, --stop <svc_name>     Stops a service named <svc_name>.
  -Q, --query <svc_name>    Queries a service named <svc_name>.

Required install options:
  -p, --path <app_path>     Application path which is run as a service.

Miscellaneous install options:
  -a, --args <args>         Optional string with command line options which
                            is given to the service application on startup.
  -c, --chdir <directory>   Optional directory which will be used as working
                            directory for the application.
  -e, --env <VAR=VALUE>     Optional environment strings which are added
                            to the environment when service is started.
                            You can add up to 255 environment strings using
                            the `--env' option.
                            Note: /bin is always added to $PATH to allow all
                            started applications to find at least cygwin1.dll.
  -d, --disp <display name> Optional string which contains the display name
                            of the service. Defaults to service name.
  -f, --desc <description>  Optional string which contains the service description.
  -t, --type [auto|manual]  Optional start type of service. Defaults to `auto'.
  -u, --user <user name>    Optional user name to start service as.
                            Defaults to SYSTEM account.
  -w, --passwd <password>   Optional password for user. Only needed
                            if a user is given. If a user has an empty
                            password, enter `-w '. If a user is given but
                            no password, cygrunsrv will ask for a password
                            interactively.
  -s, --termsig <signal>    Optional signal to send to service application
                            when service is stopped.  <signal> can be a number
                            or a signal name such as HUP, INT, QUIT, etc.
                            Default is TERM.
  -y, --dep <svc_name2>     Optional name of service that must be started
                            before this new service.  The --dep option may
                            be given up to 16 times, listing another dependent
                            service each time.
  -0, --stdin <file>        Optional input file used for stdin redirection.
                            Default is /dev/null.
  -1, --stdout <file>       Optional output file used for stdout redirection.
                            Default is /var/log/<svc_name>.log.
  -2, --stderr <file>       Optional output file used for stderr redirection.
                            Default is /var/log/<svc_name>.log.
  -o, --shutdown            Stop service application during system shutdown.
  -i, --interactive         Allow service to interact with the desktop.

Informative output:
  -h, --help                print this help, then exit.
  -v, --version             print cygrunsrv program version number, then exit.

cygrunsrv でキックするアプリケーションは、 デーモンを fork せずそのまま動作するプロセスとして起動する必要があるらしい。 Apache の場合、 -k オプションをつけて起動する。
2004-2-16 追記 : apache 1.3.29-2 でのオプション変更 "-k" -> "-F" (2004.02.13) (Discypus.jp Wiki Cygwin/apache) によると、 Cygwin 版 Apache 1.3.29-1 以降では -k のかわりに -F を使うよう仕様が変更になったとのこと。 (元々 -k は Cygwin版 Apache 独自の起動オプションだったそうで、 本家で同機能のオプションが -F としてサポートされたんでそっちに合わせるようになったらすぃ)

4. Apache の設定

httpd.conf を適宜編集。 Apache がエラーなくちゃんと起動し、サーバとして動作することを確認する。 (「apachectl start」「apachectl stop」を使用)

5. Apache の自動起動設定

Cygwin の shell (bash) 上から、 cygrunsrv で Apache を Windows のサービスに登録する。

cygrunsrv -I apache -p /usr/sbin/httpd -a -k

(↑前出の理由により、 Apache 1.3.29-1 以降では -k のかわりに -F を使用のコト)

apache”は登録したいサービス名 (テキトー) 。
/usr/sbin/httpd”は Cygwin版 Apache のデフォルトの (Cygwin 上から見た) インストール先。
-k” (Apache 1.3.29-1 以降は “-F”) は Apache をデーモンではなく通常プロセスとして起動させるための (Apache の) オプション。

6. サービス登録の確認

Windows の「コントロールパネル」→「管理ツール」→「サービス」を開き、 「apache」のサービス名でデーモン (つーかサービス) が登録されて動いていることを確認。

7. ちゃんと動かねー場合

apachectl start」では問題なく起動するのに、 5. の段階で「cygrunsrv 〜」ではちゃんと起動せずエラーメッセージを吐き出して終了しちゃう場合。
基本的には、エラーログ /cygwin/var/log/apache/error_log (← httpd.conf のデフォルト設定ではこのパス・ファイル名) や、 Windows の「イベント ビュア」→「アプリケーションログ」などを見てエラーの原因を探す。

対策1
httpd.conf に
User Guest
Group Guests

を追加する。
対策2
Cygwin から見て、 /var/log/apache/access_log (ファイル名は httpd.conf での設定によって別名の場合あり) のパーミッションが、 644 になっていたりすると書き出しができないらしいので、 これを 666 に設定する。 (chmod +w /var/log/apache/access_log)

ワシの場合、以上の 2点でとりあえずちゃんと起動するようになった。

logrotate などを使ってログを随時入れ換える場合などは、 ログファイルのパーミッションはどうすればいいのかとか別に対処しなくてもいいのかとか、 そのへんのことはちゃんと追求していないが、 まァ外部公開用ではない (localhost からしかアクセスしない) サーバなので、 大してログもたまらないし、 サービスをいつ止めても誰も困らないので、 適宜手動で削除するなりなんなりしてその都度テキトーに対処予定。

以上。


いっこ戻る