概要
継続的インテグレーション(CI)ツール「Jenkins」をインストールする際に、Apache httpd をフロントに立たせて、Jenkins へはプロキシしてアクセスさせたい場合があります。 本稿では、そのような場合の設定方法について解説します。
前提と要件
まずは、本稿で実現したいことを整理します。 ざっとまとめると、次のようになります。
- Apache httpd にプロキシの設定を行い Jenkins にアクセスさせる。
- URL は http://hostname/jenkins となるように設定する。
- Jenkins 自体はデフォルトの8080番ポートで待ち受けることとする。
なお、Jenkins は次のような手順でインストールが完了していることとします。
それでは、設定方法を解説していきます。
Jenkins の Prefix を設定する
Jenkins はデフォルトでは http://ホスト名:8080/ のように、8080番ポートのルートアプリケーションとして動作するようになっているので、まずこれを http://ホスト名:8080/jenkins というパスで動くように変更します。 設定ファイル /etc/sysconfig/jenkins を開き、変数
JENKINS_ARGS を次のように変更します。 prefix を指定することで、jenkins というパスで動くようになります。
JENKINS_ARGS="--prefix=/jenkins"
設定を変更したら Jenkins を再起動し、http://ホスト名:8080/jenkins のURLでアクセスできるようになったことを確認します。
Apache httpd のプロキシ設定
続いて Apache httpd のプロキシ設定を行います。 パス「/jenkins」へのアクセスをバックグラウンドの Jenkins にプロキシします。 Apache httpd の設定ファイルに、次のように記述します。
ProxyPass /jenkins http://localhost:8080/jenkins nocanon
ProxyPassReverse /jenkins http://localhost:8080/jenkins
ProxyRequests Off
AllowEncodedSlashes NoDecode
<Proxy http://localhost:8080/jenkins*>
Order deny,allow
Allow from all
</Proxy>
上記の設定を記述したら Apache httpd を再起動してください。 今度は http://ホスト名/jenkins というURLでアクセスできるようになってでしょうか。 もしこれでアクセスできない場合、SELinux 機能が通信を妨害しているかもしれません。 SELinux で通信を遮断されている場合、Apache httpd のエラーログに、次のようなログが出力されていました。
[proxy:error] [pid 10329] (13)Permission denied: AH00957: HTTP: attempt to connect to 127.0.0.1:8080 (localhost) failed
[proxy:error] [pid 10329] AH00959: ap_proxy_connect_backend disabling worker for (localhost) for 60s
[proxy_http:error] [pid 10329] [client 192.168.33.1:50049] AH01114: HTTP: failed to make connection to backend: localhost
このような場合は、SELinux で HTTP での通信を許可するように、次のようなコマンドで設定を変更します。
# setsebool -P httpd_can_network_connect 1
Jenkins起動後の設定
Jenkins の画面にアクセスできた場合でも、[Jenkinsの管理] -> [システムの設定] -> [Jenkinsの位置] と画面を辿り、Jenkins の URL がプロキシを介した場合のURLになっていることを確認してください。
ここまで設定が完了し、これ以後の Jenkins へのアクセスは Apache httpd 経由だけとするのであれば、8080番ポートは閉じてしまって良いでしょう。
HTTPS化のために
なお、ここまでの解説では HTTP で Apache httpd にアクセスすることになりますが、HTTPS でアクセスしてバックグラウンドの Jenkins にプロキシする場合には、もう少しだけ設定の追加が必要です。 上記の設定に加えて以下の2行を追加します。 Jenkins にプロキシしたリクエストを投げる際に、X-Forwarded-xxx ヘッダで HTTPS アクセスされたことを伝えるようにします。
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
おわりに
本稿では Jenkins のフロントとして Apache httpd を設定する方法について解説しました。