Lighttpd-Catalyst Technique

Shibuya.pm tech talk #7

October 19th, 2006

Light footprint + httpd = LightTPD

LightTPD?

"Lighty"

特徴

...

特徴

...

特徴

...

特徴

...

特徴

...

特徴

最小設定 lighttpd.conf

server.document-root = "/path/to/root"
server.port = 80

最小設定 lighttpd.conf

server.document-root = "/path/to/root"
# server.port = 80

特徴

...

特徴

Lighttpd x perl

Fastcgi

fastcgi 特徴・利点

こんな感じ

fastcgi.server = (
  "/" => (
    ( "host" => "192.168.0.2", "port" => 3000 ),
    ( "host" => "192.168.0.3", "port" => 3000 ),
  ),
)

欠点

fastcgi設定

2通りの動かし方

1. Internal server

fastcgi.server = (
    "" => ((
        "bin-path" => "../MyApp/script/myapp_fastcgi.pl",
        "socket" => "/tmp/myapp_fastcgi.socket",
        "max-procs" => 1,
    ))
)

2. External server

./script/myapp_fastcgi.pl

でfastcgiプロセスをたちあげ、

fastcgi.server = (
    "" => ((
        "socket" => "/tmp/myapp_fastcgi.socket",
    ))
)

fastcgi.server = (
    "" => ((
        "host" => "10.0.0.2",
        "port" => 8080,
    ))
)

なんかめんどう

Catalyst アプリの fastcgi 設定はもっとめんどう

ディレクトリ構造の問題

$ catalyst.pl MyApp
created "MyApp"
created "MyApp/script"
created "MyApp/lib"
created "MyApp/root"

静的ファイルの出力

先ほどの例では、どのパスにアクセスしてもfastcgiが呼ばれてしまう。

解決法

server.document-root = "../MyApp/root"
alias.url += ( "/script/" => "../MyApp/script/", )

setenv.add-environment = (
    "SCRIPT_NAME" => "/",
)

url.rewrite-once = (
   "^/(?!favicon\.ico$|js/|css/|images?/|static/)(.*)"
       => "/script/myapp_fastcgi.pl/$1",
)

fastcgi.server = (
    "/script/myapp_fastcgi.pl" => ((
        "socket" => "/tmp/myapp_fastcgi.socket",
    ))
)

解決法2

server.document-root = "../MyApp/root"

setenv.add-environment = (
    "SCRIPT_NAME" => "/",
)

url.rewrite-once = (
   "^/(?!favicon\.ico$|js/|css/|images?/|static/)(.*)"
       => "/myapp/$1",
)

fastcgi.server = (
    "/myapp" => ((
        "socket" => "/tmp/myapp_fastcgi.socket",
        "check-local" => "disable",
    ))
)

解決法3 (not supported yet)

server.document-root = "../MyApp/root"

setenv.add-environment = (
    "SCRIPT_NAME" => "/",
)

server.error-handler-404 = "/myapp"

fastcgi.server = (
    "/myapp" => ((
        "socket" => "/tmp/myapp_fastcgi.socket",
"check-local" => "disable",
    ))
)

どっちにしろめんどう

自動化したい

しました

Catalyst::Helper::Lighttpd

ソース

http://svn.unknownplace.org/public/library/perl/trunk/Catalyst-Helper-Lighttpd/

解決法

server.document-root = "../MyApp/root"
alias.url += ( "/script/" => "../MyApp/script/", )

setenv.add-environment = (
    "SCRIPT_NAME" => "/",
)

url.rewrite-once = (
   "^/(?!favicon\.ico$|js/|css/|images?/|static/)(.*)"
       => "/script/myapp_fastcgi.pl/$1",
)

fastcgi.server = (
    "/script/myapp_fastcgi.pl" => ((
        "socket" => "/tmp/myapp_fastcgi.socket",
    ))
)

解決法2

server.document-root = "../MyApp/root"

setenv.add-environment = (
    "SCRIPT_NAME" => "/",
)

url.rewrite-once = (
   "^/(?!favicon\.ico$|js/|css/|images?/|static/)(.*)"
       => "/myapp/$1",
)

fastcgi.server = (
    "/myapp" => ((
        "socket" => "/tmp/myapp_fastcgi.socket",
        "check-local" => "disable",
    ))
)

解決法3 (not supported yet)

server.document-root = "../MyApp/root"

setenv.add-environment = (
    "SCRIPT_NAME" => "/",
)

server.error-handler-404 = "/myapp"

fastcgi.server = (
    "/myapp" => ((
        "socket" => "/tmp/myapp_fastcgi.socket",
"check-local" => "disable",
    ))
)

こうかけます

include_shell
    "/path/to/MyApp/script/myapp_lighttpd.pl -p"

Demo

実際の設定

http://example.com/ で使いたい!

$HTTP["host"] =~ "^(www\.)?example\.com$" {
    include_shell
        "/path/to/MyApp/script/myapp_lighttpd.pl -p"
}

実際の設定

http://example.com/myapp/ で使いたい!

$HTTP["host"] =~ "^(www\.)?example\.com$" {
    server.document-root = "/path/to/root"

    include_shell
        "/path/to/MyApp/script/myapp_lighttpd.pl \
           --root /myapp -p"
}

lightyをスターンドアローンで動かせばテストサーバー代わりになるんじゃね?

Catalyst組み込みサーバーの問題

...

Catalyst組み込みサーバーの問題

...

Catalyst組み込みサーバーの問題

...

Catalyst組み込みサーバーの問題

...

Catalyst組み込みサーバーの問題

Lightyを使った場合

...

Lightyを使った場合

...

Lightyを使った場合

...

Lightyを使った場合

...

Lightyを使った場合

方法

...

方法

...

方法

...

方法

これもHelper::Lighttpdでできる

Demo

でてきたlighty tipsまとめ

...

でてきたlighty tipsまとめ

...

でてきたlighty tipsまとめ

...

でてきたlighty tipsまとめ

...

でてきたlighty tipsまとめ

...

でてきたlighty tipsまとめ

その他の機能

X-Sendfile

mod_fastcgi や mod_proxy で lighty に

X-Sendfile: /path/to/file

というヘッダを返すとレスポンスBodyをそのfileで置き換えてくれる機能。

...

X-Sendfile

mod_fastcgi や mod_proxy で lighty に

X-Sendfile: /path/to/file

というヘッダを返すとレスポンスBodyをそのfileで置き換えてくれる機能。

Catalyst::Plugin::XSendfile を使うと

$c->res->sendfile( '/path/to/file' );

でOK!

X-Rewrite-*

mod_proxy 経由で lighty に

X-Rewrite-Host: 10.0.0.3
X-Rewrite-URI: /path/to/file

というヘッダを返すとするとレスポンスBodyを http://10.0.0.3/path/to/file の内容に置き換えてくれる機能。

fastcgiでは使えないみたい。

サービス使用例

...

サービス使用例

Lighty + Catalyst + X-Sendfile + MogileFS

まとめ

...

まとめ

...

まとめ

...

まとめ

...

まとめ

...

まとめ

Thank you!