JenkinsとApacheをmod_ajpで連携する方法

# やりたいこと
* 単一のCentOSサーバにJenkinsのフロントにApacheを立て、mod_ajpで連携させる
* Apacheは投稿時点の最新安定版(2.4.10)を使いたいので、ソースからコンパイルしてインストールする
* Jenkinsに`http://【domain or IP】/`（80番ポート）でアクセスできる

# 1. iptablesの設定を追加する

`/etc/sysconfig/iptables`を以下のように編集し、80番・8009番・8080番ポートを開放する。
8009番ポートはmod_ajpで連携するために必要。ローカルホストからのみ、アクセスできるようにしておく。
8080番ポートは、Jenkinsの起動確認のために一時的に開放しておく。

```sh:/etc/sysconfig/iptables
~中略~
### For Jenkins start
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8009 -s 127.0.0.1 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
### For Jenkins end
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

編集したら、iptablesをリスタートする。

```sh
service iptables restart
```

# 2. Jenkinsをインストールする

下記コマンドを実行して、Jenkinsをインストールする。

```sh
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum -y install jenkins
```

Jenkinsを起動してみる。

```sh
service jenkins start
```

ブラウザで`http://【domain or IP】:8080/`にアクセスし、JenkinsのTOPページが表示されればOK。

`/etc/sysconfig/iptables`を再編集し、8080番ポートをローカルホストからのみアクセスできるようにする。
8080番ポートはリバースプロキシの設定に必要で、
このポートが閉じていると、jenkinsに「リバースプロキシの設定に問題があります」と警告されてしまう。

```sh
~中略~
### For Jenkins start
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8009 -s 127.0.0.1 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -s 127.0.0.1 -j ACCEPT # "-s 127.0.0.1"を追加する
### For Jenkins end
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

編集したら、再びiptablesをリスタートする。

```sh
service iptables restart
```

ブラウザで`http://【domain or IP】:8080/`にアクセスし、JenkinsのTOPページが表示されなくなっていればOK。

# 3. Apacheをインストールする

まず、PCREをインストールする。

```sh
yum -y install pcre-devel.x86_64
```

Apache のソースをダウンロードする。

```sh
cd /usr/local/src/
wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//httpd/httpd-2.4.10.tar.gz
tar zxf httpd-2.4.10.tar.gz
```

aprとapr-utilも一緒にコンパイルするため、ソースをダウンロードしてApacheのsrclibディレクトリに含めておく。
これらはサーバに標準でインストールされていないか、されているとしてもバージョンが古すぎるため。

```sh
cd httpd-2.4.10/srclib/
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.5.1.tar.gz
tar zxf apr-1.5.1.tar.gz
mv apr-1.5.1 apr
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.5.4.tar.gz
tar zxf apr-util-1.5.4.tar.gz
mv apr-util-1.5.4 apr-util
rm -f apr-*.tar.gz
cd ../
```

コンパイル・インストールする。

```sh
./configure
make
make install
```

Apacheを起動してみる。

```
/usr/local/apache2/bin/apachectl start
```

ブラウザで`http://【domain or IP】/`にアクセスし、ApacheのTOPページが表示されればOK。

# 4. ApacheとJenkinsをmod_ajpで連携する

Apacheの設定ファイル`conf/extra/httpd-vhosts.conf`に、以下のように記述する。

```sh:conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/usr/local/apache2/htdocs"
    ServerName 【domain or IP】
    ErrorLog "logs/jenkins-error_log"
    CustomLog "logs/jenkins-access_log" common

    <Location />
        Order allow,deny
        Allow from all
    </Location>

    ProxyRequests Off
    AllowEncodedSlashes On
    <IfModule proxy_ajp_module>
        <Location />
            ProxyPass        ajp://localhost:8009/ nocanon
            ProxyPassReverse http://【domain or IP】:8080/
        </Location>
    </IfModule>
</VirtualHost>
```

`conf/httpd.conf`ファイルに以下を追記する。

```sh:conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

Include conf/extra/httpd-vhosts.conf
```

Apacheをリスタートする。

```sh
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
```


ブラウザで`http://【domain or IP】/`にアクセスし、JenkinsのTOPページが表示されればOK。

# この投稿で説明しなかったこと

この投稿では、あくまでApacheとJenkinsを連携させる方法だけを説明している。
実際にJenkinsでCIできるようにするためには、他にも以下の作業が必要になるかもしれない。

* セキュリティ対策（Basic認証とか）
* Apache・Jenkinsの自動起動設定、ログの管理
* GitまたはMavenのインストール
* プロジェクトごとに必要なミドルウェアやプラグインのインストール