Wordpress

FastCGI 1.5 for IIS6でREQUEST_URIが文字化けする件の解決

こちらのエントリで書いた、FastCGI for IISでのREQUEST_URIの文字化け問題ですが、iis.netのページにこんな情報がありました。

Configure the FastCGI Extension for IIS 6.0

Using UTF-8 encoding for server variables

By default, FastCGI extension uses ASCII encoding when setting server variables that are used by PHP. When requested URL contains non-ASCII characters, then server variables that derive their values from the requested URL string may be set incorrectly. PHP applications that rely on those server variables may not work because of that.

To prevent this the FastCGI extension can be configured to use UTF-8 encoding when setting server variables. To configure FastCGI to use UTF-8 encoding for a particular set of server variables, use the REG_MULTI_SZ registry key FastCGIUtf8ServerVariables and set its value to a list of server variable names, for example:

reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\w3svc\Parameters /v FastCGIUtf8ServerVariables /t REG_MULTI_SZ /d REQUEST_URI\0PATH_INFO

The above example will configure FastCGI extension to use UTF-8 encoding when setting REQUEST_URI and PATH_INFO server variables.

After setting the registry key restart the IIS by using the iisreset command.

Warning: using UTF-8 encoding for server variables may affect how PHP core and PHP applications work. Make sure to verify that applications work as expected after the registry key has been changed.

1月にやっとリリースされたRTW版で追加されたオプションのようです。要は、デフォ設定だとREQUEST_URIやPATH_INFOをUTF-8でやりとり出来ないと。

というわけなので、コマンドラインで上記レジストリエントリへの追加をして、IISのサービスを再起動して完了。

WordPressのclasses.phpを修正していたのを戻して、エントリ単品の記事へ正常にアクセス出来る事が確認できました。

しかしなんでデフォでこんな仕様なんだろう…

FastCGI拡張forIISでREQUEST_URIが文字化けする

WordPressをアップデートしたら元に戻ってしまったのでメモ。

URLのパスや引数の名前に含まれるURLエンコード部分の文字列が、なぜかShift-JISで飛んできます。URLエンコード前の文字列が日本語などでなければ大丈夫。

どっかの設定が悪いのかなんなのか。変な設定とかしてないんですけどねぇ。

WordPressの場合の対処はこんな感じ。

classes.phpの152行目あたりにこんなコードを追記する。

$_SERVER['REQUEST_URI'] = mb_convert_encoding($_SERVER['REQUEST_URI'],’UTF-8′,’SJIS’);
$_SERVER['PATH_INFO'] = mb_convert_encoding($_SERVER['PATH_INFO'],’UTF-8′,’SJIS’);

Windows7をお持ちの方は、WebPlatform Instaler 2.0で、マウスだけでインストール出来るのでお試しあれ。

VistaのIIS7でWordPress

Windows VistaというかIIS7でWordpressを動かすメモ。

ローカル環境でWPをいじる環境を作るのが目的なのでWindows Vistaを対象にしていますが、原則WindowsServer2008でも同じやり方でインストールできるはずです。

IIS7.0とPHPをインストール&設定する

http://technet.microsoft.com/ja-jp/library/cc732624.aspx

↑こことかを参考に、IIS7.0をインストールします。Vista Home Premiumでもインストールできる様子。

FastCGI for IIS7のインストール

基本的には、Vista SP1であれば既にFastCGIが組み込まれているはずです。

 既にIIS 7.0をインストールしてしまっている場合、IIS 7.0を有効化してからSP1をあてた場合など、現在稼働中のIIS7でFastCGIモジュールが確認できない場合、FastCGI単品でのインストールも可能です。

FastCGI for IIS7

http://www.iis.net/downloads/default.aspx?tabid=34&i=1299&g=6

 いずれにしても、SP1適用後に、IISの無効化→有効化を行えば、FastCGIが使えるようになるはずです。

コントロールパネル > プログラムと機能 > Windowsの機能の有効かまたは無効化

  wp01

IIS7の管理コンソールからの設定

コントロールパネル > 管理ツール > インターネット インフォメーション サービス (IIS) マネージャ

から、IISの管理コンソールを開きます。IIS5.1、IIS6と違い、3ペイン構成になっています。

左ペインより、Default Web Siteを選択し、中央のペインのモジュールをダブルクリックすると、そのIISで利用できるモジュールの一覧が表示されます。

その中に、FastCgiModuleが含まれていることを確認します。

 wp02

PHPの有効化

 http://www.php.net/downloads.php

公式サイトより、PHPのバイナリをダウンロードして、C:\phpなどに配置します。

2009年4/12現在での最新はPHP 5.2.9-2 Non-thread-safe zip packageでした。

Non-thread-safe版をダウンロードし、c:\phpに配置したら、php.ini-recommendedを編集し、php.iniとリネームしておきます。

このあたりは通常のphpの設定と大差ありません。最低限必要なのは、

extension_dir = “C:\php\ext”

と、

extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mcrypt.dll
extension=php_mhash.dll
extension=php_mysql.dll
extension=php_openssl.dll
extension=php_sockets.dll
extension=php_xmlrpc.dll
extension=php_zip.dll

