カテゴリー
Windows

本家のお世話-#14。(Apacheの再導入)

投稿アップデート情報  追記(12/20)  追記2(12/25)  追記3(2012/1/2) …… 追記6(8/11)

 本家のお世話-#13。で導入したZoneAlarm10だけど,むかーし使っていたのとだいぶUIが変わっていて,どうも使いにくいなぁ。

まぁ,ボヤキは置いておいて,Apacheの再導入から始める。PHP5.3.6以降の関係があるので,ApacheはApache Loungeに行って,httpd-2.2.21-win32-x86-ssl.zipを落としてきた。apache.org版と違い,Apache Lounge版はMSIじゃなくてzip。今回は前のファイルをきれいさっぱり削除したので,地道に一からやらないといけない。ただし,Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)のインストールは,済んでいる。

  1. まず,httpd-2.2.21-win32-x86-ssl.zipを展開する。
  2. こののち,apache.org版使用にもどることがあるかもしれないので,フォルダ名をorg版に合わせて,置き場所もProgram Filesにする。<<—この辺は好き好き。
  3. httpd.confのカスタマイズ。
    • ServerRootを2.でファイルを置いた場所に変更。
    •    <IfModule mpm_winnt_module>
      Win32DisableAcceptEx
      </IfModule>
      はどうしようかな。
      後で
      [warn] (OS 64)指定されたネットワーク名は利用できません。
      [warn] (OS 121)セマフォがタイムアウトしました。
      が出たときに追加するかなと思いつつも,一応入れておく。
    • ServerAdmin のメールアドレスを自分のものに変更。
    • ServerName をlocalhost:80に変更。
    • DocumentRoot を”G:/WEB/example” に変更。
    • DocumentRoot に合わせて,<Directory “G:/WEB/example”> に変更。
    • インデックスファイルを置き忘れたときに,ディレクトリ内がさらされることのないように,Options Indexes FollowSymLinks をOptions FollowSymLinks に変更。
    • .htaccessが使えるように AllowOverride None を AllowOverride directive-type に変更。directive-typeに使えるキーワードについては,AllowOverride ディレクティブを参照のこと。
    • DirectoryIndex に index.php を追加。
    • ScriptAlias を “G:/WEB/cgi-bin/” に変更。
    • ScriptAlias に合わせて,<Directory “G:/WEB/cgi-bin”> に変更。
  4. 一応,手動でApacheのテストラン。コンソール(=コマンド プロンプト)を開き,httpd.exe のあるディレクトリに移動。
    >httpd.exe

    ところが,コンソール上に[notice] Disabled use of AcceptEx() WinSock2 APIが表示され,以下のように同じエラーがWindowsのイベントログにも出る。
    ————————————————————————————————————————-
    イベントの種類: エラー
    イベント ソース: Apache Service
    イベント カテゴリ: なし
    イベント ID: 3299
    日付:     xxxx/xx/xx
    時刻:     xx:xx:xx
    ユーザー:   N/A
    コンピュータ: xx
    説明:
    The Apache service named reported the following error:
    >>> [xxx xxx xx xx:xx:xx xxxx] [notice] Disabled use of AcceptEx() WinSock2 API

    詳細な情報は、http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。
    ————————————————————————————————————————-
    これは,Apacheとしては[notice]なんで,confのカスタマイズのときに入れたWin32DisableAcceptExが効いていれば起動時のログに出るのとイベントログにエラーが出るのは正常だけれども,イベントログにエラーで出るそれでクラッシュするのが変。で,下記のようにコメントアウトして,Apacheを再起動してみた。
    #<IfModule mpm_winnt_module>
    #Win32DisableAcceptEx
    #</IfModule>

    また,エラー。今度はソケットが使えない旨のエラーで,イベントログにもエラーとして記録されている。
    ————————————————————————————————————————-
    イベントの種類: エラー
    イベント ソース: Apache Service
    イベント カテゴリ: なし
    イベント ID: 3299
    日付:     xxxx/xx/xx
    時刻:     xx:xx:xx
    ユーザー:   N/A
    コンピュータ: xx
    説明:
    The Apache service named reported the following error:
    >>> (OS 10048)通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。 : make_sock: could not bind to address 0.0.0.0:80

    詳細な情報は、http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。
    ————————————————————————————————————————-

    いろいろ調べてみたら,どうもWinSockがおかしいみたい。というわけで,「Windows Server 2003、Windows XP、および Windows Vista で Winsock2 の破損を確認して回復する方法」というページを参考にやってみた。まずは,コンソールから netsh winsock reset を打ってみたんだけど,どうもよくならない。
    で次は,Microsoft Fix it 50203を使ってみたが,よくならない。結局,「手順 1: 破損したレジストリ キーを削除する」「手順 2: TCP/IP をインストールする」までやったら,ようやくノーエラーで起動できるようになった。
    何が原因かよくわからないが,WinSockのリセットでは「ウイルス対策、ファイアウォール、プロキシ クライアントなどに悪影響が生じるおそれがあります。」という記載があるから,逆も真なりで,ファイアウォールをZoneAlarm10にしたことが引き起こしたことかもしれない。

    ところで,初めのほうのDisabled use of AcceptEx() WinSock2 APIのエラーがイベントログに残ることについては,Winsockの破損とは,関係ないかもしれない。kazenokakasiさんが「Apache2.2.17で変更有り。」という記事を書いておられるのに,ググっているときに気づいた。  今日気づいたのだが,kazenokakasiさんのところは直リン禁止ということらしい。リンクからでは記事が読めなかった。ブラウザのアドレスバーにhttp://sitifukuzin.com/blog/?p=6021を記入して跳んでほしい。  追記4(2/15)
     今のWindows上のApacheには,
    <IfModule mpm_winnt_module>
    Win32DisableAcceptEx
    </IfModule>
    はいらないみたいだね。
    (12/25 消し線追加)

  5. 無事起動するようになったので,サービスとして登録する。コンソールでhttpd.exe のあるディレクトリに移動し,
    >httpd.exe -k install
    Windowsのサービス一覧でちゃんと登録されていることを確認。ApacheMonitorのショートカットを,スタートメニューのスタートアップに追加する。
    (注) Apacheのサービスの状況はタスクトレイのApacheMonitorのアイコンで確認できる。Start/Restart/Stop もここからできる。
  6. まあ,一応, http://localhost/ は確認しておいたほうがいい。もちろんドキュメントルートに index.html を作って入れておかないと,下記が表示されちゃうよ。
    Forbidden
    You don’t have permission to access / on this server.

