2011-12-05
Amon2のLarge flavorをDotCloudで動かしたら、staticファイルが参照できなかった。
Amon2のamon2-setup.pl --flavor=DotCloud,Largeで作ったスケルトンをDotCloudで動かしたら、staticの下にあるcssやjsファイルが参照できなかった。
解決どころか問題箇所の特定もできなかったが、とりあえず事象と怪しいところをメモっておく。
再現
以下の手順でスケルトンを作ってDotCloudに上げる。
$ amon2-setup.pl --flavor=DotCloud,Large LargeApp $ cd LargeApp $ dotcloud push largeapp ./
ログを見ると、static以下のファイルが見つからないと言われてる。
$ dotcloud logs largeapp.www
# tail -F /var/log/{supervisor,nginx}/*.log
==> /var/log/nginx/largeapp-default-www-0.error.log <==
2011/12/05 10:35:42 [error] 7602#0: *11 open() "/home/dotcloud/current/static/css/main.css" failed (2: No such file or directory), client: 10.192.170.48, server: largeapp-default-www-0, request: "GET /static/css/main.css?t=0 HTTP/1.0", host: "largeapp-hsksyusk.dotcloud.com", referrer: "http://largeapp-hsksyusk.dotcloud.com/"
ブラウザからソースを見ると、ここを見に行っているが、
URLマッピング
実際のディレクトリ構成としては、static/pcの下にある構成なのだけど、URLマッピングでstatic下にあるように見えるようにしているハズなので、たぶんマッピングがうまくいってないのであろう。
app.psgi
use strict;
use utf8;
use File::Spec;
use File::Basename;
use lib File::Spec->catdir(dirname(__FILE__), 'extlib', 'lib', 'perl5');
use lib File::Spec->catdir(dirname(__FILE__), 'lib');
use Plack::Builder;
use LargeApp::PC;
use Plack::Util;
use Plack::Builder;
builder {
mount '/admin/' => Plack::Util::load_psgi('admin.psgi');
mount '/' => Plack::Util::load_psgi('pc.psgi');
};
load_psgiで他のpsgiファイルを読んでいる。admin.psgiは管理画面を作る場合のマッピングで、普通にサービスにアクセスするのはpc.psgiで設定されている。
pc.psgi
use strict;
use utf8;
use File::Spec;
use File::Basename;
use lib File::Spec->catdir(dirname(__FILE__), 'extlib', 'lib', 'perl5');
use lib File::Spec->catdir(dirname(__FILE__), 'lib');
use Plack::Builder;
use LargeApp::PC;
use Plack::App::File;
use Plack::Util;
use Plack::Session::Store::DBI;
use Plack::Session::State::Cookie;
use DBI;
my $basedir = File::Spec->rel2abs(dirname(__FILE__));
my $db_config = LargeApp->config->{DBI} || die "Missing configuration for DBI";
{
my $c = LargeApp->new();
$c->setup_schema();
}
builder {
enable 'Plack::Middleware::Static',
path => qr{^(?:/robots\.txt|/favicon\.ico)$},
root => File::Spec->catdir(dirname(__FILE__), 'static', 'pc');
enable 'Plack::Middleware::ReverseProxy';
enable 'Plack::Middleware::Session',
store => Plack::Session::Store::DBI->new(
get_dbh => sub {
DBI->connect( @$db_config )
or die $DBI::errstr;
}
),
state => Plack::Session::State::Cookie->new(
httponly => 1,
);
mount '/static/' => Plack::App::File->new(root => File::Spec->catdir($basedir, 'static', 'pc'));
mount '/' => LargeApp::PC->to_app();
};
たぶんこのあたりのどこかが問題なんだろうと思うけど、全然わからないのでギブアップ。
ちなみにLarge flavorではなくBasic flavorだと、DotCloud上でも問題なく動く。こちらのapp.psgiはこんなです。
use strict;
use utf8;
use File::Spec;
use File::Basename;
use lib File::Spec->catdir(dirname(__FILE__), 'extlib', 'lib', 'perl5');
use lib File::Spec->catdir(dirname(__FILE__), 'lib');
use Plack::Builder;
use BasicApp::Web;
use BasicApp;
use Plack::Session::Store::DBI;
use Plack::Session::State::Cookie;
use DBI;
{
my $c = BasicApp->new();
$c->setup_schema();
}
my $db_config = BasicApp->config->{DBI} || die "Missing configuration for DBI";
builder {
enable 'Plack::Middleware::Static',
path => qr{^(?:/static/)},
root => File::Spec->catdir(dirname(__FILE__));
enable 'Plack::Middleware::Static',
path => qr{^(?:/robots\.txt|/favicon\.ico)$},
root => File::Spec->catdir(dirname(__FILE__), 'static');
enable 'Plack::Middleware::ReverseProxy';
enable 'Plack::Middleware::Session',
store => Plack::Session::Store::DBI->new(
get_dbh => sub {
DBI->connect( @$db_config )
or die $DBI::errstr;
}
),
state => Plack::Session::State::Cookie->new(
httponly => 1,
);
BasicApp::Web->to_app();
};
ちなみにローカルでplackupで動かすと、Largeでも問題なく表示できる。
なんでなんだぜ。
追記(2012/12/11)
id:tokuhiromさんからいただいたコメントを参考に、以下のファイルを作成したところ、staticのファイルが参照できるようになった。
nginx.conf
rewrite ^/static/(.*) /static/pc/$1 last;
このファイルをローカルのトップに置いて、git addしてgit commitしてdotcloud pushしたら、/home/dotcloud/current/nginx.confができてうまくいった。
でも/adminの方のstaticはどう参照させればいいのかわからない感じです。
- 23 http://search.minakoe.jp/rsss/rsss.asp?pid=221627&plp=1&pd=2008/09/30&lid=3969&nlp=1&sd=2008/09/30&base=20&blp=1&bd=2008/09/30&multi=1&qry=perl
- 5 http://search.minakoe.jp/rsss/rsss.asp?bd=2008/09/30&base=20&plp=1&blp=1&lid=3969&qry=perl&pd=2008/09/30&pid=221627&nlp=1&multi=1&sd=2008/09/30
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CC8QFjAB&url=http://d.hatena.ne.jp/hsksnote/20111205/1323095297&ei=bnZxT6vDHoKhmQW92cXdDw&usg=AFQjCNEtvXT136ev8M5CQ8E-h83ogBb-qw
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CDkQFjAD&url=http://d.hatena.ne.jp/hsksnote/20111205/1323095297&ei=7UN6T-qjI8fWmAX1ybTfAw&usg=AFQjCNEtvXT136ev8M5CQ8E-h83ogBb-qw&sig2=0nYSAaLdeo7JzrHnM8FB8Q
- 3 http://reader.livedoor.com/reader/
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CHoQFjAC&url=http://d.hatena.ne.jp/hsksnote/20111205/1323095297&ei=aZmqT_P7OaGEmQXTyMXhBA&usg=AFQjCNEtvXT136ev8M5CQ8E-h83ogBb-qw&sig2=LYtCII2-HNl3DdQsmKCdrQ
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=dotcloud static&source=web&cd=3&ved=0CDEQFjAC&url=http://d.hatena.ne.jp/hsksnote/20111205/1323095297&ei=Sh73TtvVKsn7mAX709SoAg&usg=AFQjCNEtvXT136ev8M5CQ8E-h83ogBb-qw&sig2=y5aHAtwUfFhCYyZouV4H0w
- 2 http://htn.to/CiCR3J
- 2 http://t.co/GxmCkk3P
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cts=1331391418346&ved=0CCYQFjAA&url=http://d.hatena.ne.jp/hsksnote/20111205/1323095297&ei=tWtbT8_dK8PtmAXjg_SqDw&usg=AFQjCNEtvXT136ev8M5CQ8E-h83ogBb-qw&sig2=cLMvYJQFsVlsRjCULCHgq


