計算機メモ目次 (目的のページと内容が一致しない場合, 目次から探してください)

FreeBSD 4.11-RELEASE 上で Apache 2.0.55 を構築する


必要なもの
  httpd-2.0.55.tar.gz
  OpenSSL (mod_ssl 用)

ソース修正
  modules/proxy/proxy_ftp.c の次のような仕様を下記のパッチで修正
  (mod_proxy_ftp モジュールを使用しないのなら修正の必要なし)
    空白を含むファイル名やディレクトリ名を正しくパースしてくれない.
    TYPE I (バイナリモード) で SIZE の返り値が 0 になると Content-Length: 0
    というヘッダを作成してしまう.
    ファイル名やディレクトリ名に ASCII コードしか許してくれない.

*** proxy_ftp.c.orig	Thu Jan 19 13:19:16 2006
--- proxy_ftp.c	Thu Jan 19 17:13:17 2006
***************
*** 180,187 ****
--- 180,189 ----
      path = ap_proxy_canonenc(p, url, strlen(url), enc_path, r->proxyreq);
      if (path == NULL)
          return HTTP_BAD_REQUEST;
+ /*
      if (!ftp_check_string(path))
          return HTTP_BAD_REQUEST;
+ */
  
      if (r->proxyreq && r->args != NULL) {
          if (strp != NULL) {
***************
*** 506,514 ****
  
          /* a directory/file? */
          else if (ctx->buffer[0] == 'd' || ctx->buffer[0] == '-' || ctx->buffer[0] == 'l' || apr_isdigit(ctx->buffer[0])) {
!             int searchidx = 0;
              char *searchptr = NULL;
!             int firstfile = 1;
              if (apr_isdigit(ctx->buffer[0])) {  /* handle DOS dir */
                  searchptr = strchr(ctx->buffer, '<');
                  if (searchptr != NULL)
--- 508,516 ----
  
          /* a directory/file? */
          else if (ctx->buffer[0] == 'd' || ctx->buffer[0] == '-' || ctx->buffer[0] == 'l' || apr_isdigit(ctx->buffer[0])) {
!             static int searchidx = 0;
              char *searchptr = NULL;
!             static int firstfile = 1;
              if (apr_isdigit(ctx->buffer[0])) {  /* handle DOS dir */
                  searchptr = strchr(ctx->buffer, '<');
                  if (searchptr != NULL)
***************
*** 1508,1514 ****
              for (j = 0; apr_isdigit(ftpmessage[j]); j++)
                  ;
              ftpmessage[j] = '\0';
!             if (ftpmessage[0] != '\0')
                   size = ftpmessage; /* already pstrdup'ed: no copy necessary */
          }
          else if (rc == 550) {    /* Not a regular file */
--- 1510,1516 ----
              for (j = 0; apr_isdigit(ftpmessage[j]); j++)
                  ;
              ftpmessage[j] = '\0';
!             if (ftpmessage[0] != '\0' && ! (ftpmessage[0] == '0' && ftpmessage[1] == '\0'))
                   size = ftpmessage; /* already pstrdup'ed: no copy necessary */
          }
          else if (rc == 550) {    /* Not a regular file */


コンフィグレーション
  ./configure --enable-mods-shared=all --enable-ssl \
    --enable-proxy --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http \
    --enable-suexec --with-suexec-safepath=/usr/local/bin:/usr/bin 

ビルド
  make

  注意: シンボリックリンクを張ったディレクトリ上でビルドを行なってはいけない

インストール
  make install

設定
  httpd.conf と ssl.conf をサイトにあわせて変更する.
  httpd.conf において変更するべき主なディレクティブ:
    User
    Group
    ServerAdmin
    ServerName
    DocumentRoot
    <Directory "$DocumentRoot"> の Options (Indexes を外して MultiViews 追加)
    DirectoryIndex (MultiViews を使うので index のみとする)
    ScriptAlias
    AddDefaultCharset (HTML ヘッダの meta タグで文字セットを指定したいので Off にする)

注意
  SSL 用のキャッシュファイルの書き込みが User で設定されたユーザの権限で
  行われるようになっている. そのため, そのユーザが書き込めるよう, ログ用
  ディレクトリ (logs) の書き込み属性を設定しておくか, あるいは空のファイル
  logs/ssl_scache.dir および logs/ssl_scache.pag [dbmの場合] を作っておいて
  当該ユーザに書き込み権限を与えておくか, どちらかしないと httpd が起動しない.


計算機メモ目次 (目的のページと内容が一致しない場合, 目次から探してください)
海洋大循環分野
daigo@ocg.aori.u-tokyo.ac.jp