JenkinsのフロントにApache httpdを立たせてプロキシ連携させる設定方法

投稿者 : OSCA

関東地方の美しい夜景を観にいこう。 夜景サイト「夜景散歩」で夜景スポットを検索

概要

 継続的インテグレーション(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 を設定する方法について解説しました。

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。
個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca