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直下にファイルを置いた場合、設定ファイルの書き換えが必要になりますが、不要なものが置かれないようアプリケーション開発者やオペレーションエンジニアが確認できるのでいいと思っています。

このブログ記事について

このページは、Masahiro Naganoが2011年1月27日 15:34に書いたブログ記事です。

ひとつ前のブログ記事は「再掲: mod_proxyのretryを2段階にするpatch 」です。

次のブログ記事は「既にある正規表現を case-insensitive にする」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja