カテゴリー
Windows

本家のお世話-#28。(Apache2.4.2へアップグレード-#1)

投稿アップデート情報  追記3(4/28)  追記4(5/2)  追記5(11/10)  追記6(2013/1/3)

 Apache Loungeで,Apache2.4.x系ステイブルが出た(VC10版は,6 Apr ’12 だけど,VC9版は,7 Apr ’12 になっている。UTCで,です。)ので,早速アップグレードに取り組んでみることにした。ただし,さすがに稼働中のサーバ上では危なすぎるので,ひとまず,ローカルに仮構築。

 完了後は,以下のようになる。

  • WindowsXP Pro SP3(x86)
  • Apache2.4
  • MySQL5.5
  • ActivePerl5
  • PHP5.4

 ≪注意≫ ローカルの構築なので,アップロード作業がすっぽり抜けている。ここを参考に実際のサーバをリモート場所に構築しようと思う方は,ファイルの書き換え後の更新アップロードを忘れないようにしてください。

 さて,Apache2.4.x系のインストールから。

  1. httpd-2.4.2-win32.zip と httpd-2.4.2-win32-VC9.zip のどっちを使うかなと思ったが,後者はMicrosoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86)をインストールしなくていいようなので,こちらを使うことにする。httpd-2.4.2-win32-VC9.zipをダウンロード。
  2. httpd-2.4.2-win32-VC9.zip を展開する。展開ファイル中のReadMe.txtに,「Upgrading to 2.4 from 2.2Overview of new features in Apache HTTP Server 2.4を参照せよ」とあったので,一応見に行った。
    Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)のインストールは必須であるが,今回の環境においては既に済んでいる。
  3. httpd.conf のカスタマイズから行う。
    • ServerRoot は,Program Files下に変更せず,デフォルトのまま(つまり,c:/Apache24)。自鯖は,WindowsXPなので問題ないが,Windows7あたりでは,UAC(User Account Control)の関係でいろいろと不具合を聞くので,この際今後のことを考えて,デフォルトのままの設定で行こうと思う。
    • ServerAdmin <管理者のメールアドレス> に変更。
    • ServerName <DNS name>:80
    • カスタマイズには関係ないが,以下のところに注意。Apacheのインストールが初めてなら何も思わないだろうが,ここはRun-Time Configuration の変更に伴って書き方の変わったところのひとつだ。ただし,旧の書き方をしている場合でもmod_access_compatによって,下位互換が実現されるらしい。モジュールのところを見ると,
      LoadModule access_compat_module modules/mod_access_compat.so
      はデフォルトで有効になっており,モジュール群のうち一番初めにロードされるようになっている。

      新しい書き方は,以下の通り。
           <Directory />
             AllowOverride none
             Require all denied
           </Directory>

      Apache2.2では,以下のようになっていた。
           <Directory />
             Options FollowSymLinks
             AllowOverride None
             Order deny,allow
             Deny from all
           </Directory>

    • DocumentRoot “c:/Apache24/htdocs”  —>>  DocumentRoot “G:/WEB/example”
      <Directory “c:/Apache24/htdocs”>  —>>  <Directory “G:/WEB/example”>
    • Options Indexes FollowSymLinks  —>>  Options FollowSymLinks
    • AllowOverride None  —>>  AllowOverride directive-type
      directive-typeに使えるキーワードについては,AllowOverride ディレクティブを参照のこと。
    • 自鯖の場合は,rotatelogsを使って,ログを取っているので,
      ErrorLog “logs/error.log”  —>>  ErrorLog “|bin/rotatelogs -l -f logs/error.%Y-%m-%d 86400”
      アクセスログに関しては,AWStatsの関係上commonではなくcombinedを使うので,
      CustomLog “logs/access.log” common  —>>  コメントアウト
      CustomLog “logs/access.log” combined  —>>  アンコメント
      し,さらに,
      CustomLog “logs/access.log” combined  —>>  CustomLog “|bin/rotatelogs -l -f logs/access.%Y.%m.%d 86400” combined env=!no_log
      no_logについては,「本家のお世話-#4。」参照。

      ちょっと下に書いてあるが,テストランの結果,|bin/rotatelog は |bin/rotatelog.exe でないと動かないことが判明。使う場合は必ず拡張子をつけてください。

    • これも,カスタマイズとは関係ないが,
      # Configure mod_proxy_html to understand HTML4/XHTML1
      <IfModule proxy_html_module>
      Include conf/extra/proxy-html.conf
      </IfModule>
      が追加されている。
  4. ディレクトリ Apache24 を,そっくり C:直下に移動する。
  5. コマンドプロンプトを起動し,Apache24bin に移動して,テストラン。httpd.exe[Enter]
    (OS 2)指定されたファイルが見つかりません。 : AH00089: Couldn’t start ErrorLog p
    rocess ‘bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M’.
    AH00015: Unable to open logs
    というエラーが出る。パイプがうまく働いていないのかと思って,
    ErrorLog “C:/Apache24/bin/rotatelogs -l -f C:/Apache24/logs/error.%Y-%m-%d 86400”
    にしてみた。今度は,
    AppName: httpd.exe AppVer: 2.4.2.0 ModName: msvcr90.dll
    ModVer: 9.0.30729.6161 Offset: 0003bdbc
    が出る。いろいろ試してみて,正解はなんと rotatelogs.exe だった。つまり,2.2.22 までは拡張子なしで通っていたのだが,2.4.2 では .exe まで書かないとダメってこと。
    つまり,  ErrorLog “|bin/rotatelogs.exe -l -f logs/error.%Y-%m-%d 86400″  でO.K.
    えーーーーーーーーっ。こんなにハマったのに!!(号泣)
  6. 気を取り直して,サービスとして登録。
    httpd.exe -k install
    使い勝手のために,ApacheMonitor.exe のショートカットを作り,スタートアップフォルダに入れておく。
  7. ドキュメントルートに,Apache24/htdocs にある index.html をコピーし,ブラウザから,http://localhost/ を確認,無事「It works!」が表示された。

 MySQL5.5 をインストールする。

  1. MySQL Community Server から,mysql-5.5.22-win32.msi をダウンロード。
    えーっと,今気が付いたんだが,「JavaScript 有効」にしておくと「» No thanks, just take me to the downloads!」というリンクが表示され,これをクリックすると,各ミラーがわかるって形なのねぇー。いつものPCは,「JavaScript 無効」なので知らなんだ。
  2. インストール方法は,mysql-5.5.18-win32.msi と全く同じ。(MySQLの再導入を参照)

 次に,ActivePerl 5 をインストールする。

  1. ActivePerl-5.14.2.1402-MSWin32-x86-295342.msiをダウンロードする。
    途中に,チェックボックスがあるがすべてデフォルトのままでインストール。
  2. コマンドラインから, perl.exe -v[Enter]で,バージョンなどが表示されれば,インストール成功。pathも通っている。
  3. Apache の httpd.conf を開き,
    ScriptAlias /cgi-bin/ “c:/Apache24/cgi-bin/”  —>>  ScriptAlias /cgi-bin/ “G:/WEB/cgi-bin/”
    <Directory “c:/Apache24/cgi-bin”>  —>>  <Directory “G:/WEB/cgi-bin”>
    この後のところも,Run-Time Configuration の変更に伴い書き方が変わっている。
    cgi-bin 以外のディレクトリで CGI スクリプトを使う気がある場合は, #AddHandler cgi-script .cgi をアンコメントし,場合によっては .pl を追加するなどする必要がある。
    自鯖では,そのつもりがないのでデフォルトのまま。
  4. G:/WEB/cgi-bin に,Apache24/cgi-bin にある printenv.pl をコピーし,テキストエディタで1行目を perl.exe の場所に書き換える。
    #!D:/programs/perl/bin/perl.exe  —>>  #!c:/perl/bin/perl.exe
  5. Apacheを再起動後,ブラウザから,http://localhost/cgi-bin/printenv.pl を確認。環境が表示されれば,成功。 printenv.pl は削除しておく。

 さて,PHP5.4のインストールに入る。Apache2.4.xとの連携はうまくいくだろうか。ここのブログを読んでくれてる方はご存知の通り,アップデートに失敗したまま,放置プレイである。もっとも,うまく動いてくれるかどうかのチェックは,仮構築では無理な気がする。本鯖の場合も,短時間の稼働ではエラーは出なかったし。

  1. http://windows.php.net/ からphp-5.4.0-Win32-VC9-x86.zipをダウンロードし,ファイルを展開する。
  2. 展開ファイル内の php.ini-production を php.ini にリネームし,下表のようにカスタマイズ。
      デフォルト カスタム
    1 ;default_charset = "UTF-8" default_charset = "UTF-8"
    2 ; extension_dir = "ext" extension_dir = "(ドライブ文字):PHPext"
    3 allow_url_fopen = On allow_url_fopen = Off
    4 ;extension=php_curl.dll extension=php_curl.dll
    5 ;extension=php_gd2.dll extension=php_gd2.dll
    6 ;extension=php_mbstring.dll extension=php_mbstring.dll
    7 ;extension=php_mysql.dll extension=php_mysql.dll
    8 ;extension=php_mysqli.dll extension=php_mysqli.dll
    9 ;extension=php_openssl.dll extension=php_openssl.dll
    10 ;date.timezone = date.timezone ="Asia/Tokyo"
    11 ;sendmail_from = me@example.com sendmail_from = 自分のメールアドレス
    12 ;mbstring.language = Japanese mbstring.language = Japanese
    13 ;mbstring.internal_encoding = EUC-JP mbstring.internal_encoding = UTF-8
    14 ;mbstring.http_input = auto mbstring.http_input = pass
    15 ;mbstring.http_output = SJIS mbstring.http_output = pass
    16 ;mbstring.encoding_translation = Off mbstring.encoding_translation = Off
    17 ;mbstring.detect_order = auto mbstring.detect_order = UTF-8,ASCII,SJIS,EUC-JP,JIS
    18 ;mbstring.substitute_character = none mbstring.substitute_character = none

    14-18 に関しては,デフォルトのままでも動くと思う。特に,17に関しては,自鯖の環境でこうしているので,参考にされる場合は各自対処してください。

  3. 展開時のフォルダ名を PHP にリネームし,そっくり C:直下に移動する。
  4. Apacheが2.4.x になったので,php5apache2_x.dll が変更になる。Apache Lounge から php5apache2_4.dll-php-5.4-win32.zip をダウンロードし,展開後,出来たディレクトリ内の php5apache2_4.dll を PHP 直下に移動する。
         PHP5.4.10 から php5apache2_4.dll も PHP のオフィシャルバイナリに
         同梱されるようになった(12/28追記)
  5. php5apache2_4.dll に同梱の ReadMe.txt に従い,Apache の httpd.conf の LoadModule の一番最後に
    LoadModule php5_module “c:/php/php5apache2_4.dll”
    を追加。PHP のインストールディレクトリ名について,大文字,小文字が入り乱れているが,Windowsは大小を区別しないので,無問題。気になる場合は,自分のインストール環境にそろえてください。
    AddHandler application/x-httpd-php .php
    PHPIniDir “C:/PHP”
    については,httpd.conf の末尾に以下の形で追加。
         <IfModule mod_php5.c>
           AddHandler application/x-httpd-php .php
           PHPIniDir “C:/PHP”
         </IfModule>
    AddType application/x-httpd-php .php だったのが, AddHandler application/x-httpd-php .php となっている。今まで,AddType と AddHandler の違いなんて考えたこともなく,どこかで見かけた通りに設定してきたが, AddTypeAddHandler を読んでみると, AddHandler の方が妥当なようだ。
    <IfModule mod_php5.c> と </IfModule> で挟むのは,Apache モジュール mod_so の書き方が変わっていないので,あったほうがいいかなという程度。
  6. Apache の httpd.conf の
    DirectoryIndex index.html  —>>  DirectoryIndex index.php index.html
  7. テキストエディタで,<?php phpinfo() ?> を記入した test.php を作り,ドキュメントルートにコピー。Apacheを再起動後,ブラウザから http://localhost/test.php を確認し,phpinfo() ページが表示されれば,インストール完了。
    ドキュメントルートの test.php は削除し,php.ini の
    ;disable_functions =  —>>  disable_functions =”shell_exec, suexec, passthru, phpinfo”
    に変更後,Apacheを再起動。

 一応,仮構築はできた。あとは,本番ですな。(ドキドキ)

