Edited at

Apache2.4をインストールする(ソースからコンパイル) for CentOS7.4 (systemd対応)

世界で最も使われているWebServer、Apache http server。

CentOS7になり、systemdになった背景から、rpmではなくソースからコンパイルをすると、起動スクリプトが応答なしになる問題が報告されています。

今回はこの問題を回避するため、起動スクリプトをCentOS7.2の純正のものから変更することで対応します。

2016年12月24日更新分で、mod_systemdをバックポートすることで、systemdに対応させる形に変更しました。

2019年8月現在では、Apacheは「2.4.41」です。

また、SSL対応をさせる場合は、OpenSSLのインストールが必要です。

OpenSSLのインストールに関しては、

OpenSSL(1.0.x)をインストールする(ソースからコンパイル)for CentOS 7.2

を参照してください。

また、zlibも必要となります。こちらはOS標準で入っているのであればそれを利用可能ですが、インストールされていない場合は、zlibをインストール(ソースからコンパイル)for CentOS7.2を参照してください。


ダウンロード先

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.0

apr-util
1.6.1

Expat XML Parser
2.2.7

PCRE
8.43

zlib
1.2.11

apache http server
2.4.39

OS
CentOS 7.6


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

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をインストールします。


apr

cd /usr/local/src

wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//apr/apr-1.7.0.tar.gz
tar xvzf apr-1.7.0.tar.gz
cd apr-1.7.0
./configure
make
make install


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

cd /usr/local/src

wget https://github.com/libexpat/libexpat/releases/download/R_2_2_7/expat-2.2.7.tar.bz2
tar xvjf expat-2.2.7.tar.bz2
cd expat-2.2.7
./configure
make
make install


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


apr-util

cd /usr/local/src

wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.6.1.tar.gz
tar xvzf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
./configure --with-apr=/usr/local/apr \
--with-openssl=/usr/loca/ssl
make
make install


4.PCREのインストール

続いて、PCREをインストールします。PCREは、PCRE2ではなく、PCREを選択するので注意が必要です。


pcre

cd /usr/local/src

wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar xvzf pcre-8.43.tar.gz
cd pcre-8.43
./configure
make
make install


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


bash

cd /usr/local/src

wget http://zlib.net/zlib-1.2.11.tar.gz
tar xvzf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make
make install


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


apache2.4

cd /usr/local/src

wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.41.tar.gz
tar xvzf httpd-2.4.41.tar.gz
cd httpd-2.4.41
./configure --with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr \
--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
make
make install


7.mod_systemd.cを持ってくる

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


mod_systemd.cをダウンロードする

cd /usr/local/src/httpd-2.4.41/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におまじない
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



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


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
ExecStart=/usr/local/apache2/bin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/local/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



9.最後に起動と自動起動を登録


起動と自動起動設定

systemctl daemon-reload

systemctl start httpd
systemctl enable httpd


参考