起こったこと
Play で作ったサービスを nginx を使って、サブディレクトリに置きたかったんですが、その際に嵌ったので記録しておきます。
例えば、http://example.com/myapp/ にアクセスした時に、サービス自体にはアクセスできるのですが、css とか js とかの assets の類で404が出てしまいました。
その時の nginx の設定ファイルはこんな感じ。
upstream play_app {
server example.com:9000;
}
server {
listen 80;
server_name example.com;
location /myapp/ {
proxy_pass http://play_app;
}
}
トップページ自体にはアクセス可能ですが、assets へのパスが、http://example.com/assets/javascripts/index.js のようになってしまい、404が出てしまっていました。
どうしたか
基本的には、以下の記事のとおりにすれば、解決出来ました。
http://nil639.blogspot.jp/2013/06/play.html
記事では、Apache を使っていますが nginx 的に書くと、上記のdefault.confを次のように書き換えます。
upstream play_app {
server example.com:9000;
}
server {
listen 80;
server_name example.com;
location /myapp/ {
proxy_pass http://play_app/myapp;
}
}
その上で、 play の conf/application.confで、application.contextを指定します。
application.context = "/myapp"
※追記 (2015/02/19 12:48)
確認したらちゃんと動いてなかったので再度検証しました。
最後に/を入れないとうまく行きませんでした。
application.context = "/myapp/"
※追記(2015/02/19 19:57)
もう少し調べてみたら、activator run等のコマンドを実行するタイミングで指定することもできるようです。
activator run -Dapplication.context="/myapp/"
application.contextを指定すると、全ての route の先頭に prefix がつくようになるので、記事のように全て指定しなくても大丈夫です。
ここまでやると、例えばhttp://example.com/myapp/にアクセスすると、サービスの /myapp に渡されます。assets のパスはhttp://example.com/myapp/assets/javascripts/index.jsになりますので、サービスの /myapp/assets/javascripts/index.jsに渡されるようになり、今度はちゃんとアクセスできます。
これで、無事解決しました。
おわりに
あとは、activator run等のコマンドを打った時に、application.contextを指定することができれば、サービスの設定ファイルをいじらなくても、nginx の設定を変更するだけでここまでの作業が可能になるのですが、そのあたりのやり方がよくわかりません。
というより、Scala と Play 自体もあまりよくわかっていないのでそのあたりからちゃーんと勉強が必要そうです。