Playで作ったサービスをサブディレクトリに配置する方法
梅雨入りして気分までじめじめしてます。
今日試してたのはPlayで作ったサービスをサブディレクトリレベルで複数配置する方法です。
Play frameworkでサービスを作ると、ApacheをフロントにしてReverseProxyを利用して裏側のNettyで動いてるPlay frameworkのサービスへ転送する、という仕組みになるのが普通だと思います。
そこで、ReverseProxyでディレクトリごとに振ろうとしたらなぜか色々苦労したのでその方法だけメモしておきます。
今日試してたのはPlayで作ったサービスをサブディレクトリレベルで複数配置する方法です。
Play frameworkでサービスを作ると、ApacheをフロントにしてReverseProxyを利用して裏側のNettyで動いてるPlay frameworkのサービスへ転送する、という仕組みになるのが普通だと思います。
そこで、ReverseProxyでディレクトリごとに振ろうとしたらなぜか色々苦労したのでその方法だけメモしておきます。
1.普通にReverseProxyやろうとした
最初は普通に
<VirtualHost *:80> ServerName foo.net ProxyPreserveHost On ProxyPass /bar http://127.0.0.1:9000 ProxyPassReverse /bar http://127.0.0.1:9000 </VirtualHost>
とかやってみたんです。
ところが、これでfoo.net/bar/ にアクセスすると、なぜかhttp://foo.net/loginにリダイレクトされてしまう。
ログイン認証付きページなので、ログインせずにアクセスすると/loginにリダイレクトする処理を入れていたのですが、まさかこうなるとは。
ところが、これでfoo.net/bar/ にアクセスすると、なぜかhttp://foo.net/loginにリダイレクトされてしまう。
ログイン認証付きページなので、ログインせずにアクセスすると/loginにリダイレクトする処理を入れていたのですが、まさかこうなるとは。
2.routesいじってみた
ちょっとググったらStackOverflowに「そのサブディレクトリ名付きでroutes書けばいいんでね」みたいな記述があったのでとりあえずroutesの記述を全部"/bar/login"のようにサブディレクトリ付きで記述。
そして、
そして、
play compile start
さぁ、これでアクセスできるかな?とfoo.net/bar/にアクセス。すると・・・
404 Not Found
3.で、どういうRequestが送られてるのか調べてみた。
Global.javaのonHandlerNotFound()メソッドを以下のように記述。
public Result onHandlerNotFound(Http.RequestHeader request) { Logger.info("not found : "request.uri()); return notFound(notFound.render()); }
で、ログ見ながらfoo.net/bar/notexistのように存在しないアドレスを叩いてみると・・・
[info] application - not found : /notexist
普通に前部分が消去されるだけで通ってます。
4.これに対応するようroutesとhttpd.confを書き換えてみる
これらを踏まえて、
httpd.conf
<VirtualHost *:80> ServerName foo.net ProxyPreserveHost On ProxyPass /bar http://127.0.0.1:9000/bar ProxyPassReverse /bar http://127.0.0.1:9000/bar </VirtualHost>
routes
GET /bar/ controllers.Anonymous.index() GET /bar/login controllers.Anonymous.initForm()
という感じにすべて書き換え。
これで事なきを得ました。
サブディレクトリ配置の際にはroutesに気を使わないといけないので、要注意ですね。
でもほんとはもっといい方法がありそう・・・
これで事なきを得ました。
サブディレクトリ配置の際にはroutesに気を使わないといけないので、要注意ですね。
でもほんとはもっといい方法がありそう・・・
コメント
0 件のコメント :
コメントを投稿