SEブログ

【PHP】CentOSにPHPをソースからインストールする

こんにちは!

 

LAMPの開発環境を EC2 上に作っているのですが、特定の PHP のバージョンがインストールする事ができませんでした。

そこで方法を見つけたので、備忘録的に書き残しておこうと思います。

また細かいのですが、自分の為にライブラリなどの説明なども書いております。これも備忘録的なものになります。

 

開発環境に必要な PHP のバージョンは 5.6.29 になっておりまして、現在、2018 年 4 月ですと、最新のバージョンは 5.6.34 以上になっているようです。

Unsupported Historical Releases | PHP

http://php.net/releases/

 

 

スポンサーリンク

背景と問題

 

特定のバージョンが必要なのは、仕事で本番環境と合わせる必要がある為になります。

私が使った Amazon Linux の場合、既存でインストールされているパッケージとの関係があって、 特定の PHP のバージョンをインストールできませんでした。

 

どうやら、PHP 5.6.29 には、libpcre.so.1 (pcre-8.32-17.el7.x86_64.rpm) という共有ライブラリというものが必要らしいのです。

これをインストールしようとすると、既にこれより古い共有ライブラリ (pcre-8.21-7.7.amzn1.x86_64) がインストールされており、競合してインストールに失敗してしまいます。

このライブラリについて調べたところ、分かり易い情報が見当たりませんでしたが、どうやら正規表現のライブラリのようです。

 

そこで、この共有ライブラリのパッケージである、 pcre を入れ替えようと試してみましたが、私ではどうにもなりませんでした。。。汗;

忘れずに、やってみた手順を書き残しておきます。

 

1. まず、OS のバージョンの確認をします。Amazon Linux は Redhat 系のディストリビューションなんですね。

[root@localhost ~]# cat /proc/version
Linux version 4.9.81-35.56.amzn1.x86_64 (mockbuild@gobi-build-64010) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) ...

また、Amazon Linux のバージョン確認についてはこちらになります。

[root@localhost ~]# cat /etc/system-release
Amazon Linux AMI release 2017.09

 

※ Amazon Linux AMI についての詳細は AWS のサイトを見ていただければと思います。

Amazon Linux AMI | AWS
https://aws.amazon.com/jp/amazon-linux-ami/

 

2. PHPがインストールされていない事を確認します。

[root@localhost ~]# rpm -qa | grep php*
xz-5.1.2-12alpha.12.amzn1.x86_64
xz-libs-5.1.2-12alpha.12.amzn1.x86_64

 

3. remiリポジトリを追加します。

[root@localhost ~]# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
Retrieving http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

 

リポジトリについてのまとめが Qiita にあったのでリンクを貼っておきますね。

yumリポジトリ追加リスト 完全版 | Qiita

https://qiita.com/bezeklik/items/9766003c19f9664602fe

 

ちょっと上のリンクのサイトを読んでいたのですが、こんな事が書いてありました。今知りました。。。汗;

Remi’s RPM repository
比較的新しい PHP を利用したい場合などに利用する。

 

4. yumで任意バージョンのPHPをインストールしたいので、リポジトリからインストール可能なパッケージを検索します。
ここに5.6.29が無い事がわかりました。

[root@localhost ~]# yum list --enablerepo=remi-php56 --showduplicates | grep remi | grep php.x86_64
 ...
 php55-uwsgi-plugin-php.x86_64 2.0.16-1.el7.remi remi-safe
 php56-php.x86_64 5.6.34-1.el7.remi remi-safe
 php56-php.x86_64 5.6.35-1.el7.remi remi-safe
 php56-uwsgi-plugin-php.x86_64 2.0.15-1.el7.remi remi-safe
 php56-uwsgi-plugin-php.x86_64 2.0.16-1.el7.remi remi-safe
 php70-php.x86_64 7.0.28-1.el7.remi remi-safe
 ...

 

5. 指定のバージョンを探したところ IUS リポジトリにあったので、rpmでインストールを試みました。

しかし、依存性の関係でインストールが中断しました。「libpcre.so.1 と php56u-common が必要だ」と言われました。

[root@localhost ~]# rpm -ivh https://dl.iuscommunity.org/pub/ius/archive/CentOS/7/x86_64/php56u-cli-5.6.29-1.ius.centos7.x86_64.rpm
Retrieving https://dl.iuscommunity.org/pub/ius/archive/CentOS/7/x86_64/php56u-cli-5.6.29-1.ius.centos7.x86_64.rpm
warning: /var/tmp/rpm-tmp.beB4WV: Header V4 DSA/SHA1 Signature, key ID 9cd4953f: NOKEY
error: Failed dependencies:
libpcre.so.1()(64bit) is needed by php56u-cli-5.6.29-1.ius.centos7.x86_64
php56u-common(x86-64) = 5.6.29-1.ius.centos7 is needed by php56u-cli-5.6.29-1.ius.centos7.x86_64

 

6. そこで、libpcre.so.1 のパッケージ pcre のインストールを試したところ、以下のパッケージと競合しておりインストールに失敗してしまいます。

