Jettyで動いている複数のアプリをNginxで1サイトのパスに紐付ける

背景

  • 訳あって複数のアプリをJettyのプロセスを分けて動かしてます。
    • 1アプリ=1Jettyプロセスになっていて複数のアプリがあります。理由があってやってるのでこれはしかたがない。
    • そうするとポート番号がいっぱい増えて分かりにくいので80番にまとめたい。
    • まあ、オンプレのシステムなんですけどね・・・。
    • こんな感じ
http://example.com:8081/context/ → http://example.com/context/1/
http://example.com:8082/context/ → http://example.com/context/2/
http://example.com:8083/context/ → http://example.com/context/3/

設定でハマった所

  • Nginxのリバースプロキシを設定するときにproxy_passのところでJettyのContextPathとlocationのパスが違ってもいいのかと思っていたんですが、どうも合わせないと上手く動きませんでした。
    • rewriteとか使えば別のやり方でもいけるのかもしれないですが、できればrewriteはあんまり使いたくないし。

Nginxの設定

  • 元々のJettyのContextPathと違う値なので注意。(後でJettyの設定でこちらに合わせる)
http {
  upstream context_1 {
    server 127.0.0.1:8081;
  }
  upstream context_2 {
    server 127.0.0.1:8082;
  }
  upstream context_3 {
    server 127.0.0.1:8083;
  }

  server {
    location /context/1/ {
      proxy_pass      http://context_1/context/1/
      proxy_redirect  default;
    }
    location /context/2/ {
      proxy_pass      http://context_2/context/2/
      proxy_redirect  default;
    }
    location /context/3/ {
      proxy_pass      http://context_3/context/3/
      proxy_redirect  default;
    }
}

Jettyの設定

  • ContextPathをNginxの設定に合わせる。
    • webappsにcontext.xmlを作成(webapps配下にあるcontext名とxml名を合わせてあります)
    • Warは使ってないのでresourceBaseで設定してます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/context/1</Set>
    <Set name="resourceBase"><Property name="jetty.webapps" default="."/>/context</Set>
</Configure>
  • この設定を全部のJettyにしておく。

これでやりたいことが出来ました!(書くとたいしたことないけど結構ハマったのだ)