PHP5.6.40をCentOS8にソースインストール
篠原 隆司
アフィリエイト広告を利用しています
このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です
さくらのVPSにCentOS 8をインストールした覚書です。
今回は、PHPの古いバージョンである PHP5.6.40 をソースからインストールします。
なお、DNFでインストールした「CentOS 8 にPHP7.4をDNFでインストール」の記事とは異なるサーバです。
今回のサーバはテストサーバとしての公開を目的としています。いろんな案件のいろんなプロジェクトが入ったサーバになります。
そのためいろんなバージョンのPHPが同居できる必要があります。
今回で言うと、数年前にPHP5.6で制作されたWEBサイトがあり、それのメンテナンスと機能追加という要望があったために同じ環境を用意することになりました。
なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。
弊社では、2000年台前半頃からPHPを触っている関係で、古いシステムでも解析して扱うことができます。当時の担当者とか制作会社がいなくなったなどで困られた方からの相談を頂くことがよくあります。お気軽にお問い合わせください。
環境
実施日 | 2020-07-04 |
サーバ | さくらのVPS 2G |
OS | CentOS 8.2 |
cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
事前準備
いきなりPHPのソースコードをダウンロードしてコンパイルして終わりってできたら良いんですがそういうわけにもいかなく色々準備しておくことがあります。
MySQL
事前にMySQLクライアントとして使うMySQLをインストールしておきます。
今回は▲の記事でインストールしたMySQLを使っていきます。
まだの場合は先にMySQLをインストールしておきます。
MySQLを使わない場合や他のデータベースを使う場合は、以降の configure を調整してください
PHP5.6.40のダウンロード
サーバに1つのPHPだけだったら、DNF(旧YUM)で入れたら楽なんですが、異なるバージョンのPHPを同居させようとなったらソースからインストールしたほうが融通が利きます。
公式サイトからダウンロードURLを確認
こちらからPHPのソースコードがダウンロードできます。
ただこちらは最新バージョンが対象のページです。
同じページの右メニューの一番下に「Old archives」があるのでクリックします。
https://www.php.net/releases/#5.6.40
ということで、こちらがPHP5.6.40です。
この中の「PHP 5.6.40 (tar.gz)」を使います。
https://www.php.net/distributions/php-5.6.40.tar.gz
リンク先を確認すると▲になっているのでこちらを使っていきます。ちなみにGoogle Chromeだったらリンクの上で右クリック「リンクのアドレスをコピー」で取れます。
公式サイトからダウンロード
cd /tmp
wget https://www.php.net/distributions/php-5.6.40.tar.gz
ls -la
どこでも良いんですが、とりあえず /tmp にダウンロードしてきます。
PHP5.6.40のインストール
設定
DIR_SOURCE=/tmp
PHP_VERSION=5.6.40
MYSQL_VERSION=8.0.20
MYSQL_TITLE=mysqlnd
MYSQL_CLIENT=mysqlnd
MYSQLI_CLIENT=mysqlnd
MYSQLPDO_CLIENT=mysqlnd
※MYSQL_VERSION は、独自にインストールしたMySQLを指定する場合に必要。DNF(旧YUM) で入れた MySQL を使う場合は未指定でOK。
事前準備
# /usr/local/src にディレクトリを作る
mkdir /usr/local/src/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE
# ↑で作ったディレクトリに移動
cd /usr/local/src/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE
# /tmp にアップしておいた tar.gz を移動
cp $DIR_SOURCE/php-$PHP_VERSION.tar.gz /usr/local/src/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php-$PHP_VERSION.tar.gz
# 解凍
tar xzf php-$PHP_VERSION.tar.gz
# 解凍先に移動
cd php-$PHP_VERSION
--with-libxml を付ける場合
dnf install libxml2-devel
--with-openssl を付ける場合
dnf install openssl-devel
--with-curl を付ける場合
dnf install curl-devel
--with-gmp を付ける場合
dnf install gmp-devel
--with-jpeg-dir を付ける場合
dnf install libjpeg-devel
--with-unixODBC を付ける場合
dnf install unixODBC-devel
--with-imap を付ける場合
https://www.php.net/manual/ja/book.imap.php
こちらの関数を使う場合に指定します。
dnf install libc-client-devel
--with-mcrypt を付ける場合
PHP7.2からは削除されるんですが、PHP5.6時代に作られたシステムだと必要になったりします。
yum install libmcrypt-devel
OpenSSLのバージョン
PHP5.6にあったOpenSSLのバージョンでないとビルド時に次のようなエラーメッセージがでます。
make: *** [Makefile:507: ext/openssl/openssl.lo] Error 1
OpenSSLは入っているのでconfigureは通ったけど、バージョンがダメなのでビルドでエラーです。
PHP5.6には、openssl 0.9.8 を使うのでインストールします。
CentOS 8 に古いOpenSSL0.9.8をインストール
configure には次のようにパスを指定します。
--with-openssl=/usr/local/lib/openssl-0.9.8zh
configure
./configure \
--prefix=/usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE \
--program-suffix=-$PHP_VERSION-mysqlc-$MYSQL_TITLE \
--with-config-file-path=/usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE \
--with-libdir=lib64 \
--with-pic \
--with-curl \
--with-freetype-dir=/usr \
--with-png-dir=/usr \
--with-jpeg-dir=/usr \
--with-gettext \
--with-gmp \
--with-iconv \
--with-layout=GNU \
--with-kerberos \
--with-unixODBC=shared,/usr \
--with-gd \
--with-zlib \
--with-mysql=$MYSQL_CLIENT \
--with-mysqli=$MYSQL_CLIENT \
--with-mysql-sock=$MYSQL_SOCKET_PATH \
--with-pdo-mysql=$MYSQL_CLIENT \
--with-openssl=/usr/local/lib/openssl-0.9.8zh \
--with-system-ciphers \
--without-pear \
--enable-cgi \
--enable-mbstring \
--enable-cli \
--enable-gd-native-ttf \
--enable-exif \
--enable-ftp \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-wddx \
--enable-shmop \
--enable-zip \
--enable-calendar \
--enable-fpm
imap を使うなら
--with-imap=/usr
--with-imap-ssl
mcrypt を使うなら
--with-mcrypt
soap を使うなら
--enable-soap
--with-zip PHP 7.4.0 以降
--enable-zip PHP 7.4.0 より前
インストール
make
make test
make install
パスを通す
# セット
echo 'PATH=$PATH:'"/usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE"/bin >> /etc/profile.d/php.sh
echo "export PATH" >> /etc/profile.d/php.sh
# 確認
cat /etc/profile.d/php.sh
# 反映
source /etc/profile.d/php.sh
php.iniを設定
# php.ini-development を php.ini としてコピーして配置
cp /usr/local/src/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php-$PHP_VERSION/php.ini-development /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# タイムゾーンを Asia/Tokyo に変更
sed -i -e "s/^;date\.timezone =[^A-Za-z]*$/date.timezone =/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
sed -i -e "s/^date\.timezone =[^A-Za-z]*$/date.timezone = Asia\/Tokyo/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
次の3つの .sock は yum でMySQLをインストールした場合の位置
# sed -i -e "s/^mysql\.default_socket =$/mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^mysqli\.default_socket =$/mysqli.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^pdo_mysql\.default_socket=$/pdo_mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
OPcacheの設定 (公式のデフォルトで設定)
http://php.net/manual/ja/opcache.installation.php
# sed -i -e "s/^;opcache.memory_consumption=/opcache.memory_consumption=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^;opcache.interned_strings_buffer=/opcache.interned_strings_buffer=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^;opcache.max_accelerated_files=/opcache.max_accelerated_files=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^;opcache.revalidate_freq=/opcache.revalidate_freq=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^;opcache.enable_cli=/opcache.enable_cli=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
vi /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
opcache.fast_shutdown=1
が無いと思うので [curl] の上あたりに追記する
# mysql をソースからインストールしている場合はこちら
sed -i -e "s/^mysql\.default_socket =$/mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
sed -i -e "s/^mysqli\.default_socket =$/mysqli.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
sed -i -e "s/^pdo_mysql\.default_socket=$/pdo_mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
確認
# php.iniのタイムゾーン
grep -E 'date.timezone|default_socket' /usr/local/lib/php-5.6.40-mysqlc-mysqlnd/php.ini
# php.ini
vi /usr/local/lib/php-5.6.40-mysqlc-mysqlnd/php.ini
バージョン
php-5.6.40-mysqlc-mysqlnd -v
PHP 5.6.40 (cli) (built: Jul 5 2020 01:53:48)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
PHP-FPM
php-fpm を使うにはconfigureに --enable-fpm を付けてビルドしておきます。
詳しくは次のページをご覧ください。
あとがき
mysqlnd について
昔はMySQLクライアントを複数から選択できていたので、「php-バージョン-mysqlc-クライアント」のようにしていたけど、もうmysqlnd一択みたいな感じなので名前に入れなくても良いかなと思います。
詳しくはこのあたり。