[root@localhost ~]# rpm -ivh http://mirror.centos.org/centos/7/os/x86_64/Packages/pcre-8.32-17.el7.x86_64.rpm
Retrieving http://mirror.centos.org/centos/7/os/x86_64/Packages/pcre-8.32-17.el7.x86_64.rpm
warning: /var/tmp/rpm-tmp.kcjTRx: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing... ################################# [100%]
file /usr/lib64/libpcrecpp.so.0.0.0 from install of pcre-8.32-17.el7.x86_64 conflicts with file from package pcre-8.21-7.7.amzn1.x86_64
file /usr/lib64/libpcreposix.so.0 from install of pcre-8.32-17.el7.x86_64 conflicts with file from package pcre-8.21-7.7.amzn1.x86_64

 

7. パッケージを入れ替えれば解決するのではないかと思い、既存の pcre をアンインストールを試したところ、既にインストール済みの以下のパッケージが依存しており、アンインストールに失敗してしまいます。

[root@localhost ~]# rpm -qa | grep pcre
pcre-8.21-7.7.amzn1.x86_64
[root@localhost ~]# rpm -e pcre pcre-8.21-7.7.amzn1.x86_64
error: Failed dependencies:
libpcre.so.0()(64bit) is needed by (installed) grep-2.20-3.18.amzn1.x86_64
libpcre.so.0()(64bit) is needed by (installed) less-436-13.12.amzn1.x86_64
libpcre.so.0()(64bit) is needed by (installed) httpd24-2.4.27-3.75.amzn1.x86_64

 

ここまでやってみて考えたところ、別の環境で試しるのはどうかと思いまして、一旦ここで諦める事にしました。

 

 

スポンサーリンク

対応方法

 

という事で、別の環境で試してみようと思ったのですが、どういう環境が良いのか考えてみました。

限りなく、素の状態というか、最小構成に近いイメージが欲しくて探してみましたところ、AWS Marketplace で CentOS が AMI として使える事がわかり、それにしました。

(外からもアクセスができる必要もある為に、レンタルサーバーを使っております。)

 

詳細はこちらの記事を見て頂ければと思います。

 

【AWS】CentOSをAWS上で使う

【AWS】AMIの種類について

 

OS のバージョンの確認

[root@localhost ~]# cat /proc/version
Linux version 3.10.0-693.21.1.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 ...
[root@localhost ~]# cat /etc/system-release
CentOS Linux release 7.4.1708 (Core)

 

 

1. libxml2 と libxml2-devel と gcc をインストールします。

[root@localhost ~]# yum install libxml2 libxml2-devel gcc 

 

・libxml2 とは、XML を扱うための基本ライブラリで、PHPやPerlを使う場合に必要になります。

詳細は以下のサイトをご覧ください。

Libxml2 を使う | OSDN Magazine

https://mag.osdn.jp/03/10/07/1427238

 

・libxml2-devel とは、libxml2 の開発版で、一緒にインストールする必要があるようです。

ちなみに -devel の意味は、develop(開発する)を指します。

 

・gcc とは、フリー のコンパイラになります。詳細はよく理解できていないので、適切なリンクが貼れないです。(笑)

コンパイラでコンパイルするのですが、コンパイルという用語については以下のサイトをご覧ください。

 

コンパイルって何? | エン転職

https://employment.en-japan.com/tenshoku-daijiten/14875/

 

2. wget をインストールします。

[root@localhost ~]# yum install wget

 

・wget とは URL指定でファイルをダウンロードするコマンドになります。

詳細は以下のサイトをご覧ください。

【 wget 】コマンド――URLを指定してファイルをダウンロードする | @IT

http://www.atmarkit.co.jp/ait/articles/1606/20/news024.html

 

 

3. httpd と hpptd-devel をインストールします。

[root@localhost ~]# yum install httpd httpd-devel

・httpd とは Web サーバーソフトウェアの Apache の事を言います。Apache プロセスや実行ファイルを使う際は httpd と指定します。

また、Apache をインストールする時は、httpd を指定します。例えば yum install httpd といった感じになります。

詳細は以下のサイトをご覧ください。

 

初心者でもできる!Apacheをインストールする方法 | TECHACADEMY Magazine

https://techacademy.jp/magazine/1846

 

4. pcre と pcre-devel と perl と perl-devel をインストールします。

[root@localhost ~]# yum install pcre pcre-devel perl perl-devel

 

・pcre とは Developers.io 様の説明が分かり易いので引用させていただきます。pcre-devel は pcre の開発版になります。

Perlの正規表現と互換性のある正規表現を他の言語でも実現するために作られたライブラリで、現在はCentOSやFedora, RHEL等のLinux系のOSには標準でインストール出来る他、Apache,nginx等のミドルウェア、flash,mySql等のソフトウェア、PHP等このライブラリに依存しているパッケージは多く

【速報】ヤバい?問題ない?エンジニアが知っておくべき「PCRE Heap Overflow / CVE-2015-3210」 | Developers.io