これぐらいです。Wordpressの動作には必要のないものも含まれていますが、まぁよく使う拡張はこれぐらいでしょう。

また、

cgi.force_redirect = 0

cgi.fix_pathinfo=1

IISでFastCGIを使う場合は、この設定をするべきのようですが、IIS7の場合は、設定しなくとも普通に動くようです。

同時に、[mail function]のSMTP=も、SMTPサーバーを指定しておくとよいですが、Wordpressの場合はプラグインでSMTPサーバーを指定する方が一般的かもしれません。

モジュールマップの追加

IIS管理画面に戻り、中央の画面からハンドラマッピングをダブルクリックします。と、拡張子とそれに対する利用モジュールのマッピング一覧が表示されます。

 wp03

この状態で、右のペインからモジュールマップの追加をクリックし、php-cgi.exeとFastCgiModuleを結びつけます。

 wp04

要求パスは*.php、モジュールはFastCgiModuleを選択、実行可能ファイルはC:\php\php-cgi.exeです。

名前はまぁ、適当にわかりやすいのをつけておき、OKします。これでIIS7でPHPが動作するようになりました。

既定のドキュメントの変更

デフォルトでは、index.phpが既定のドキュメントとして含まれないため、http://ドメイン名/でアクセスした場合、ファイルの一覧を表示しようとしてしまいます。

なので、index.phpを最優先で利用するよう、設定します。

Default Web Siteを選択し、既定のドキュメントをダブルクリックします。現在の既定のドキュメントの一覧が表示されるので、

右のペインから追加をクリックし、index.phpを追加、↑上へ移動で最優先にしてください。

WordPressにしか使わないのであれば、Default.htmlやDefault.aspといった意味のない既定のドキュメントを消してしまっても問題ありません。

PHPの動作確認

ここまでできたら、とりあえずPHPの動作を確認しましょう。

IISのデフォルトでは、Default Web SiteのドキュメントルートはC:\inetpub\wwwrootに設定されています。

C:\inetpub\wwwroot\index.phpというファイル名で、

<?php

phpinfo();

と記述したPHPファイルをおいて、http://localhost/にブラウザでアクセスしてみてください。おなじみのPHPの動作設定画面が表示されれば成功です。

 

MySQLのインストール

MySQLとMySQL GUI Toolsのダウンロード

以下のページから、MySQL本体と管理ツールをダウンロードします。

わかりづらいですが、Windows (X86) > Pick a mirror > ≫ No thanks, just take me to the downloads!と辿ればダウンロードできます。

MySQL 5.1 Downloads

http://dev.mysql.com/downloads/mysql/5.1.html

MySQL GUI Tools Downloads

http://dev.mysql.com/downloads/gui-tools/5.0.html

そのまま実行して、インストーラーの指示に従い、次へクリックしていくだけで大丈夫ですが、MySQL本体は変なレジストリの使い方をするらしく、古い設定が残っていたりするとうまくサービスの登録ができなかったりします。

他の注意点は

  • Windowsファイアーウォールを使っている場合は、□ Add firewall exception for this port にチェック。
  • 言語は○Best Support For Multilingualismを選択
  • □Install as Windows Service付近はとりあえず全部チェック。

といったところ。インストール完了画面で、4つ全部にチェックが入らなかった場合は失敗です。根気よくトライするのもありですが、下手なハマり方をすると結構面倒なので、諦めるかWindowsの再インストールで逃げましょう。

GUI-Toolsの方は、そのまま全部インストールして大丈夫です。

WordPress用データベースの作成

スタートメニューから、MySQL > MySQL Administratorで、MySQL管理ツールを起動します。

Server HostはLocalhost、Portは3306、Usernameはroot、Passwordは先ほどMySQLのインストーラーで入力したものを指定することで、管理画面が開きます。

こちらも3ペイン構成になっているので、カタログ > Create New Schema でDBを作成します。とりあえず単純に wp とでも名前をつけておきましょう。 

 wp05

wp用のユーザーの作成

いくらローカル環境とはいえ、root権限でwpデータベースにアクセスさせるのはアレなので、専用のユーザーを作ります。

MySQLでのユーザーの権限はちょっと癖があるので、rootユーザーをコピーして作ってしまいましょう。

左上のペインからUser Administrationを選択し、左下のペインでrootを右クリック、Clone Userをクリックします。

wp06

MySQL Userはとりあえずwp_userとし、パスワードを入力してください。

また、Schema Privileges(中央のタブ)をクリックし、Information_schemamysqltestについて、<< をクリックしてwp_userにいじらせる権限を取り外しましょう。

全部終わったら、Apply changesボタンをクリックしてください。これでデータベースwp用のユーザー、wp_userが追加できました。

 

WordPressのデプロイ

プログラムの配置

日本語公式サイトより最新のWordpressパッケージをダウンロードしましょう。

http://ja.wordpress.org/releases/

展開し、中身をwwwrootに展開します。

