最近のLinuxでのApache+PHP 8.4インストール方法(ソース経由 on RHEL)
Apache、PHPともソース配布からインストールした記録です。 ただし各種ユーティリティやライブラリはできる限りdnfでインストールしておき、楽ちんをしています。

#-----------------------------
# [1] remiをインストールし有効にしておく
#-----------------------------
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf config-manager --enable epel remi-modular remi-safe

#-----------------------------
# [2] 必要なパッケージのインストール
#-----------------------------
# Apache用。apxs, expat, PCRE2, aprなどのツールはhttpd-develに含まれている
sudo dnf install wget gcc perl httpd-devel openssl openssl-devel
# PHP用
sudo dnf install libxml2-devel zlib sqlite libjpeg libjpeg-devel libpng libpng-devel \
  iconv oniguruma sqlite-devel

# ★sqlite-develのパッケージ名に注意。3はつかない。また-devではなく-devel
# ★libjpegとlibpngは-develがつく方もインストールが必要

sudo dnf install --enablerepo=remi oniguruma-devel
# ★--enablereposではなく〜repoなので注意。また実際にはoriguruma5php-develという名前で入る。

#-----------------------------
# [3] Apache httpd serverのインストール
#-----------------------------
mkdir ~/install && cd ~/install
export APAVER=2.4.62
wget https://dlcdn.apache.org/httpd/httpd-${APAVER}.tar.gz
tar xozf httpd-${APAVER}.tar.gz && cd httpd-${APAVER}
./configure --prefix=/usr/local/apache2-${APAVER} --enable-so
make
sudo make install
sudo ln -s /usr/local/apache2-${PHPVER} /usr/local/apache2

# ポート80を使う場合はrootでの実行が必須
sudo /usr/local/apache2/bin/apachectl start

# http://{ホスト名}/
# It works!

# 起動を確認して、停止する。
sudo /usr/local/apache2/bin/apachectl stop

#-----------------------------
# [4] PHPのインストール…の前にlibzipのインストール
#-----------------------------
# libzip-develだけがどうしても見つからないので、ソース配布からインストールする。
sudo dnf install cmake3
cd ~/install
wget https://libzip.org/download/libzip-1.11.2.tar.gz
tar xozf libzip-1.11.2.tar.gz && cd libzip-1.11.2

# 手順は INSTALL.md の通りでOK
mkdir build && cd build
cmake ..
make
make test
sudo make install

# libzip.soは入る位置が特殊なのでLD_LIBRARY_PATHかldconfigに登録が必要
# ここではldconfigに登録する
sudo su
echo /usr/local/lib64 >> /etc/ld.so.conf.d/libzip-so.conf
ldconfig
ldconfig -p | grep /usr/local/lib64
# libzip.soの行が出ることを確認
exit

#-----------------------------
# [5] PHPのインストール
#-----------------------------
export PHPVER=8.4.2
wget https://www.php.net/distributions/php-${PHPVER}.tar.gz
tar xozf php-${PHPVER}.tar.gz && cd php-${PHPVER}

./configure --prefix=/usr/local/php-${PHPVER} --with-apxs2=/usr/bin/apxs \
  --with-pear --with-zlib --enable-gd --with-jpeg --with-zip --with-iconv --with-openssl --enable-mbstring

# ★libpngを着脱するオプション(--with-pngなど)はないらしい。

make
sudo make install
libtool --finish ~/install/php-${PHPVER}/libs
sudo ln -s /usr/local/php-${PHPVER} /usr/local/php

※なお8.4から --with-oci8=と--with-pdo_oci=オプションはなくなった。
次のようにPECLからインストールする必要がある。

# プロキシの設定が必要ならば行う
pear config-set http_proxy http://proxy.mycompany.com:8080/

echo 'instantclient,/opt/oracle/instantclient/' | pecl install oci8
echo 'instantclient,/opt/oracle/instantclient/' | pecl install pdo_oci

無事インストールできたら、/usr/local/apache2/conf/httpd.conf に以下の2行を追記します。

LoadModule php_module /lib64/httpd/modules/libphp.so
AddType application/x-httpd-php .php