書き忘れたが,httpd.confで使用している /WEB/example , /WEB/cgi-bin なんかは,該当場所に作っておかないと,Apacheがディレクトリがないよと言ってくるので,注意。

追記(12/20): 大事なことを書き忘れていた。
本家のお世話-#13。で導入したZoneAlarm10なんだが,重大な不具合があって使うのを止めた。どんな不具合かというと,Apacheを停止するとWindowsが勝手に再起動するというものだ。だいたい,一般クライアント用のファイアーウォールソフトをサーバ用に使おうというところに無理があるのはわかっているが,ウィルスバスターといいZoneAlarm10のFree版といい,ベンダ側はクライアント用のものはサーバ用としては使わせない方向で動いているようだ。ネットのマルウェアがどんどん進化しているせいだろうか。

ZoneAlarm10の使用を止める前に一応努力はしてみた。
apacheのメーリングリストでは,
linux の watchdog の機能と同じようなものが ZoneAlarm Free 10 にもついているのではないか。
という示唆をいただいた。検証してみると,Apacheが正常に停止せずpidファイルが残った場合は再起動が起こらないので,ZoneAlarm Free 10 にも同様の機能がついてそうだという感触を得た。他に,違うファイアウォールソフトを使った方がいい,あるいは,ZoneAlarmのサポートに聞いてみたほうがいいという意見もいただいた。使おうとしていた ZoneAlarm10 がFree版だったので,問い合わせは躊躇していたのだが,http://forums.zonealarm.com/ で調べてみたら,Zone Alarm Apache shut down conflictという書き込みがあった。それに対するモデレータの回答があって「サーバソフトのサポートはしていないので,他のセキュリティソフトを探してください」というものだった。

ということなので,ZoneAlarm10 Free Firewall をサーバのファイアーウォールとして使うことは断念した。

追記2(12/25):
今朝のログに
[warn] (OS 64)指定されたネットワーク名は利用できません。
[warn] (OS 121)セマフォがタイムアウトしました。
が出ていたので,やはり
<IfModule mpm_winnt_module>
Win32DisableAcceptEx
</IfModule>
を復活することにした。

  追記6(2013/8/11):
中途半端な場所に追記(汗)。
現時点でも,下記なしだと頻繁にハングが起こる。メッセージは,
「(OS 64)指定されたネットワーク名は利用できません。」
Apache2.4から,Win32DisableAcceptExの代わりにAcceptFilter Noneを使うことになったので,
<IfModule mpm_winnt_module>
AcceptFilter http none
</IfModule>
を入れている。

追記3(2012/1/2):
検索キーワードで「httpd-2.2.21-win32-x86-ssl.zipがダウンロードできない」というのがあって,なんだろうなとLoungeを見に行ったら,Apache 2.3.16 Release Candidateなんぞがあって,大分ページの雰囲気が変わっているし,表記が,httpd-2.2.21-win32-x86-ssl.zipじゃなくて,httpd-2.2.21-win32.zipになっている。「初めて落とすときは悩むよな」ということで,追記。
名称としてhttpd-2.2.21-win32-x86-ssl.zipはなくなっているので,代わりとしてはApache 2.2.21 Stableのhttpd-2.2.21-win32.zipを落とせばO.K.です。

追記5(4/11):
Apache導入についての新しい記事を,本家のお世話-#28。本家のお世話-#29。に書いた。