Apache HTTP Server 2.4.6 をソースからインストールする

> [!NOTE]
> この記事は 2013/07/31 に [momoto.github.io](http://momoto.github.io/) へ投稿した内容を Qiita へ移行してきたものです

　Apache HTTP Server 2.4.6 をソースコードからビルドして、Unix系システムへインストールする手順の記録です。 この記事では CentOS 6.4 環境でインストールの例を示しますが、ソースからビルドする場合の手順は特定のLinuxディストリビューションに依存しません。

　インストールを行うユーザは、インストール先ディレクトリに対して書込み権限をもっている必要があります。/usr/local/* にインストールする場合、通常、root権限が必要です。

## 1. ソースコードを取得する

　ソースコードをインストールするマシンに用意します。 インターネットからダウンロードする場合、httpd.apache.orgにソースコードのURLが示されています。 bzip2、gzipのアーカイブが用意されていますので、マシンで解凍・展開できる形式を選択してください。

　ダウンロードにはcURLやGNU Wgetなどのダウンロードマネージャやウェブブラウザを使用します。 次の例では、cURLをつかって理化学研究所のミラーからhttpd-2.4.6.tar.gzをダウンロードします。

```shell-session
[root@localhost ~]# curl -LsO http://ftp.riken.jp/net/apache//httpd/httpd-2.4.6.tar.gz
```

　取得したアーカイブファイルは適宜、解凍・展開して、ワーキングディレクトリを移動させます。 FHSに従うシステムであれば、独自にインストールするソフトウェアのためのディレクトリ /usr/local が予め用意されていますので、この記事ではソースコードを /usr/local/src に配置してインストールをすすめます。

```shell-session
[root@localhost ~]# tar xfz httpd-2.4.6.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/httpd-2.4.6/
[root@localhost httpd-2.4.6]# 
```

## 2. インストール要件を満たす

　マシンがインストールの要件を満たしている必要があります。 要件についてはDocumentationに詳しい説明があります。

```shell-session:Cコンパイラ
[root@localhost ~]# yum install gcc
```

```shell-session:Make
[root@localhost ~]# yum install make
```

Apache Portable Runtime (APR) が予めシステムに備わっていない場合（またはシステムが提供するバージョンを使用したくない場合）は apr.apache.org から取得して httpd に含めてビルドします。取得した APR と APR-Util はバージョン番号を取り除いて ”./srclib/apr” と ”./srclib/apt-util” に展開します。

```shell-session
[root@localhost httpd-2.4.6]# cd srclib/
[root@localhost srclib]# curl -Lso apr-1.4.8.tar.gz http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.4.8.tar.gz
[root@localhost srclib]# tar xfz apr-1.4.8.tar.gz
[root@localhost srclib]# mv apr-1.4.8/ apr
[root@localhost srclib]# curl -Lso apr-util-1.5.2.tar.gz http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.5.2.tar.gz
[root@localhost srclib]# tar xfz apr-util-1.5.2.tar.gz
[root@localhost srclib]# mv apr-util-1.5.2/ apr-util
```

PCREライブラリ – www.pcre.orgやディストリビューションからインストールします。

```shell-session
[root@localhost httpd-2.4.6]# yum install pcre-devel
```

## 3. ビルドファイルを作成する

　`configure` をつかってビルドファイルを作成します。`configure` にオプションを与えることで、インストール先のディレクトリや有効にするモジュールを調整できます。 指定できるオプションについては `configure --help` や Documentation を参照してください。 ビルドの要件を満たしていない場合 `configure` の処理は中断されます。

　例えば、インストール先のディレクトリを /usr/local/httpd-2.4.6 として、 DSOサポートを有効、MPM を prefork と明示して、 新たに取得した APR を使用する場合は次のように configure を実行します。

```shell-session
[root@localhost httpd-2.4.6]# ./configure --prefix=/usr/local/httpd-2.4.6 --enable-so --with-mpm=prefork --with-included-apr
```

　次に、configureのエラー例をいくつか示します。

#### APR not found.

```:APR-not-found.
checking for APR... no
configure: error: APR not found.  Please read the documentation.
```

　APRが正しくインストールされているか確認してください。

#### no acceptable C compiler found in $PATH

```:no-acceptable-C-compiler-found-in-$PATH
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/usr/local/src/httpd-2.4.6/srclib/apr':
configure: error: no acceptable C compiler found in $PATH
```

　Cコンパイラが正しくインストールされているか確認してください。

#### pcre-config for libpcre not found.

```shell-session:pcre-config-for-libpcre-not-found.
checking for pcre-config... false
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
```

　PCREライブラリが正しくインストールされているか確認してください。

　configureの処理が終了してMakefileが作成されていれば、ビルドの段階へすすみます。

## 4. ビルドとインストール

　ビルドとインストールには `make` を使います。ディスクの容量が充分足りていることを確認してください。

```shell-session
[root@localhost httpd-2.4.6]# make && make install
```

　`make` の処理が無事に終了したらインストールは完了です。 `configure` の--prefixに指定した位置にファイルが展開されているはずです。PREFIXを指定していなかった場合は ”/usr/local/apache2” になります。

```shell-session
[root@localhost httpd-2.4.6]# /usr/local/httpd-2.4.6/bin/httpd -v
Server version: Apache/2.4.6 (Unix)
```

## 5. インストール後
　必要に応じて、httpd.confの設定、起動スクリプトの設置、自動起動の設定、実行バイナリへのパスの設定を行なってください。 ソースコードのアーカイブには、標準のLSB起動スクリプトが用意されています。

[root@localhost httpd-2.4.6]# cp /usr/local/src/httpd-2.4.6/build/rpm/httpd.init /etc/init.d/httpd

### 動作確認

　最後に、ウェブサーバの動作を少し確認してみます。 ウェブサーバにとって外部のホストから動作を確認する場合はファイアウォール等の制限を受けやすいため、まずはインストールを行ったマシンからループバックで確認するとネットワークアクセスの問題と区別できます。

　Firefox や Lynx などのブラウザや、GNU Wget や cURL をつかって、自身に対してHTTPリクエストを送信します（Wget や cURL を使う場合、HTMLの描写はされません）。 うまく動作していればドキュメントルートに予め用意されている HTML ファイルを応答するはずです。

```shell-session:動作確認
[root@localhost ~]# lynx localhost
```

![apache-http-server-works.png](https://qiita-image-store.s3.amazonaws.com/0/58/0424856d-a2fa-fe54-fe7c-7d27c0d00b40.png)

　ネットワークアクセスを介すると動作が確認できなくなる場合、様々な原因が考えられますが、GNU/Linux のシステムでよくあるのは iptables や SELinux などのセキュリティによるものです。 外部からのアクセスを受け入れようとする場合は HTTP のネットワーク通信を許可する必要がありますが、これらの作業は実質、セキュリティ強度を緩和しているので、マシンが接続しているネットワークや記録しているコンテンツをよく確かめて設定するべきです。 Apache HTTP Server の領域から少し外れますが、iptables と SELinux の設定の確認方法を示します。

　iptablesを使用している場合、パケットフィルタのルールを確認します。 例えばCentOS 6.4の初期状態では下記のように、ポート80の受信の許可を明示していないため、外部のクライアントからのリクエストに応答できません。

```shell-session
[root@localhost ~]# iptables --list-rules
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
```

　上記のようなルールの場合、-A INPUT -j REJECT --reject-with icmp-host-prohibitedの上に、-A INPUT -p tcp -m tcp --dport 80 -j ACCEPTというルールを新しく追加する等の変更が必要になります。 変更の方法も様々ですが、CentOS 6.4であれば /etc/sysconfig/iptables を書き換えた後に iptables を再起動するとルールが再設定されます。

　SELinuxを使用している場合、httpd_can_network_connectの値を確認します。

```shell-session
[root@localhost ~]# getsebool httpd_can_network_connect
httpd_can_network_connect --> off
```

　ネットワークを通してウェブサーバを使用する場合は、この値にonを設定します。

```shell-session
[root@localhost ~]# setsebool -P httpd_can_network_connect on
```

　`httpd_can_network_connect` の他、CGI や DB を制限する項目もあるので、用途に応じて適切なポリシーを設定する必要があります。

## 参考

- [Apache HTTP Server Version 2.4 Documentation – Apache HTTP Server](http://httpd.apache.org/docs/2.4/)
- [The Apache Portable Runtime Project](http://apr.apache.org)