2011年11月6日日曜日

Windows7でApacheが起動しない

タイトルの通り、Windows7に入れたApache2.2が
The request operation has failed
とかエラーダイアログを吐いて起動しなかったので、原因のメモ。

SEさんや開発者の方には常識だが、こういう場合は、Apache様がお使いになられる80番ポートを他のプログラムがいけしゃあしゃあと勝手に使っていることがほとんど。
例えば、Skypeとかね。
(Skypeのポート番号変更はこちらのブログで紹介されています)

今回も、結局犯人は「Web Deployment Agent Service」というマイクロソフトのWeb配置ツールのサービスで、コイツが偉そうにポート80をListenしていやがった。
こんなツール、入れた記憶はまったくないんだけど、どうやらMicrosoft Visual Web Developer 2010 Expressをインストールした時にセットでインストールされたっぽい。Web配置ツールのくせに本家ポート80を占拠するとは…。

というわけで、コンパネ>サービスで上記のサービスを止めたら無事Apacheが起動。

で、ついでに調べ方のメモ。

どのプログラムがどのポートを使っているか調べる

コマンドプロンプトで、以下のコマンドを実行。
netstat -ano

たくさん表示されて流れちゃう時は、パイプで more に渡すといいよ。
netstat -ano | more

ページ送りは[SPACE]キーでOK。


で、PID(プロセスID)の列を見ると、どのプロセスがポートを使用しているかわかる。
PIDがわかれば、「tasklist」コマンドでイメージ名が分かる。
tasklist /FI "PID eq 4"

ただ今回厄介だったのは、上記の例の通り、PIDが「4」、つまりSystemプロセスだったこと。
詳細は「@IT:Windows TIPS -- Tips:netstatでリッスンしているプロセスを特定する」で詳しく解説されているが、要するに、ポート80を占有しているのは「システムプロセスですよ」としか教えてもらえず、すぐには犯人である「Web Deployment Agent Service」を特定できなかった。
というわけで、上記ではサクっと解決した風に書いたが、実はコンパネ>サービスで、サービス一覧から怪しそうなサービスを停止しては、ポートの状態を確認する、という地道な調査で突き止めた。
(今回は犯人に「Web~」というサービス名が付いていたため、2発目ぐらいで運良く犯人にヒットしてくれた。)

というわけで、「httpd.confの内容も合ってるし、なんで起動しないんだ・・・?」という方は、上記の方法なども試して頑張ってみるといいよ。
あるいは、もっとスマートな方法が合ったら是非教えてくだいませ。