しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Windows Azure Web サイトで Ruby を動かしてみた(CGI 編)

タイトルの通りですが、Windows Azure Web サイト上でも Ruby が動かないかなと思ったので、実際に試してみました。

既に @superriver さんが Developer Camp でデモされていたように、動くことはわかっていました。結果としては以下の画像の通り、Web サイトでも Ruby は動作しました。

f:id:shiba-yan:20140203221750p:plain

自分は Ruby 書けないので、tDiary を持ってきました。

tDiary 自体のコードは全く弄っていないですが、一応 CGI モードであれば Web サイトでも動作しましたので、一応手順だけは残しておこうかと思います。

必要なもの

  • Windows 版 Ruby のバイナリ
  • Windows Azure Web サイト標準インスタンス

Windows 版 Ruby は公式で配布されてはいないので、有志がビルドしてくれたものを使います。今回は割と有名そうな RubyInstaller の 7z 版をダウンロードしてきました。

http://rubyinstaller.org/downloads/

展開したものを Visual Studio の Web サイトプロジェクトに全て突っ込みます。ディレクトリは一応 ruby2 という風に切りました。

これから IIS 側の設定を行っていくのですが、田口さんの記事をそのまま参考にさせて頂きました。さすが安心と信頼の TaaS ですね。

Azure の Worker Role で Ruby を使う(HWC版) | たんたか

実際、これからは Web サイトでどうやってこの設定を実現するかという話になります。

Web.config を追加

めんどくさくなってきたので、動作した設定を丸っと載せておきますね。特に難しいことは書いておらず、CgiModule の設定を追加しているだけです。

<?xml version="1.0" encoding="utf-8"?>

<configuration>
  <system.webServer>
    <handlers>
      <add name="RubyCGI"
           verb="*" path="*.rb"
           modules="CgiModule"
           scriptProcessor='D:\home\site\wwwroot\ruby2\bin\ruby.exe "%s" %s'
           resourceType='Unspecified' />
    </handlers>
    <cgi createProcessAsUser="false"/>
  </system.webServer>
</configuration>

注意点としては、Ruby 周りのバイナリを Web 発行でデプロイしただけでは ACL 周りでエラーになってしまったので、cgi 要素の createProcessAsUser を false にしています。

これで Ruby のバイナリは IIS のユーザーで実行されるはずです。

Site Extension を作成

田口さんの記事では applicationHost.config の isapiCgiRestriction 要素内に設定を追加する必要があると説明されてますが、Web サイトでは当然ながら簡単に applicationHost.config は触ることが出来ません。

なので、仕方がないので唯一 applicationHost.config を編集可能な Site Extension を作成して対応することにしました。Site Extension に関しては No.1 の記事が詳しいので、そちらを参照してください。

Windows Azure Web Sitesの魅力を120%引き出す | ブチザッキ

一応簡単に説明しておくと、Site Extension を動作させるために Kudu では applicationHost.config を XDT で修正することが可能になっています。

今回はその機能を使って isapiCgiRestriction 要素の修正を行います。

<?xml version="1.0" encoding="utf-8"?>

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <security>
      <isapiCgiRestriction> 
        <add path='D:\home\site\wwwroot\ruby2\bin\ruby.exe "%s" %s' allowed="true" xdt:Transform="Insert" />
      </isapiCgiRestriction>
    </security>
  </system.webServer>
</configuration>

この XDT 定義を applicationHost.xdt というファイル名で保存し、SiteExtensions フォルダ内に保存して管理ポータルから設定すれば完了です。詳しくは No.1 の記事を見てください!!

動かしてみた

f:id:shiba-yan:20140203230303p:plain

適当に Ruby のバージョン情報を表示するだけのコードを追加して実行してみました。

そして冒頭で出した tDiary ですが、このプロジェクトに配布されているコードを全て上書きするだけで動作してくれました。非常に簡単ですね。

残念なところ

CGI で動作という点からわかる人は多いと思いますが、パフォーマンスが非常に悪いです。もう完全に色々とお察しくださいというレベルです。

Fast CGI を使って動作させることが出来ればもう少し改善する気がするので、次は Fast CGI 編を書けるように検証しておきたいと思います。Rails が動くところまで持っていければいいですね。