# Apollo for win32 Apache

Ruby を組み込む Apache モジュールです。つまりこれは Delphi で作った mod_ruby です。

  このモジュールは Phi に対応しています。といいますか、このモジュールは原理的に

      require 'phi'
      require 'web'
      module Web
        MODULE = Module.new APPLICATION
        PRODUCER = PageProducer.new MODULE
      end
      load 'web_init.rb'

  と等価です。

## 必要なもの

- mswin32 版 Apache
  http://www.apache.org/
- mswin32 版 Ruby-1.6.6
  ActiveScriptRuby なら WebSnap で ScriptEngine として Ruby を利用できるようになります。
- Apollo 0.631+
  この + が大事なのだよ ( まだ公開していないから ^^;) 。
  注意: Apollo 0.631+ は rbconfig.rb を使います。
- Delphi6 実行時ライブラリ
  Apollo の MSI 配布を使うと導入できます。

## install

1. Apollo.so が Apache module です。`$(Apollo)\bin\apache` にあります。これを `$(Apache)\modules` フォルダに置きます。
2. `conf/http.conf` の最後に以下の設定行を追加します。

       LoadModule Apollo_module modules/Apollo.so
       <Location /Apollo>
         SetHandler apollo-handler
       </Location>

3. CGI を使う場合はデフォルトの設定行を少し修正します。

           ScriptAlias /cgi-bin/ "D:/Apache/cgi-bin/"

           <Directory "D:/Apache/cgi-bin">
               AllowOverride Options
               Options +ExecCGI
               Order allow,deny
               Allow from all
           </Directory>
           AddHandler cgi-script cgi

## 起動

- Apache
  WindowsME Apache-1.3.23 なら DOS Prompt から起動します。

      D:\Apache>Apache -t

  でモジュールの起動を試しましょう。

      D:\Apache>Apache

  で起動できます。終了は Ctrl+C です。モジュールを使っていると終了時に待たされます。
- http://localhost/Apollo/
  Apollo の Apache module を起動します。一度起動すると常駐します。
  この URL の後ろに PATH_INFO をつけると Apollo.so は、 `$(Apollo)\htdocs` に置かれた HTML ファイルを読み込み、 Ruby スクリプトを評価します。
  `http://localhost/Apollo/foo/bar`
  であれば
  `$(Apollo)\htdocs\foo\bar.html` が存在すればこれを読み込み、(`Web::PRODUCER.htmlfile`)
  `$(Apollo)\htdocs\foo\bar.rb` が存在すればこれを評価します。(`load`)
  ただしこれは web_init.rb で実装されている機能です。あなたの好きなように自由に実装し直すことができます。
- InterBase DB/
  RDB:module を Web:module と組み合わせると 3 層アプリぽくて楽しいですが、まだかなり不安定です。
  Database, Query などのオブジェクトはひとつだけ作って使い回ししたほうが良いでしょう。
- ERbLight db_erb
  ERb を導入しておくと便利です。Delphi の PageProducer は捨ての方向で。
- SystemStackError
  更新を連続して行うと ( IE で F5 を押しっぱなしにしてみよ ) stack level deep で不正な処理になることがあります..いや、間違いなくあります。それでも最近の Apache はモジュールを再起動してくれるようです。しかしやはり Apache 自体を再起動したほうが良いです。
- ログ表示
  デバッグのために Ruby 出力を上部に表示するようにしてみました。
  読み込み違反など怪しげな例外が上がってきたら、ためらうことなく Apache を再起動したほうが良いです。
- http://localhost/cgi-bin/ap.exe/
  CGI として使えるバイナリ ap.exe を用意しました。そんなん ruby.exe を使えばいいやん、というのは禁句です。このバイナリの利点は Apache module, ISAPI, CGI で API が共通なこと。
  CGI は毎回 Ruby を初期化することになるので、重いですが安定しています。

## 使用するファイル

- Apollo.so
  Apache module
- phi.rb, phi.so
  Phi (VCL の Ruby 拡張ライブラリ)
  Apollo.so から呼ばれます。(`require`)
  phi.so は phi.rb から呼ばれます。(`require`)
- web.rb, web.so
  Phi 拡張ライブラリ
  Apollo.so から呼ばれます。(`require`)
  web.so は web.rb から呼ばれます。(`require`)
- web_init.rb
  Apollo.so から呼ばれます。(`load`)
- logs/apollo.log
  Apollo.so のデバッグ出力
  web_init.rb で開かれます。(`open`)
- `$(Apollo)\htdocs\index.html`
  このファイル ( 正確には HTML は Pi で生成されています ) 。
  WebBroker の透過タグ `<#tagname key=value>` を使えます。
  もちろん eRuby や ERb も導入すれば使えます。
- `$(Apollo)\htdocs\index.rb`
  標準の web_init.rb では index.html を出力する前に index.rb を評価します。

# Web:module

  Web:module は WebBroker の Phi 拡張ライブラリです。

# Web::Application

# Web::Module

# Web::PageProducer

# Web::Request

# Web::Response

# Web::Cookie

# Web::CookieCollection