早速の追記:
 書き忘れです。PHPのパスを通していないが,Apacheから使うだけなら通さなくても問題ない。
 と書いたのだが,近頃ググっていて,パスがらみのトラブルを見たので,WinVista・7・8やWinサーバ系だと違うのかもしれない(12/27追記)。

追記(4/12):
 次稿に書いたが,
     (OS 64)指定されたネットワーク名は利用できません。
     : AH00341: winnt_accept: Asynchronous AcceptEx failed.
に対して,
     <IfModule mpm_winnt_module>
       AcceptFilter http none
     </IfModule>
を入れてから,調子がいいように思える。

追記2(4/14):
 php5ts.dllのクラッシュによる再起動があまりに激しいので,Apache2.2+PHP5.3に戻した。しかし,次々稿のようなことになって,頭が痛い。

追記3(4/28):
 以下の構成で安定したよー,ぱちぱち。

  • WindowsXP HE SP3 (x86) 無理やりSP3をあててる
  • Apache 2.4.2 (VC9) (x86) Apache Loungeから
  • MySQL 5.5.23 (x86)
  • ActivePerl 5.14.2.1402 (x86)
  • PHP 5.4.1 (Thread Safe) (VC9) (x86)

追記4(5/2):
 今朝,8時半ごろ, crash + restart が起きた。5日強で1回だから,劇的に減った。ありがちなメモリリークとかも調べてみないといけないかな。

追記5(11/10):
 PHPの設定について,extra-confを作る話を「覚え書-#12。」に書いたので,そっちも見てください。

追記6(2013/1/3):
 VC11 でビルドの Apache 2.4.6 win32 binary について新記事を書いた。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です