Sat, 01 May 2010 (平成22年) [長年日記]
_ IIS 7.0 で tDiary を使うには
昨年の五月からインストールマニアックス 2009 というもので Windows Web Server 2008 + IIS 7.0 上の Ruby 1.9.1 + tDiary を動かしてみるということをしてきたわけだけど、ついに一年の縛りが解ける日が来て、もらったサーバは別の使いみちに回そうと思っているのであっちに書いてたものをこっちに持ってくることにした。
普段とは違う文体を直すのは面倒なのでそのまま転載。それと、できるだけ CUI でやろうという妙な縛りを課してるので微妙に役に立たないかも。
IIS のインストール
IIS のインストールはややこしいところはぜんぜんありません。この通りで OK です。ただし、Ruby を使う CGI スクリプトである tDiary を動かすためには「手順 9 : インストールする追加の IIS 機能を選択する」で「CGI」を忘れずに選択しないといけません。
インストール後にはもう一度 MBSA でチェックと思ったら [IIS の管理上の脆弱性をチェックする] ことができませんでした。何か設定しないといけないらしいと調べてみると、「[IIS 6 メタベース互換] の役割サービスをインストールしておく必要がある」ということだったので、サーバーマネージャーに戻って該当項目を追加してから MBSA を動かしてみると無事にチェックできました。
そのまま使うことにした Default Web Site を開始して、http://localhost/ にアクセスすると IIS 7 という画像が表示されたので IIS の最初の設定はできました。
Ruby のインストール
まだまだ Ruby の 1.8 系列は現役ですが、tDiary の開発版はせっかく 1.9 系列でも動くようになっているので今回は 1.9 系列を使うことにしました。x64 向けのバイナリパッケージが見つけられなかったので x86 向けを使います。
こちらのサイトから Ruby-1.9.1-p0 Microsoft Installter Package をダウンロードしてきてインストールするだけです。x86 向けバイナリなので以下の場所にインストールされます。このあとの設定に必要なのでこのパスは重要。
C:\Program Files (x86)\Ruby-1.9.1\bin\ruby.exe
スクリプトマップのハンドラマッピングにコマンドで Ruby を登録
コマンドプロンプトを起動して、以下のコマンドを入力。
C:\>cd %windir%\system32\inetsrv C:\Windows\System32\inetsrv>appcmd set config /section:handlers /+[name='CGI-ruby',path='*.rb',verb='GET,POST,HEAD',modules='CgiModule',scriptProcessor='"\"C:\Program Files (x86)\Ruby-1.9.1\bin\ruby.exe\" \"%s\" %s"']
TechNet の「スクリプトマップのハンドラマッピングを追加する」に書いてあることをもとにして、調べた結果たどり着いたのがこの書き方でした。GUI で設定したものと比較して差は見られなかったので問題はないと思いますし、テストスクリプトも動いたので大丈夫でしょう。
最後の項目の「scriptProcessor='"……"'」の書き方がわかるまでが難関でした。中身のダブルコーテイションをエスケープするのは早くに思いつけたのですが、外側の「'"……"'」はなかなか思いつかないです。GUI で設定すれば 1 分もかからないで終わることなのに数時間かかってしまいました。時間が……
tDiary のインストール
- 公式サイトから 2.3.2(開発版)フルセットをダウンロードしてきます。今回は ruby 1.9.1 を使っていますので開発版しか選択の余地がありません。
- ダウンロードしたファイルを展開します。doc\INSTALL.html にインストールについての説明が書いてあります。IIS には当てはまらないことも多いですが、一読しておくほうがいいと思います。
- 展開した中身を C:\App\tDiary\core にコピーし、日記データなどを保存するフォルダを C:\App\tDiary\data という名前で作成します。(下図参照。ただし、動作に不必要なファイル、フォルダは削除してある状態で、かつ、RSS や IIS の設定ファイル web.config が作成された運用開始後のものです)
- tdiary.conf.sample のコピーを作成し tdiary.conf にリネームします。テキストエディタで開き(メモ帳でも開けないことはないですが、ファイルの改行コードの関係で辛いです)、少なくとも @data_path の設定行を書き換える必要があり、今回のファイル配置の場合は
@data_path ='C:\App\tDiary\data'(09/05/29 訂正 区切り記号に \ を使うとエラーが起きるようです。ですので) @data_path = 'C:/App/tDiary/data' と書き換えて保存します。 - (09/05/29 訂正 上記の点に注意すればこの項目は無意味です)
C:\App\tDiary\core\plugin\05referer.rb の 103行目に以下のものを追加します†1。(この設定に関してはこちらのページからの内容を使わせていただきました)
return false unless y
仮想ディレクトリの設定
上の状態のままでは IIS が tDiary を見つけられないので仮想ディレクトリの設定をします。
C:\App\tDiary\core を Default Web Site の下に tdiary という名前で登録(つまり、http://localhost/tdiary/ でアクセスできるようにする)にはこうです。
C:\Windows\System32\inetsrv>appcmd add app /site.name:"Default Web Site" /path:/tdiary /physicalPath:"C:\App\tDiary\core" APP オブジェクト "Default Web Site/tdiary" を追加しました VDIR オブジェクト "Default Web Site/tdiary" を追加しました
既定のドキュメント
tDiary を動かすならば index.rb を既定のドキュメントに追加しておかないといちいち index.rb に明示的にアクセスする必要があって面倒なので以下のコマンドを実行します。
「なるべく安全方向に」の縛りがあるので tDiary をインストールした "Default Web Site/tdiary" だけに限定しています。最初のコマンドが既定のドキュメントを有効にするコマンドで、次のコマンドが index.rb を既定のドキュメントに追加するコマンドです。
C:\Windows\System32\inetsrv>appcmd set config "Default Web Site/tdiary" /section:defaultDocument /enabled:true 構成変更を構成コミット パス "MACHINE/WEBROOT/APPHOST" の "MACHINE/WEBROOT/APPHOST" のセクション "system.webServer/defaultDocument" に適用しました C:\Windows\System32\inetsrv>appcmd set config "Default Web Site/tdiary" /section:defaultDocument /+files.[value='index.rb'] 構成変更を構成コミット パス "MACHINE/WEBROOT/APPHOST" の "MACHINE/WEBROOT/APPHOST" のセクション "system.webServer/defaultDocument" に適用しました
update.rb へのアクセスを制限する
昨日までの設定で日記を書くことはできるようになりましたが、tDiary は組み込みの認証機能を備えておらず Web サーバにおまかせするという方針で開発されているため、インストールしただけの状態では管理画面に誰でもアクセスし、書き換えてしまうことができます。
ベーシック認証を使うのが普通ですが、IIS で apache の感覚でベーシック認証を使うのは難しいことがわかったので(IIS 5.x や 6.0 で使える IISPassword というツールがありますが、IIS 7.0 に対応しているという記述を見つけられず今回は使用を断念しました)IPv4 アドレスおよびドメイン名の規則を構成する方法で特定の IP アドレスを持つ端末からしか管理画面にアクセスできないようにしています。「役割サービスの追加」で「IP アドレスとドメインの制限」を追加することでこの機能が使えるようになります。
アクセス制限をかけるのは update.rb だけなのでこのファイルに設定をする必要がありますが、少々わかりにくく以下の手順で設定しました。サーバマネージャで操作します。
- 仮想フォルダ tdiary を選択する。
- 機能ビューからコンテンツビューに切り替える。
- update.rb を選択し、右側の「操作」から「機能ビューに切り替え」を選択する。
この手順を踏むことで update.rb 単体の設定変更画面に到達できるので、「IPv4 アドレスおよびドメインの制限」からアクセスを許可する IP アドレスを設定します。
yyyymmdd.html 形式でアクセスできるようにする
まず tDiary 自体が index.rb?date=yyyymmdd 形式ではなく、yyyymmdd.html 形式を使うように設定を変更します。プラグイン集に含まれている html_anchor.rb を有効にするだけで変更できます。
ただ、これだけでは IIS が 404 を返してしまうので Microsoft URL Rewrite Module 2.0 for IIS 7 (x64) をインストールしてURL のリライトができるようにする必要があります。
インストールが完了すると、IIS マネージャに URL Rewrite が追加されます。設定方法に関してはこちらのページでとてもわかりやすく解説されています。
tDiary で使用する場合は以下の 3 パターンを追加しておくとよいと思います。
- ^([\d]{8}).html$ を index.rb?date={R:1} に書き換える (日単位表示ページ用)
- ^([\d]{6}).html$ を index.rb?date={R:1} に書き換える (月単位表示ページ用)
- ^([\d]{8}-\d).html$ を index.rb?date={R:1} に書き換える (「前 X 日分」表示ページ用)
†1 この追加で一部機能に影響が出ます。