PSGIアプリケーションをリバースプロキシ下で使う際の静的コンテンツの配信は、リバースプロキシー側で行う事が多いと思うのですが、こうやるのが良いんじゃないかという案。
プロジェクトのトップディレクトリにhtdocsを作成し、その中にfavicon.ico、staticディレクトリをいれます
$ ls -l /path/to/myproj/htdocs
Total xxx
-rw-r--r-- 1 user user 1406 Jun 30 2010 favicon.ico
drwxr-xr-x 6 user user 204 Jan 21 16:39 static
$ ls -l /path/to/myproj/htdocs/static
Total xxx
drwxr-xr-x 4 user user 136 Jun 30 2010 css
drwxr-xr-x 11 user user 374 Jan 21 16:39 js
drwxr-xr-x 4 user user 136 Jul 22 2010 image
static下にcssやjs、画像を格納します。
psgiファイルではPlack::Middleware::Staticで下記の様に指定します。
use Plack::Builder;
builder {
enable 'Plack::Middleware::Static',
path => qr{^/(favicon\.ico$|static/)},
root => $config->root_dir->subdir('htdocs')
$app
};
htdocsディレクトリをrootディレクトリとして、/favicon.icoと/staticをマッピングします。htdocs以下に直接cssやjsディレクトリを置いてしまうとfavicon.icoやcrossdomain.xmlを置く場所がなくなるのでこっちのほうがおすすめかと。
本番環境では上位のリバースプロキシにてfaviconやstaticファイルを配信するので、Apacheであれば
<VirtualHost _default_:80>
<Proxy balancer://myproj-apps>
BalancerMember http://127.0.0.1:5000
...
</Proxy>
DocumentRoot /path/to/myproj/htdocs
<Directory /path/to/myproj/htdocs>
Order allow,deny
Allow from all
</Direcotry>
RewriteEngine on
RewriteCond REQUEST_URI ! ^/favicon\.ico$
RewriteCond REQUEST_URI ! ^/static/
RewriteRule /(.*)$ balancer://myproj-apps/$1 [P]
</VirtualHost>
などと、DocumentRootにhtdocsディレクトリを指定して、静的ファイル以外をアプリケーションサーバに振り分けるようRewriteCond/RewriteRuleを書きます。crossdomain.xmlなどが必要な場合はそれもくわえます。
ProxyPassで書きたい場合は、
ProxyPass /favicon.ico !
ProxyPass /static/ !
ProxyPass / balancer://myproj-apps/
となります。path の後ろに「!」を付けるとProxyしなくなります。
htdocs直下にファイルを置いた場合、設定ファイルの書き換えが必要になりますが、不要なものが置かれないようアプリケーション開発者やオペレーションエンジニアが確認できるのでいいと思っています。