lighttpdではサブディレクトリつきのURLでのアクセスができずぐんにょり(kwsk)
先のエントリでlighttpdではサブディレクトリつきのURLでアクセスできずにぐんにょりした話の続きです。APサーバとWebサーバの分離という話の中で書いたので、問題点がわかりづらくなってしまってました。ということで試行錯誤の状況をちょっとまとめました。コメント|TB募集です。
やりたいこと
lighttpdでサブディレクトリごとに複数のrailsアプリを配置して使いたい。配置はaliasを使いたい。
- http://example.com/hoge_rails_appではhoge_rails_appを使いたい。
- http://example.com/foo_rails_appではfoo_rails_appを使いたい。
- hoge_rails_appとfoo_rails_appはまったく別物。できる限り相互干渉をなくしたい。
調べたこと
- Apache + fcgiではpublic/.htaccess内のReWriteBaseをコメントアウトすると動く。
- サブディレクトリ無しのlighttpdではconfig/lighttpd.confにあるように、server.error-handler-404 = "/dispatch.fcgi"を設定することで動く。
- URLマッチングを用いて下記のように設定するとdispatch.fcgiまではたどり着くものの、/saihu/bookshelf/listをrouteする定義がないよ、というRoutingErrorが発生してしまって動かない。*1
[/etc/lighttpd/lighttpd.conf] alias.url = ("/saihu/" => "/var/webapp/saihu/current/public/" ) $HTTP["url"] =~ "/^saihu/" { server.error-handler-404 = "/saihu/dispatch.fcgi" } fastcgi.server = ( "/saihu/dispatch.fcgi" => ( "remote_ap_server" => ( "host" => "192.168.10.2", "port" => 7000) ) )
で、APサーバ側ではfcgiプロセスを起動します。
$ ruby script/process/spinner -c 'ruby script/process/spawner -p 7000'
ブラウザからアクセスしてみると File not Found の文字。APサーバ側のproductionログには以下のような非情なエラーがありました。
[path/to/saihu/log/production.log] ActionController::RoutingError (Recognition failed for "/saihu/login"): (略)
Apacheの場合、サブディレクトリ以下のrailsアプリを動かすにはpublic/.htaccessないのReWriteBaseが重要な役割を果たしてたな、と思って検索するとlighttpdの「Migrating from Apache」というページを発見しました。
[/etc/lighttpd/lighttpd.conf] $HTTP["url"] =~ "/^saihu/" { server.error-handler-404 = "/saihu/dispatch.fcgi" url.rewrite-once = ("^/saihu/(.*)" => "saihu/dispatch.fcgi" ) }
としても同様のエラー*2。
さらにさらに、saihu/dispatch.fcgiが認識できないならハンドラをdispatch.fcgiって名前にすればいいじゃない。ということで下記でやってみました。
[/etc/lighttpd/lighttpd.conf] $HTTP["url"] =~ "/^saihu/" { server.error-handler-404 = "/saihu/dispatch.fcgi" url.rewrite-once = ("^/saihu/" => "/dispatch.fcgi" ) } fastcgi.server = ( "dispatch.fcgi" => (略)
予想通りダメです。上と同じエラー。
さらに無謀な試みは続きます。
[/etc/lighttpd/lighttpd.conf] $HTTP["url"] =~ "/^saihu/" { server.document-root = "/var/webapp/saihu/current/public/" server.error-handler-404 = "/dispatch.fcgi" }
予想通りダメです。上と同(略
で、結局rails側に渡るREQUEST_URIの問題なんで、config/deploy.rbを下記のように書き換えたところ、アプリ側は一部動くもののCSSとか画像とか(public/(images/stylesheets/javascripts))のパスがうまく置き換わらず、さらに他のrouteのパターンで指定している分は動きません。
[config/routes.rb] map.connect '/saihu/login', :controller => "login", :action => "login" map.connect '/saihu/:controller/:action/:id'
という感じでじたばたして、昨日のぐんにょりに続いています。
捨てゼリフ
それでも以下のパターンは動いたので、次回のrails勉強会のセッション枠が明日いっぱいまで余っているようならこのへんの話で立候補したいかなぁ、と思ってます。
- lighttpd(DocumentRootはrailsアプリのpublic) + lighttpdの起動するfcgi
- lighttpd(DocumentRootはrailsアプリのpublic) + 外部APサーバのfcgi
- Apache2(DocumentRootはrailsアプリのpublic) + lighttpdの起動するfcgi
- Apache2(DocumentRootはrailsアプリのpublic) + 外部APサーバのfcgi
- Apache2(railsアプリのpublicはaliasで指定) + lighttpdの起動するfcgi
- Apache2(railsアプリのpublicはaliasで指定) + 外部APサーバのfcgi
このへん、すでにlighttpdでうまく動いているという方がいればコメントやTBや勉強会の場で教えていただけるとありがたいです。