Jenkins、Sonatype nexus を Apache のリバースプロキシ経由で使う
Java開発をしているプロジェクトでは、CIにJenkins、Mavenリポジトリ管理にSonatype Nuxusを使っている人が多いと思います。
ていうか、使うとすごく開発効率上がるので使うべき。
で、私も両方使っているのですが、これらをApacheのバックで使う時微妙にはまることがあるのでその辺の話。
面倒が起きるのは、Apacheをフロントに置いてそのバックにJenkins、NexusをTomcatなどのJavaEEサーバにデプロイして動かす場合。
中でも、URLをいろいろ弄りたい場合。
例えば、http://example.com/foo/jenkins とか、標準の http://example.com/jenkins とは違うURLにした場合うまく動かない。
Tomcatとかに Jenkins とか Nexus の war を突っ込むと、/jenkins、/nexus というパスでアクセスできるようになる。
これを、http://example.com/foo/jenkins したければ、Apacheのリバースプロキシを設定します。
つまり、/foo/jenkins へのアクセスをTomcatの /jenkins にパスするという設定をします。
これ自体はApacheのmod_proxy設定を素直にやればいいのですが、リンクを踏んだとき /foo/jenkins じゃなく /jenkins に飛んじゃったり、Cookieが /jenkins に対して発行されて動作がおかしくなったりいろいろ問題が発生します。
その辺を解決するための設定が以下。
- JenkinsのApache設定
[code lang=”text”]
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /foo/jenkins/ http://localhost:8080/jenkins/
ProxyPassReverse /foo/jenkins/ http://localhost:8080/jenkins/
Header edit Location ^http://example.com/jenkins/ http://example.com/foo/jenkins/
<Proxy "http://localhost:8080/jenkins/*">
Order Deny,Allow
Allow from all
</Proxy>
[/code]
- NexusのApache設定
[code lang=”text”]
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /foo/nexus/ http://localhost:8080/nexus/
ProxyPassReverse /foo/nexus/ http://localhost:8080/nexus/
ProxyPassReverseCookiePath /nexus /foo/nexus
<Proxy "http://localhost:8080/nexus/*">
Order Deny,Allow
Allow from all
</Proxy>
[/code]
Jenkinsは、クライアントに返すLocationヘッダを書き換えて正しいURLに飛ぶようにしてやります。
Nexusは、Nexus自身の設定の中にURLの設定があるので、Locationヘッダをいじったりしなくてもいいのですが、Cookieが /nexus に対して発行されるのでログインができなかったりする。
これを ProxyPassReverseCookiePath にマップを定義することで正しいパスに対して Cookie を設定します。
意外とこの辺情報が見当たらなかったので、少しは役に立つかと思いまとめてみました。