https://dev.classmethod.jp/security/pcre-heap-overflow-vulnerability/

 

・perl とは Wikipedia 様の説明が分かり易いので引用させていただきます。

ウェブ・アプリケーション、システム管理、テキスト処理などのプログラムを書くのに広く用いられている。

Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。実用性と多様性を重視しており、C言語やsed、awk、シェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。ウェブ・アプリケーション、システム管理、テキスト処理などのプログラムを書くのに広く用いられている。

 

5. カレントディレクトリを移動します。

[root@localhost ~]# cd /usr/local/src/

 

6. PHP 5.6.29 の tar.gz をダウンロードします。

[root@localhost src]# wget http://museum.php.net/php5/php-5.6.29.tar.gz

 

7. tar コマンドで、ダウンロードした ファイルを解凍します。

[root@localhost src]# tar xzvf php-5.6.29.tar.gz

 

・tar コマンドで、複数のファイルを1つに圧縮したり、圧縮ファイルを解凍したりする事ができます。zip などと同じイメージになります。

【 tar 】コマンド(応用編)――アーカイブファイルの内容を確認する | @IT

http://www.atmarkit.co.jp/ait/articles/1608/18/news021.html

 

8. 解凍したフォルダのカレントディレクトリに移動します。

[root@localhost src]# cd php-5.6.29

 

9. configure コマンドを実行します。ここで MySQL や Apache のモジュールを有効にします。

この時に必ず –with-… を指定します。

指定しないと、PHP に関連する Apache のモジュールである libphp5.so がインストールされず、やり直しになってしまう可能性があります。

どうやら PHP5 のバグらしいです。調べてみると色々でてきます。

 

[root@localhost php-5.6.29]# ./configure \
--prefix=/usr/local/src/php-5.6.29 \
--with-apxs2=/bin/apxs \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd

 

・configure や 下の make も含めて、以下のサイトが参考になります。

 

./configure;make;make installにはどんな意味がある? | ITMedia エンタープライズ

http://www.itmedia.co.jp/help/tips/linux/l0302.html

 

10. make コマンドを実行します。ちなみに make と make test の実行中あたりでメモリが足らないとエラーが発生し、中断されました。(その際はメモリは 500MB でしたので、余裕を持って 2GB に変更したら問題なく完了しました。)

[root@localhost php-5.6.29]# make

 

11. make test コマンドを実行します。ここで少し時間がかかります。

[root@localhost php-5.6.29]# make test

 

12. make install コマンドを実行します。

[root@localhost php-5.6.29]# make install

 

13. PHP がインストールされたので、PHP のバージョンを確認してみます。

[root@localhost php-5.6.29]# /usr/local/src/php-5.6.29/bin/php -v
PHP 5.6.29 (cli) (built: Apr 18 2018 13:00:56)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

 

14. php.ini を作成します。確か yum でインストールすると /etc/ 直下に php.ini は生成されるかと思うのですが、ソースからインストールすると、作成されないんですかね。

php.ini-development 或いは php.ini-production ファイルを /etc/ 直下にファイル名 php.ini としてコピーします。

[root@localhost php-5.6.29]# cp -p php.ini-development /etc/php.ini

 

15. apache の設定ファイルを以下のように変更します。

[root@localhost php-5.6.29]# vi /etc/httpd/conf/httpd.conf

 

# localhost:80 を追記
ServerName localhost:80
 
# index.php を追記
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

# AddType を追記
AddType text/html .php
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# AddHandler を追記
AddHandler php5-script .php

# php のディレクトリを指定
PHPIniDir "/etc/php.ini"

 

16. PHP の設定ファイルを変更します。

[root@localhost php-5.6.29]# vi /etc/php.ini

 

以下の short_open_tag を Off から On に変更します。

;;;;;;;;;;;;;;;;;;;;
; Language Options ;
;;;;;;;;;;;;;;;;;;;;

; http://php.net/short-open-tag
 short_open_tag = On

 

17. Apache を再起動し、サービスが正常である事を確認します。

[root@localhost php-5.6.29]# systemctl restart httpd.service
[root@localhost php-5.6.29]# systemctl status httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Sun Apr 18 2018 13:21:16 UTC; 9min ago
...

 

CentOS 7 なので、Service コマンドではなく、systemctl コマンドを使っております。

詳細は以下のサイトが参考になります。

 

systemctl コマンド | Qiita

https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9

 

18. テスト用の php ファイルを作成します。

 

[root@localhost php-5.6.29]# cd /var/www/html/
[root@localhost html]# vi test.php
[/code]

 

<?php
    phpinfo();
?>

 

19. ブラウザからアクセスして、phpinfo が表示されたら OK です。

 

以上です。いかがでしょうか。

 

ソースからインストールするのは、rpm や yum でインストールする事と比べると気にしなければならない点が多いかなと思います。

うまくいかない時は、考えてから困ったときの Google 先生に聞くしかないですよね。

今回も本当に色んな方のブログを見て参考にさせて頂きました。ブログや@IT 様含めて様様です。

 

では最後までお読みいただきありがとうございました!