LoadModule行はmake installによって自動で追記されている場合があります。
また、libphp.so が/usr/local/apache2/modules 以外の場所に入った場合、 modules/libphp.so の部分を上のように絶対パスで指定すればOKです。
またAddType行は、httpd.confの中に <IfModule mime_module> で始まるブロックがあるので、 その末尾に追記すると後々分かりやすいと思います。
また、php.iniを /usr/local/lib 以外の場所に置きたい場合は以下の行も必要です。 これは私の場合は httpd.conf の末尾に追記しました。

PHPIniDir "/usr/local/php/lib"

次にPHPのソース内の php.ini-development を先のPHPIniDirで指定した場所 (指定しない場合は/usr/local/lib)にphp.iniの名前でコピーし、以下の部分を追記します。

include_path = ".:/usr/local/php/lib/php"

;date.timezone =
date.timezone = "Asia/Tokyo"

include_pathは、PEARやサードパーティーのライブラリを一切使わない場合は設定不要かもしれません。
一方 date.timezoneは初期は未設定なので、必ず設定しないとPHPのdate関数等の動作が変になると思います。

モジュールを共有ライブラリとしてインストールする場合
configureに--enable-sharedを付けると、zipなどのモジュールがzip.soなどの共有ライブラリとしてインストールされます。 その場合は php.ini の初期状態でコメントになっている以下の行を有効にします。

extension=oci8
extension=pdo_oci
extension=zip

なお、これらの共有ライブラリの置き場所は、make install時に「ここに入ったよ!」と表示されますが、 後に別の位置に移動した場合は以下の行の設定も必要です。

extension_dir = "/lib64/php/modules"

ccのコンパイル中にKilledと出てしまう
RHEL9でmake中に「cc: Internal error: Killed」と出てccが強制終了される場合、 OSのメモリが不足していることが原因に考えられます。そんなことあるの? ってあるんだからしょうがない。AWSのEC2サーバでは、t2.microを使用していると実際に発生しました。 解決策の二つは当然、停止可能なプロセスを停止することと、メモリを増やすことですが、 もう一つ、configureに「--disable-fileinfo」を付けるとなぜか落ちずに通るようになりました。


古い作業記録(dnf on RHEL)
RHEL 9.2上でApache 2.4とPHP 8.1をソース配布からインストールした際の記録です。

# apxs, expat, PCRE2, aprなどのツールはhttpd-develに含まれている
sudo dnf install wget gcc perl httpd-devel
wget https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.gz
cd httpd-2.4.57
./configure --enable-so
make
sudo make install
# ポート80を使う場合はrootでの実行が必須
sudo /usr/local/apache2/bin/apachectl start

# 起動を確認して、停止する。
sudo /usr/local/apache2/bin/apachectl stop

sudo dnf install libxml2-devel openssl-devel
wget https://www.php.net/distributions/php-8.1.14.tar.gz
cd php-8.1.14
./configure --with-apxs2=/usr/bin/apxs --with-pear --with-zlib --with-gd \
  --with-iconv --enable-mbstring \
  --with-oci8=instantclient,/opt/oracle/instantclient21_0_6 \
  --with-pdo_oci=instantclient,/opt/oracle/instantclient21_0_6 \
  --disable-mbregex --disable-fileinfo
make
sudo make install


最近のLinuxでのApache+PHP 8.0インストール方法(dnf on RHEL)
ちなみに全てをdnfで行う方法です。RHEL 9.2で行いました。PHP 8.0がインストールされます。

sudo dnf update -y
sudo dnf install -y httpd
sudo dnf install -y php php-pdo php-mbstring php-devel php-gd php-pear php-mysqlnd

sudo systemctl start httpd
ps -ef | grep httpd

# サーバが起動するたびhttpdが起動するように設定する
sudo systemctl enable httpd

# myuserをapacheグループに追加
sudo usermod -a -G apache myuser

# /var/www/htmlの所有者/グループをmyuser/apacheに移し、apacheグループに書込を許可する
sudo chown -R myuser:apache /var/www
sudo chmod 2775 /var/www

これで、/var/www/html の下に .php ファイルを置けばすぐにPHPプログラムとして処理されます。
なおhttpdとphp-fpmのログはそれぞれ /var/log/httpd と /var/log/php-fpm の下に出力されます。

Open Source Web Architecture Top

(first uploaded 2023/08/26 last updated 2025/01/04, MISUMI URANO)