IISでFastCGIでPHPでCakePHPなところまで導入してみた

都合でCakePHP動かしてみることになって、こんな勇ましい(?)環境を構築してみた。それで躓いたとことかのメモ書きを置いておくよ。

IISからつまずいてみる

IISはもうインストール済み・・・と思いきや、早速問題発生。IISが立ち上がらない。

予期しないエラー 0x8ffe2740 が発生しました。

どうもMicrosoftのサポート記事によると、別のプロセスが80番を使っている時に起こるエラーらしい。素直に「別プロセスがポートを占有してるから起動できませんでした」って書いてよもー。で、当該ポートを占有しているプロセスを調べてみた。

# netstat -a -o
  Proto  Local Address          Foreign Address        State           PID
  TCP    xxxxxx:http     xxxxxx:0        LISTENING       3836

何かいるし。タスクマネージャ立ち上げて同じPIDのプロセスを調べてみた。なになに、Skype.exe・・・・

またお前かあああ!

ってことでSkypeのポート番号を変更して、無事IISを起動。

PHPをインストール、の前に寄り道してFastCGIを入れちゃう

PHPこの辺からダウンロード。PHP 5.3 (5.3.0)のVC9 x86 Thread Safeってやつ。インストール始めた時に、IIS + FastCGIってオプションを見つけた。興味本位で調査。

Hiroshi Okunushi's Blog ☆ミ : 【IIS6】 IIS6用のFastCGI拡張が製品版にによると、PHPのプロセスを再利用することで、プロセスを起動したり終了したりする時間とCPUコストを削減して、より快適にPHPが動作するようにしたそうな。

ものは試しでインストールしてみることにした。順番としては以下のよな感じ。

  1. FastCGI for IIS 6 : The Official Microsoft IIS Siteにアクセスして、右のほうにある「Install Now」ってボタンをクリック
  2. Web Platform Installerをインストールするよう催促されるので、ちゃっちゃとインストール。終わった後起動したなら閉じちゃう
  3. もう一度FastCGI for IIS 6 : The Official Microsoft IIS Siteにアクセスして、「Install Now」ボタンをクリック
  4. そしたら今度はWeb Platform Installerが起動してFastCGIのインストール画面が出るので、インストール。再起動を要求されるので再起動する

いざPHPをインストール

さて、ここでやっとさっきダウンロードしたPHPをダブルクリックしてインストール開始ー。

面倒臭いので拡張とかは全部入れてフルインストールを選択。そしたら最後になんか出た。

Error trying access httpd.conf file. You will need to manually configure the web server.

いやいやApacheじゃなくてIISだから、httpd.confファイルなんてございませんがな。試しにIISでお馴染みのphpinfo()を実行してみたが、予想通りの表示。

"php-cgi.exe" でハンドルされていないWin32の例外が発生しました。

探していたら、こんなページ出た。

なんて素敵。どうも"Extensions" の "Multi-byte String functions"以外はインストール時に選択すると失敗する可能性があるらしい・・*1

で、アンインストールしてから再インストール。無事成功。

今度は設定。php.iniファイルに以下を設定するよ。

  • error_log = syslog
  • date.timezone = Asia/Tokyo
  • display_startup_errors = On

こんだけ。*2

で、C:\Inetpub\wwwrootにphpinfo.phpというファイルを作って、中身は以下のように書く。*3

<?php
	phpinfo();
?>

その後、ブラウザでhttp://localhost/phpinfo.phpにアクセス。はい、表示されました。

CakePHPを動かすぞ

んで、CakePHPここらへんからダウンロード。ZIPファイルなので、てきとーな解凍ソフトで解凍する。

解凍したものをcakeってフォルダを作ってそこに放り込み、cakeフォルダをIISのルートディレクトリ(デフォルトなら「C:\Inetpub\wwwroot」)に移動する。動かしてみると、動くには動くけどなんかCSS読み込まない。これはIISmod_rewriteに対応してないから発生する問題ぽい。*4

で、正しいかどうかは不明だけど、どうも「app」ってフォルダがこれから加工していくMVCセットぽいので、cakeから「C:\Inetpub\wwwroot」に出す。*5

日本版のチュートリアルはちょっち古いので、本家のを見るようにしたほうが良いよー。そっちに解があった。以下の.htaccessをさっくり削除。

続いて、IISのホームディレクトリを「C:\Inetpub\wwwroot\app\webroot」に設定。

そしたらスタイリッシュな(?)ウェブ画面の登場! 2つほどエラーが出るので、それは以下のように対応すると良いかも。

Your tmp directory is NOT writable.

IISは独自の匿名ユーザーでアクセスしてるから、こんなの出る。tmpフォルダのプロパティにセキュリティタブが出てるならそれで対応すると良いけど、出てない時はコマンドプロンプトから対応だ。「cacls tmp /T /G Users:F」って実行しよう*6

Notice (1024): Please change the value of 'Security.salt' in app/config/core.php to a salt value specific to your application [CORE/cake/libs/debugger.php, line 522]

これは指定のPHPのSecurity.saltって値が長すぎるせいなので、PHPファイルの該当行の長たらしーい文字列を適当に削ってやる。ていうかそれデフォルト設定で出るってどうなのー。

あと、文字コードUTF-8なので、対応したテキストエディタを使うこと!

ここまで設定が終わったら、http://localhost/にアクセスするとこんな画面が表示されるはず。


ISAPI_Rewrite 3をインストールしよう!

IISmod_rewriteに対応してないので、このままじゃぁCakePHPがまともに動かない。困ったね。つーわけで、必死で(1分くらい)探し回った結果、IISで実装できる素敵なツールがこのサイトで見つかった。

果たしてインストールは簡単、ダウンロードしたMSIファイルをダブルクリックしてインストールするだけ。

後は設定だけど、ISAPI_Rewrite3をインストールしたフォルダ(デフォルトだと「C:\Program Files\Helicon\ISAPI_Rewrite3」)にあるhttpd.confに、こんな感じで書き込んで上げる。

[ISAPI_Rewrite]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /index.php?url=$1 [QSA,L]

んで、念のためにIIS Adminサービスを再起動する。

これでCakePHPのブログチュートリアルを問題無くクリアできるはず。

長らくお疲れ様でした、自分!てわけでちょっと寝よう。5スクロールって、ちょっとやり過ぎた。。

*1:前もMySQLのDLLが古いから、それだけ最新版をDLして入れ替えるってのがあったなぁ。

*2:因みにdate.timezoneはsyslogであるなしに関わらず必須、FastCGI関連のオプションはPHPのインストール時にきちんと「IIS + FastCGI」を選択していればきちんと設定されてた。あと、display_errorsも元からOnだったよ。

*3:PHP5からは、「<?」で始まるのはデフォルト禁止になっちゃったから気をつけてね。やっとかーって思ったもので。

*4:なぜかインストールマニュアルとかインストール要件とかじゃなくて、ブログ作成チュートリアルに含まれてるから分からん。

*5:ここは要調査。

*6:これセキュリティ的にザルだから、Usersグループじゃなくて匿名ユーザーに限定して実行したほうが良いよ。IUSR_XXXXXXが対象ユーザーかな。