場所が気にくわなければ、IISの管理コンソールで、Default Web Siteを選択し、右のペインの基本設定をクリックすれば、物理パスを変更できます。

wp-config.phpの作成

ここからは公式サイトに書かれている通りです。

プログラムが配置されたディレクトリの、wp-config-sample.phpをwp-configにリネーム、

WordPressのデータベース名をwp、ユーザー名をwp_user、パスワードをwp_userに設定したパスワード、ホスト名はlocalhostです。

以上を行ったら、ブラウザでhttp://localhost/にアクセスしてください。これでWordpressのインストール画面が表示されるので、Blog名とメールアドレスを入力し、おしまいです。

 

URL Rewriteモジュールの設定

IISは7.0になって、やっとmod_rewiteのような機能がつきました。

(ISAPI Rewiteのような有償サードパーティーツールもありましたが、パフォーマンスや動作に難があるのであまり使われていません)

通常では、index.php/や/?というURLでアクセスできますが、 きれいなパーマリンクURLを実現するため、URL Rewriteモジュールを利用します。

インストールや、設定手順は公式の解説にあります。

パーマリンクの使い方 WordPress Codex 日本語版

URL Rewrite Moduleのダウンロードは以下から。特にインストールオプションはないので、次へ連打でインストールします。

Microsoft URL Rewrite Module for IIS 7.0 (x86)

http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1691

Microsoft URL Rewrite Module for IIS 7.0 (x64)

http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1692

なお、IIS管理コンソールからは、Default Web Siteを選択し、URL Rewriteをダブルクリック、以下のような設定で、mod_rewrite相当の動作をしてくれるはずです。

 wp07

が、ちょっと設定のUIがめんどくさいので、上記サイトのように、Wordpressのプログラムのディレクトリに作成された、Web.configを直接テキストエディタで編集した方が楽です。

<rewrite>
    <rules>
        <rule name=”Main Rule” stopProcessing=”true”>
            <match url=”.*” />
            <conditions logicalGrouping=”MatchAll”>
                <add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” />
                <add input=”{REQUEST_FILENAME}” matchType=”IsDirectory” negate=”true” />
            </conditions>
            <action type=”Rewrite” url=”index.php” />
        </rule>
    </rules>
</rewrite>

<system.webServer>の下の行にコピペするだけ。

このRewrite設定で、どんなURLへのリクエストでもindex.phpへ流れるようになっているので、

/%year%/%monthnum%/%postname%/

のようなカスタム構造が利用可能です。

設定後、テストの投稿をしてサイトを開き、パーマリンクを確認しましょう。

http://localhost/2009/04/test/

のようなURLで開けていれば成功です。お疲れ様でした。

まさかのWordPress for IIS6。

WordPress 2.63をWindowsServer2003/IIS6に導入してみました。Linuxで手作りでやる予定だったんですが、このサーバがいろいろな事情でWindowsじゃないと困るってことで。

Apache+PHP on Windowsじゃなくて、素直にInstant Railsあたり使って開発すれば良かったのかな、とかちょっと思ったり思わなかったり。まぁそれはそれで別途。

APS.NET MVCも試してみたいんだけど、MSDN期間切れてるし、サーバーも2008に入れ直すとかきつい(スペック的にもいろいろ)のでとりあえず現状で妥協。

さてWP導入話。

環境は前述の通り、Widows Server 2003にFastCGI Extension for IIS6.0PHP 5.26NTSMySQL 5.0.67

インストールでコケること数十回。何がコケるかと言えば、テーブルの作成で

wp_options doesn’t exist

と怒られるのなんの。公式サイトのテーブル定義見ながらwp_optionsテーブルを作ってたらうまくいったのですが、そもそもパッチがあるようです→こちら

パッチを見ながら、それっぽい行を修正してみて再度インストールを試みたら無事インストール出来ました。

それにしても、MySQLも以前にインストールしたときのレジストリが残っているためか、インストール時のサービス開始が失敗したりとなかなか大変。

まぁ今回は結局OSをSSDで入れ直したので普通に入れられたのですが。

ちなみにC:\Windows\System32\inetsrv\fcgiext.iniはこんな感じ。探した情報のコピペです。IIS7だとぐりぐりGUIで設定できるんだけどIIS6だとちと厄介。

[Types]
php:1111111111=FastCGI-PHP

[FastCGI-PHP]
ExePath=C:\php\php-cgi.exe
QueueLength=1001
MaxInstances=20
IdleTimeout=200
ActivityTimeout=20
RequestTimeout=60
InstanceMaxRequests=1000
IgnoreExistingDirectories=n

なお、fcgiext.iniに書いてある、

but only for requests made to the web site
; with the numeric identifier “1701187997″.

ですが、該当のWebサイト(IISでいうところの、ね)のIISログのファイル名を見るのが手っ取り早いようです。W3SVCの後の数値の羅列ですね。

後はお約束通り、拡張子phpのマッピングをfcgiのDLLにする、php.iniの設定をする(これはググればたくさん情報出てきます)、MySQLのアカウントを作る、などしてwp-admin/install.phpにアクセスして終了。

しかし機能盛りだくさんで何がなにやら。