fastcgiだけ再起動したい場合に、再起動中にアクセスあるとfastcgiプロセスが上がったあとも500になってしまうことがあるのだけど、みんなどうしてる?
fastcgiだけ再起動したい場合に、再起動中にアクセスあるとfastcgiプロセスが上がったあとも500になってしまうことがあるのだけど、みんなどうしてる?
学生さんのcatアプリ見せてもらった。なんかすごいがんばってた。
Chainedアクションがないころのなのか、/wiki/{pagename}/edit とかそれ系のコントローラを Regex コントローラでがんばってたりしてた。
Plugin::Images とかつかってた。しらんかった。なんかあれだなーと思ったら作者見て納得。nothingmuch のか。
Plugin::Static::Simple とかは使わないほうがいいよ。静的ファイルはサーバー直でやんないと無駄。ロードするだけですらッ!
それで思い出したけど、lighttpdの設定、最近 mod_alias も mod_setenv も mod_rewrite もつかわない書式を思いついて使ってる。
$HTTP["url"] =~ "^/(?!favicon\.ico$|static/|js/|css/|images?/)" {
fastcgi.server = (
"" => (
( "socket" => "/path/to/myapp.socket",
"check-local" => "disable", ),
),
)
}
こんなの。
とにかく、技術はどうあれ、作ってみる、形にするってことはやっぱり重要だなと思った。口だけなら何でもいえる。
1.5 動いた記念。
http://svn.unknownplace.org/public/library/perl/trunk/Catalyst-Plugin-XSendFile/
Plugin::XSendFile をアップデート。あとでdevリリースでCPANに。
# myapp.yml
sendfile:
tempdir: /dev/shm
して
use Catalyst qw/XSendFile/;
するだけで、出力が 16kbyte 以上のときは自動で X-LIGHTTPD-send-tempfile 経由での出力になるって感じ。
16kbyte って閾値と、それ以前に勝手にsendfileるのは設定できるようにしたほうが良いな。ま、おいおい。
んで、確かに速いんだけど、なんか不安定。ベンチってたんだけど fastcgi プロセス反応なくなるときがある。
XSendFile の使用有無にかかわらずそうなのでfastcgiサポート自体の問題くさいけどよくわからない。
新しいのでてたのでリベンジ。
server.modules = (
"mod_proxy_core",
"mod_proxy_backend_fastcgi",
)
server.document-root = "/home/typester/tmp/MyApp/root"
server.port = 3000
proxy-core.balancer = "round-robin"
proxy-core.protocol = "fastcgi"
proxy-core.backends = ( "unix:/home/typester/tmp/MyApp/fcgi.socket" )
でとりあえずMyApp動いた。
バックエンドがひとつの場合でも proxy-core.balancer を必ず指定しないといけないようだ。でないと
mod_proxy_core.c.1550: (trace) backlog: all backends are down, putting /foo (4) into the backlog
といわれてしまう。
この間はそれでできなかっただけかも!
X-Rewrite-* や X-LIGHTTPD-send-tempfile など楽しげな機能でやっと遊べる><
あと mod_uploadprogress のソースもついてきていて、configureスクリプトの do_build のところに追加で書いてみたらビルドできた。これでも遊んでみたい。
fastcgiを動かせないオレガイル。
# lighttpd.conf
proxy-core.protocol = "fastcgi"
proxy-core.backends = ( "127.0.0.1:3001" )
で、
./script/myapp_fastcgi.pl -l 127.0.0.1:3001
でfcgi起動後アクセスすると
mod_proxy_core.c.1288: (trace) backlog: all backends are down, putting / (4) into the backlog
なんで?><
付属の spawn-fcgi でfastcgiプロセス起動しても結果は同じ。
全ログ
mod_proxy_core_address.c.136: (trace) resolving 127.0.0.1 on port 3001
mod_proxy_core_address.c.63: (trace) adding 127.0.0.1:3001 to the address-pool
log.c.139: (trace) server started
mod_proxy_core.c.1288: (trace) backlog: all backends are down, putting / (4) into the backlog
$HTTP["host"] == "rt.unknownplace.org" {
server.document-root = "/usr/local/rt3/share/html"
server.errorlog = "/var/log/lighttpd/rt-error.log"
accesslog.filename = "/var/log/lighttpd/rt-access.log"
setenv.add-environment = (
"SCRIPT_NAME" => "/",
)
url.rewrite-once = (
"^/(?!NoAuth/images/)(.*)" => "/rt3/$1",
)
fastcgi.server = (
"/rt3" => ((
"bin-path" => "/usr/local/rt3/bin/mason_handler.fcgi",
"socket" => "/tmp/rt.socket",
"max-procs" => 1,
"check-local" => "disable",
))
)
}
/usr/local/rt3 に入れた場合。
MIME::Types が入ってたらそっからがーって mimetype.assign をはくようにした。
てけとう。
でも、mime-typeが指定されてなくて困るのは、FirefoxでCSSが適用されないってぐらいな気がするというかそんな感じなのでとりあえずこれで。
-dオプションもつけた。-Debug してなくてもデバッグ出力できるやつ。まぁserver.plと同じ。
$ ./script/myapp_lighttpd.pl -l /usr/sbin/lighttpd -d
2006-09-09 15:45:39: (log.c.75) server started
[debug] Debug messages enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::ConfigLoader 0.13 |
| Catalyst::Plugin::Static::Simple 0.14 |
'----------------------------------------------------------------------------'
[debug] Loaded dispatcher "Catalyst::Dispatcher"
[debug] Loaded engine "Catalyst::Engine::FastCGI"
[debug] Found home "/home/typester/tmp/MyApp"
[debug] Loaded Config "/home/typester/tmp/MyApp/myapp.yml"
[debug] Loaded components:
.-----------------------------------------------------------------+----------.
| Class | Type |
+-----------------------------------------------------------------+----------+
| MyApp::Controller::Root | instance |
'-----------------------------------------------------------------+----------'
[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private | Class | Method |
+----------------------+--------------------------------------+--------------+
| /default | MyApp::Controller::Root | default |
| /end | MyApp::Controller::Root | end |
'----------------------+--------------------------------------+--------------'
[info] MyApp powered by Catalyst 5.7001
Yes! YEs!
あとは静的ファイルの mime-types をちゃんとサポートすれば、server.plいらない気がする。
perl -d するとき以外は。
2006-09-09 14:58:36: (connections.c.1422) Warning: Either the error-handler returned status 404 or the error-handler itself was not found: /script/myapp_fastcgi.pl
2006-09-09 14:58:36: (connections.c.1424) returning the original status 404
2006-09-09 14:58:36: (connections.c.1426) If this is a rails app: check your production.log
とか言われるわけだが、404を返す正しい方法が何かあるのだろうか?
lightyのX-SendfileをCatalystから使うプラグインをつくった。
$c->res->sendfile("/path/to/file");
って感じで使えます。同じインタフェースでCatalystテストサーバーの時でも動くようになってます。
miyagawaさんの話だとperlbalでも同じようなことが出来るとのこと(もっと高機能)。でさらにそれにmogilefsを組み合わせるとかなりスケーラビリティが高そうな感じ。
ちょっと見てみるべきかなぁ。
* fixed handling of error codes returned by mod_dav_svn behing a mod_proxy
ってなってて、やっと mod_proxy で OPTIONS 通らないのなおったぽい。
これでやっとフロント lighty にできる!
Page 1 of 2: 1 2