PHPに限った話ではありませんが、プロジェクトの都合によっては新機能やバグ修正の入っている最新版ではなく、
これまで動作実績のある古いバージョンの処理系を使うといったこともあり得ます。
今回はAmazon Linux 2023のDockerベースイメージにPHP7.3.31をインストールする方法を紹介します。
LinuxへPHPをインストールする方法は以下の通りいくつか存在します。
-
-
-
- デフォルトに設定されているリポジトリからインストールする
- Remiリポジトリからインストールする
- ソースコードからビルドする
-
-
以下、それぞれの選択肢について検討します。
(phpenvも選択肢としてありますが、内部的にはソースからビルドしていて
ソースコードからビルドする方法とカブるので今回は検討から除外します。)
デフォルトに設定されているリポジトリからインストールする
リポジトリで利用可能なPHPのバージョンを以下のコマンドにより検索してみました。
(コマンド実行日: 2023年6月15日)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
sh-5.2# yum --showduplicate list php* Last metadata expiration check: 0:02:08 ago on Thu Jun 15 15:30:55 2023. Available Packages php-pear.noarch 1:1.10.13-2.amzn2023.0.4 amazonlinux php8.1.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-bcmath.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-bcmath.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-cli.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-cli.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-common.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-common.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-dba.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-dba.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-dbg.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-dbg.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-devel.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-devel.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-embedded.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-embedded.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-enchant.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-enchant.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-ffi.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-ffi.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-fpm.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-fpm.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-gd.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-gd.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-gmp.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-gmp.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-intl.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-intl.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-ldap.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-ldap.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-mbstring.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-mbstring.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-mysqlnd.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-mysqlnd.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-odbc.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-odbc.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-opcache.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-opcache.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-pdo.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-pdo.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-pgsql.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-pgsql.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-process.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-process.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-soap.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-soap.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-tidy.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-tidy.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux php8.1-xml.x86_64 8.1.14-1.amzn2023.0.2 amazonlinux php8.1-xml.x86_64 8.1.16-1.amzn2023.0.1 amazonlinux |
どうやらリポジトリにあるバージョン以外のPHPは使えないようです。
(2023年6月15日時点)
Remiリポジトリからインストールする
ドキュメントによるとAmazon Linux 2023はFedoraやCentOSのコンポーネントで構成されていますが、
FedoraやCentOSのどちらでもなく、全く別のディストリビューションのようです。
RemiリポジトリのページにもあるようなCentOSへのインストール方法は、
Amazon Linux 2023ではEPELがそもそも使えないようなので無理そうです。
また、Fedora向けのdnfを使ったインストール方法もOSがFedoraであることを要求しているためか以下の様に失敗します。
1 2 3 4 5 6 7 |
sh-5.2# dnf install https://rpms.remirepo.net/fedora/remi-release-38.rpm Last metadata expiration check: 0:17:23 ago on Tue Jun 13 13:20:51 2023. remi-release-38.rpm 27 kB/s | 28 kB 00:01 Error: Problem: conflicting requests - nothing provides fedora-release >= 38 needed by remi-release-38-2.fc38.remi.noarch (try to add '--skip-broken' to skip uninstallable packages) |
ソースコードからビルドする
任意のバージョンのPHPをインストールするにはおそらくこの方法がよいでしょう。
PHPをビルドする時の流れは、
1. https://www.php.net/releases/などからソースコードを取得
2. 1で取得したものを解凍
3. 使いたい拡張モジュールに合わせて./configureをオプション付きで実行
4. make installを実行
となります。Dockerfileでは具体的には以下のようにします。
1 2 3 4 5 6 7 8 9 10 |
FROM amazonlinux:2023 RUN yum update -y RUN yum install -y tar gzip make gcc libxml2-devel bzip2-devel curl-devel readline-devel libxslt-devel WORKDIR /root RUN curl https://www.php.net/distributions/php-7.3.31.tar.gz -o php-7.3.31.tar.gz RUN tar -xzvf php-7.3.31.tar.gz WORKDIR /root/php-7.3.31 RUN ./configure --with-bz2 --enable-calendar --with-curl --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-mysqli --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-pcntl --with-pdo-mysql --disable-posix --with-readline --enable-sockets --enable-wddx --with-xmlrpc --with-xsl --with-zlib RUN make install |
opensslモジュールを有効にする場合
opensslモジュールを使いたいときにはAmazon Linux 2023のリポジトリにあるものだとエラーが発生します。
以下のDockerfileはyum install でインストールするパッケージにopenssl-develを追加し、
./configureのオプションに–with-opensslを追加したものです。
./configureのオプションに–with-opensslを追加したものです。
1 2 3 4 5 6 7 8 9 10 |
FROM amazonlinux:2023 RUN yum update -y RUN yum install -y tar gzip make gcc libxml2-devel bzip2-devel curl-devel readline-devel libxslt-devel openssl-devel WORKDIR /root RUN curl https://www.php.net/distributions/php-7.3.31.tar.gz -o php-7.3.31.tar.gz RUN tar -xzvf php-7.3.31.tar.gz WORKDIR /root/php-7.3.31 RUN ./configure --with-bz2 --enable-calendar --with-curl --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-mysqli --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --enable-pcntl --with-pdo-mysql --disable-posix --with-readline --enable-sockets --enable-wddx --with-xmlrpc --with-xsl --with-zlib RUN make install |
こちらを実行すると、以下のエラーが発生します。
1 2 3 4 5 6 7 8 9 |
In file included from /root/php-7.3.31/main/php.h:468, from /root/php-7.3.31/ext/openssl/openssl.c:28: /root/php-7.3.31/ext/openssl/openssl.c: In function 'zm_startup_openssl': /root/php-7.3.31/ext/openssl/openssl.c:1491:58: error: 'RSA_SSLV23_PADDING' undeclared (first use in this function); did you mean 'RSA_NO_PADDING'? 1491 | REGISTER_LONG_CONSTANT("OPENSSL_SSLV23_PADDING", RSA_SSLV23_PADDING, CONST_CS|CONST_PERSISTENT); | ^~~~~~~~~~~~~~~~~~ /root/php-7.3.31/Zend/zend_constants.h:53:105: note: in definition of macro 'REGISTER_LONG_CONSTANT' (中略) make: *** [Makefile:639: ext/openssl/openssl.lo] Error 1 |
phpenvでインストールを行っても、./configureのオプションを適切に設定しない場合は同じエラーが発生します。
このエラーを回避するには、別のバージョンのopensslをソースからビルドして使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
FROM amazonlinux:2023 RUN yum update -y RUN yum install -y tar gzip wget make gcc libxml2-devel bzip2-devel curl-devel readline-devel libxslt-devel perl WORKDIR /root RUN wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz RUN tar -xzvf ./openssl-1.1.1u.tar.gz WORKDIR /root/openssl-1.1.1u RUN mkdir -p /root/lib/openssl RUN ./config --prefix=/root/lib/openssl RUN make RUN make install WORKDIR /root RUN curl https://www.php.net/distributions/php-7.3.31.tar.gz -o php-7.3.31.tar.gz RUN tar -xzvf php-7.3.31.tar.gz WORKDIR /root/php-7.3.31 RUN ./configure --with-bz2 --enable-calendar --with-curl --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-mysqli --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl=/root/lib/openssl --enable-pcntl --with-pdo-mysql --disable-posix --with-readline --enable-sockets --enable-wddx --with-xmlrpc --with-xsl --with-zlib RUN make install |
Apacheサーバーを使用し、libphp7.soモジュールやmod_ssl.soを使いたい場合
PHPをビルドするときの./configure実行時に–with-apxs2オプションを使います。
yumを使ってhttpdをインストールしただけだと、./configure実行時に
1 2 3 4 5 6 7 8 9 10 11 |
checking for Apache 2.0 handler-module support via DSO through APXS... Sorry, I cannot run apxs. Possible reasons follow: 1. Perl is not installed 2. apxs was not found. Try to pass the path using --with-apxs2=/path/to/apxs 3. Apache was not built using --enable-so (the apxs usage page is displayed) The output of apxs follows: ./configure: line 6311: apxs: command not found configure: error: Aborting |
というエラーになるので、ソースからhttpdをビルドしてインストールしapxsへのパスを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
FROM amazonlinux:2023 RUN yum update -y RUN yum install -y tar gzip httpd wget make gcc libxml2-devel bzip2-devel curl-devel readline-devel libxslt-devel php-devel apr-devel apr-util-devel WORKDIR /root RUN wget https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.gz RUN tar -xzvf ./httpd-2.4.57.tar.gz WORKDIR /root/httpd-2.4.57 RUN ./configure --enable-so RUN make RUN make install WORKDIR /root RUN curl https://www.php.net/distributions/php-7.3.31.tar.gz -o php-7.3.31.tar.gz RUN tar -xzvf php-7.3.31.tar.gz WORKDIR /root/php-7.3.31 RUN ./configure --with-bz2 --enable-calendar --with-curl --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-mysqli --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-pcntl --with-pdo-mysql --disable-posix --with-readline --enable-sockets --enable-wddx --with-xmlrpc --with-xsl --with-zlib --with-apxs2=/usr/local/apache2/bin/apxs RUN make install RUN cp /root/php-7.3.31/libs/libphp7.so /etc/httpd/modules/ RUN cp /root/httpd-2.4.57/modules/ssl/.libs/mod_ssl.so /etc/httpd/modules/ |