Apache2.4をインストールする(ソースからコンパイル) for RockeyLinux 9.x / Ubuntu 22.04.x(systemd対応)

世界で最も使われているWebServer、Apache http server。
CentOS7になり、systemdになった背景から、rpmではなくソースからコンパイルをすると、起動スクリプトが応答なしになる問題が報告されています。
~~今回はこの問題を回避するため、起動スクリプトをCentOS7.2の純正のものから変更することで対応します。~~
2016年12月24日更新分で、mod_systemdをバックポートすることで、systemdに対応させる形に変更しました。
RockyLinuxで行っておりますが、その他のRHEL互換OSでも同様に操作可能です。

2025年2月現在では、Apacheは「2.4.63」です。
また、SSL対応をさせる場合は、OpenSSLのインストールが必要です。
OpenSSLのインストールに関しては、
[RockyLinux 9.xとUbuntu22.xにOpenSSL 3.1.xをインストールする（ソースからビルド）](https://qiita.com/shadowhat/items/e8adf371a198d7555422)
を参照してください。


## ダウンロード先
APR関連
- http://apr.apache.org/
Apache HTTP Server
- http://httpd.apache.org/
PCRE
- http://www.pcre.org/
zlib
- http://www.zlib.net/

## 実践環境バージョン情報
| ソフトウェア | バージョン |
|:-:|:-:|
| apr | 1.7.5  |
| apr-util | 1.6.3  |
| Expat XML Parser | 2.6.2 |
| PCRE2 | 10.44 |
| zlib | 1.3.1 |
| apache http server | 2.4.63 |
| OS | RockyLinux 8.4 and RockyLinux 9.5 |


## rpmでOS標準のApacheが入っている場合、アンインストールする

```bash:
rpm -e httpd-devel-2.4.6-45.el7.centos.x86_64
rpm -e httpd-manual-2.4.6-45.el7.centos.noarch
rpm -e mod_ssl-2.4.6-45.el7.centos.x86_64
rpm -e mod_fcgid-2.3.9-4.el7.x86_64
rpm -e httpd-2.4.6-45.el7.centos.x86_64
rpm -e httpd-tools-2.4.6-45.el7.centos.x86_64
```

## インストール手順

### 1.aprをインストールします。

```bash:apr
cd /usr/local/src
wget https://dlcdn.apache.org//apr/apr-1.7.5.tar.gz
tar xvzf apr-1.7.5.tar.gz
cd apr-1.7.5
./configure
make -j 8
make install
```

### 2.Expat XML Parserをインストールします。

```bash:
cd /usr/local/src
wget https://github.com/libexpat/libexpat/releases/download/R_2_6_4/expat-2.6.4.tar.gz
tar xvzf expat-2.6.4.tar.gz
cd expat-2.6.4
./configure
make -j 8
make install
```

### 3.apr-utilをインストールします。

```bash:apr-util
cd /usr/local/src
wget https://dlcdn.apache.org//apr/apr-util-1.6.3.tar.gz
tar xvzf apr-util-1.6.3.tar.gz
cd apr-util-1.6.3
./configure --with-apr=/usr/local/apr \
--with-openssl=/usr/local/ssl
make -j 8
make install
```

### 4.PCREのインストール
続いて、PCREをインストールします。
Apache 2.4.56移行は、PCRE2のみのインストールでOKです。

```bash:pcre
#cd /usr/local/src
#wget "https://downloads.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz?ts=gAAAAABkK_XztgvJ7mhpizK6AGN7erWqfpNYfQjfHoqVpEGHak8u8_zfm3hoHyp58CXruxGg3jmmRXrYsIqfrabhQDUg#GZ_jQ%3D%3D&r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fpcre%2Ffiles%2Fpcre%2F8.45%2Fpcre-8.45.tar.gz%2Fdownload"
#
#tar xvzf pcre-8.45.tar.gz
#cd pcre-8.45
#./configure
#make
#make install
```

### PCRE2のインストールします。(2.4.56からPCRE2のみでOK！）

```
cd /usr/local/src
wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.45/pcre2-10.45.tar.gz
tar xvzf pcre2-10.45.tar.gz
cd pcre2-10.45
./configure
make -j 8
make install
```


### 5.zlibをインストールする

```:bash:zlib
cd /usr/local/src
wget https://zlib.net/zlib-1.3.1.tar.gz
tar xvzf zlib-1.3.1.tar.gz
cd zlib-1.3.1
./configure
make
make install
```

### 6.Systemd-develのインストール

```
#RHEL系
dnf install systemd-devel

#Ubuntu
sudo apt-get install -y libsystemd-dev
```


### 7.Apacheをインストールします

```bash:apache2.4
cd /usr/local/src
wget https://dlcdn.apache.org/httpd/httpd-2.4.63.tar.gz
tar xvzf httpd-2.4.63.tar.gz
cd httpd-2.4.63
#PCRE2のソースの場所を選択
./configure \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr \
--with-pcre=/usr/local/bin/pcre2-config \
--enable-mods-shared=reallyall \
--enable-ssl \
--with-ssl=/usr/local/ssl \
--enable-proxy \
--enable-proxy-ajp \
--enable-dav \
--enable-dav-fs \
--enable-headers \
--enable-rewrite=shared \
--enable-deflate \
--with-pcre=/usr/local \
--enable-systemd
make -j 4
make install
```

### 8.mod_systemd.cを持ってくる
この作業は、現在のapache2.4でも行わないと、正しくsystemdのスクリプトが動作しない。
/usr/local/apache2/modules/mod_systemd.so
が存在していても作業を行う。

あらかじめ「systemd-devel-219-62.el7.x86_64.rpm」がインストールされているかを確認しておきましょう。（これが入ってないと、sd-daemon.hがないといわれてコンパイルに失敗します）

```bash:mod_systemd.cをダウンロードする
cd /usr/local/src/httpd-2.4.63/modules/arch/unix
#wget https://raw.githubusercontent.com/apache/httpd/trunk/modules/arch/unix/mod_systemd.c

#aspxを使ってコンパイル
/usr/local/apache2/bin/apxs -c mod_systemd.c -I /usr/include/systemd/sd-daemon.h

#libtoolにおまじない
#
#CentOS7以降 or Ubuntでは以下を実行
#
libtool \
--silent \
--mode=compile gcc -std=gnu99 -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong \
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_LARGEFILE64_SOURCE  -DLINUX -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/local/apache2/include  -I/usr/local/apache2/include   -I/usr/local/apache2/include -I/usr/local/apr/include/apr-1  -c -o mod_systemd.lo mod_systemd.c && touch mod_systemd.slo

libtool \
--silent \
--mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64   -o mod_systemd.la  -rpath /usr/local/apache2/modules -module -avoid-version    mod_systemd.lo


libtool \
--silent \
--mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64   -o mod_systemd.la  -rpath /usr/local/apache2/modules -module -avoid-version    mod_systemd.lo -lsystemd-daemon

#モジュールを登録
/usr/local/apache2/bin/apxs -i -a -n systemd mod_systemd.la


#ubuntiは、libtoolを入れる
apt install libtool-bin

#
#RockyLinuxやAlmaLinux8/9 では以下を実行
#
cd /usr/local/src/httpd-2.4.63/modules/arch/unix
dnf install systemd-devel

libtool \
--silent \
--mode=compile gcc -std=gnu99 -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong \
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_LARGEFILE64_SOURCE  -DLINUX -D_REENTRANT -D_GNU_SOURCE \
-pthread -I/usr/local/apache2/include -I/usr/local/apr/include/apr-1 -c -o mod_systemd.lo mod_systemd.c && touch mod_systemd.slo
libtool \
--silent \
--mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64 -o mod_systemd.la -rpath /usr/local/apache2/modules -module -avoid-version mod_systemd.lo
libtool \
--silent \
--mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64 -o mod_systemd.la -rpath /usr/local/apache2/modules -module -avoid-version mod_systemd.lo -lsystemd
/usr/local/apache2/bin/apxs -i -a -n systemd mod_systemd.la


```


### 9.起動スクリプトを用意する

```bash:httpd.service
cat > /usr/lib/systemd/system/httpd.service << EOF
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
#EnvironmentFile=/usr/local/apache2/conf/httpd.conf
Environment=LD_LIBRARY_PATH=/usr/local/ssl/lib:/usr/local/lib:/usr/local/lib64:/usr/lib
ExecStart=/usr/local/apache2/bin/httpd \$OPTIONS -DFOREGROUND
ExecReload=/usr/local/apache2/bin/httpd \$OPTIONS -k graceful
ExecStop=/bin/kill -WINCH \${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

EOF
```

### 10.最後に起動と自動起動を登録

```bash:起動と自動起動設定
systemctl daemon-reload
systemctl start httpd
systemctl enable httpd
```

### 11.logrotated設定
```
cat > /etc/logrotate.d/httpd << EOF
/usr/local/apache2/logs/*_log
{
    missingok
    sharedscripts
    postrotate
        systemctl restart httpd
    endscript
}
EOF
```


## 参考
- http://unix.stackexchange.com/questions/262051/help-to-install-apache-module-mod-systemd
- http://kazmax.zpp.jp/apache/apache3.html
- http://linux.systemv.pe.kr/apache-source-install/