PHP8 を CentOS7 と CentOS8 にインストールする
◆ 公式サイトの方法だとビルドすることになる
◆ パッケージマネージャーを使うなら remi からインストールできる
◆ remi-safe だと /opt/remi 以下にバージョンごとにインストールされる
◆ remi-phpXX だと標準のバージョンを置き換えてインストールされる
◆ パッケージマネージャーを使うなら remi からインストールできる
◆ remi-safe だと /opt/remi 以下にバージョンごとにインストールされる
◆ remi-phpXX だと標準のバージョンを置き換えてインストールされる
最近はほぼ PHP を使ってなくて ちょっと機能を試してみるくらいなら Docker の php イメージを実行するくらいでした
CentOS へのインストールはなにか変わってたりするのかなと久々に試してみました
https://www.php.net/manual/ja/install.unix.php
基本は .tar.gz 形式のソースコードをダウンロードして make, make install みたいです
Debian ではパッケージマネージャーの apt を使う方法が紹介されてましたが 非公式のサードパーティビルドで公式サポートはしてないという警告付きでした
rpm 系は紹介もされてないようです
この方法だとビルドが必要なので 公式サイトの方法は使わずパッケージマネージャから入れようと思います
CentOS 代替ディストリビューションが安定するまでは CentOS 7 でもいいかと思います
試したバージョンは 7.9 です
yum で普通に php を入れると
でした
かなり古いですね
ただ PHP ではあまり有名ではなさそうですし 以前は使ってみたことがあったのですが 長続きしませんでした
そもそも バージョンを頻繁に切り替えたいわけではなく最新版を入れたいだけですし
ただ PHP では公式で rpm リポジトリが公開されていません
昔使ったときは remi というのを使ったので 調べてみたところ今でもこれが使われることが多いようです
調べてみると 非公式で個人で管理してるリポジトリらしいです
https://blog.remirepo.net/
そう聞くと不安もありますが 開発時のお試しだけでなく実際のサービスでもここのパッケージが使われてるみたいですし 実質標準みたいな感じなのでしょう
CentOS 用 RPM は RHEL 用と同じなのでリポジトリのページの Enterprise Linux 7 にある rpm ファイルをインストールします
「EPEL を先に入れないといけない」 と書いてる記事も見かけますが 依存関係として自動でインストールされるので これだけで十分です
こういう感じでインストールされます
インストール後に /etc/yum.repos.d/ を見ると remi 関係のファイルが色々増えてます
ただデフォルトで有効なのは remi-safe のみのようです
remi-safe だけでも 各バージョンの PHP をインストールできます
「yum search php」 を実行すると 全部のバージョンが見つかります
8.0 をインストールするので
を実行します
インストールされた php コマンドは php80 のようにバージョン付きになっています
バージョンごとのフォルダがあって その中の root フォルダ内に bin や home など Linux のルートフォルダのようなものが作られてます
ここには PHP の動作に必要なファイルのみがあるようです
remi 内の root フォルダには etc と var フォルダが見当たりませんが これらは /etc/opt や /var/opt の中に remi フォルダが作られて この中にあります
php80-php でインストールされるのは最低限のものだけなので mbstring など追加モジュールをインストールするなら 「php80-」 プレフィックス付きのパッケージをインストールします
など
コマンドも php となっています
そのほうが好みならこういうコマンドでインストールできます
httpd と php-fpm をインストールします
php-fpm はデフォルトでは 127.0.0.1:9000 を listen する設定です
fedora だとデフォルトが unix socket を使ってたと思います
今回はこのまま port の listen のままにします
remi の php-fpm では httpd の php.conf ファイルを作ってくれないようなので 自作します
[/etc/httpd/conf.d/php.conf]
これで apache と php-fpm を起動させれば PHP が動くはずです
デフォルトで php をインストールしようとすると バージョンは
でした
CentOS 8 では dnf の module 機能が使えて バージョンを切り替えできます
php の一覧をみると
7.4 まではありますが残念ながら最新の 8 はないようです
remi の追加は CentOS7 のときの URL の 7 を 8 にするだけです
CentOS7 よりも yum.repos.d の中身がスッキリしてます
バージョンごとの .repo ファイルがなくなり modular にまとまったみたいです
module のリストに remi が増えています
CentOS7 のときと同じく こっちは使わずデフォルトの remi-safe から php80 をインストールします
インストールすると CentOS7 のときと同じように /opt/remi や /etc/opt/remi フォルダができています
このあたりに違いはなさそうです
php80-php-fpm をインストールすると 「/etc/httpd/conf.d/php80-php.conf」 ができていました
ただし httpd パッケージは入らないので httpd は自分でインストールする必要があります
内容はこういう感じで unix socket を使うようになってました
自分で設定ファイルを書かなくてもインストールしてサービスを起動するだけで使えるので楽ですね
CentOS へのインストールはなにか変わってたりするのかなと久々に試してみました
公式サイトの配布
そういえば公式サイトは充実してるのに 公式サイトのインストール手順って読んだ覚えがなかったので見てみましたhttps://www.php.net/manual/ja/install.unix.php
基本は .tar.gz 形式のソースコードをダウンロードして make, make install みたいです
Debian ではパッケージマネージャーの apt を使う方法が紹介されてましたが 非公式のサードパーティビルドで公式サポートはしてないという警告付きでした
rpm 系は紹介もされてないようです
この方法だとビルドが必要なので 公式サイトの方法は使わずパッケージマネージャから入れようと思います
CentOS 7
もう次の CentOS 8 が出てますが CentOS 8 は 2021 年でサポート終了で CentOS 8 Stream にしても CentOS 7 より 1 ヶ月短いサポート期間ですCentOS 代替ディストリビューションが安定するまでは CentOS 7 でもいいかと思います
試したバージョンは 7.9 です
yum で普通に php を入れると
php 5.4.16-48.el7
でした
かなり古いですね
バージョン管理ツール
標準のバージョン以外を入れるなら Node.js で使われるようなバージョン管理ツールを使うこともできますただ PHP ではあまり有名ではなさそうですし 以前は使ってみたことがあったのですが 長続きしませんでした
そもそも バージョンを頻繁に切り替えたいわけではなく最新版を入れたいだけですし
remi
それ以外の方法では yum のリポジトリを追加して yum からインストールする方法がありますただ PHP では公式で rpm リポジトリが公開されていません
昔使ったときは remi というのを使ったので 調べてみたところ今でもこれが使われることが多いようです
調べてみると 非公式で個人で管理してるリポジトリらしいです
https://blog.remirepo.net/
そう聞くと不安もありますが 開発時のお試しだけでなく実際のサービスでもここのパッケージが使われてるみたいですし 実質標準みたいな感じなのでしょう
CentOS 用 RPM は RHEL 用と同じなのでリポジトリのページの Enterprise Linux 7 にある rpm ファイルをインストールします
yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
「EPEL を先に入れないといけない」 と書いてる記事も見かけますが 依存関係として自動でインストールされるので これだけで十分です
こういう感じでインストールされます
Installed:
remi-release.noarch 0:7.9-1.el7.remi
Dependency Installed:
epel-release.noarch 0:7-11
インストール後に /etc/yum.repos.d/ を見ると remi 関係のファイルが色々増えてます
# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-fasttrack.repo remi-glpi93.repo remi-php72.repo
CentOS-CR.repo CentOS-x86_64-kernel.repo remi-glpi94.repo remi-php73.repo
CentOS-Debuginfo.repo epel-testing.repo remi-modular.repo remi-php74.repo
CentOS-Media.repo epel.repo remi-php54.repo remi-php80.repo
CentOS-Sources.repo remi-glpi91.repo remi-php70.repo remi-safe.repo
CentOS-Vault.repo remi-glpi92.repo remi-php71.repo remi.repo
ただデフォルトで有効なのは remi-safe のみのようです
remi-safe だけでも 各バージョンの PHP をインストールできます
「yum search php」 を実行すると 全部のバージョンが見つかります
8.0 をインストールするので
yum install php80
を実行します
インストールされた php コマンドは php80 のようにバージョン付きになっています
# php80 -a
Interactive shell
php > echo phpversion();
8.0.6
remi-safe のインストール内容
インストール場所は /opt/remi/ 以下になっています# ll /usr/bin/php80
lrwxrwxrwx 1 root root 32 May 18 05:04 /usr/bin/php80 -> /opt/remi/php80/root/usr/bin/php
# ll /opt
total 8
drwxr-xr-x 3 root root 4096 May 18 05:04 remi
drwxr-xr-x 2 root root 4096 Oct 30 2018 rh
# ll /opt/remi
total 4
dr-xr-xr-x 3 root root 4096 May 18 05:04 php80
# ll /opt/remi/php80
total 8
-rw-r--r-- 1 root root 242 Apr 9 2020 enable
dr-xr-xr-x 15 root root 4096 May 18 05:04 root
# ll /opt/remi/php80/root/
total 52
lrwxrwxrwx 1 root root 7 May 18 05:04 bin -> usr/bin
dr-xr-xr-x 2 root root 4096 Apr 9 2020 boot
drwxr-xr-x 2 root root 4096 Apr 9 2020 dev
drwxr-xr-x 2 root root 4096 Apr 9 2020 home
lrwxrwxrwx 1 root root 7 May 18 05:04 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 18 05:04 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 9 2020 media
drwxr-xr-x 2 root root 4096 Apr 9 2020 mnt
drwxr-xr-x 2 root root 4096 Apr 9 2020 opt
dr-xr-xr-x 2 root root 4096 Apr 9 2020 proc
dr-xr-x--- 2 root root 4096 Apr 9 2020 root
drwxr-xr-x 3 root root 4096 May 18 05:04 run
lrwxrwxrwx 1 root root 8 May 18 05:04 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 9 2020 srv
drwxr-xr-x 2 root root 4096 Apr 9 2020 sys
drwxrwxrwt 2 root root 4096 Apr 9 2020 tmp
drwxr-xr-x 13 root root 4096 May 18 05:04 usr
# ll /opt/remi/php80/root/bin/
total 12488
lrwxrwxrwx 1 root root 9 May 18 05:04 phar -> phar.phar
-rwxr-xr-x 1 root root 15394 May 5 04:58 phar.phar
-rwxr-xr-x 1 root root 6380856 May 5 04:58 php
-rwxr-xr-x 1 root root 6380216 May 5 04:58 php-cgi
-rwxr-xr-x 1 root root 4886 May 5 04:58 phpize
バージョンごとのフォルダがあって その中の root フォルダ内に bin や home など Linux のルートフォルダのようなものが作られてます
ここには PHP の動作に必要なファイルのみがあるようです
remi 内の root フォルダには etc と var フォルダが見当たりませんが これらは /etc/opt や /var/opt の中に remi フォルダが作られて この中にあります
# ll /etc/opt/remi/php80/
total 100
drwxr-xr-x 4 root root 4096 May 18 05:04 X11
drwxr-xr-x 2 root root 4096 Apr 9 2020 opt
drwxr-xr-x 2 root root 4096 May 18 05:04 php.d
-rw-r--r-- 1 root root 62812 May 5 04:58 php.ini
drwxr-xr-x 2 root root 4096 Apr 9 2020 pki
drwxr-xr-x 5 root root 4096 May 18 05:04 pm
drwxr-xr-x 2 root root 4096 Apr 9 2020 skel
drwxr-xr-x 2 root root 4096 Apr 9 2020 sysconfig
drwxr-xr-x 3 root root 4096 May 18 05:04 xdg
drwxr-xr-x 2 root root 4096 Apr 9 2020 xinetd.d
# ll /var/opt/remi/php80/
total 64
drwxr-xr-x 2 root root 4096 Apr 9 2020 adm
drwxr-xr-x 2 root root 4096 Apr 9 2020 cache
drwxr-xr-x 2 root root 4096 Apr 9 2020 db
drwxr-xr-x 2 root root 4096 Apr 9 2020 empty
drwxr-xr-x 2 root root 4096 Apr 9 2020 games
drwxr-xr-x 2 root root 4096 Apr 9 2020 gopher
drwxr-xr-x 7 root root 4096 May 18 05:04 lib
drwxr-xr-x 2 root root 4096 Apr 9 2020 local
drwxr-xr-x 3 root root 4096 May 18 05:20 log
lrwxrwxrwx 1 root root 10 May 18 05:04 mail -> spool/mail
drwxr-xr-x 2 root root 4096 Apr 9 2020 nis
drwxr-xr-x 2 root root 4096 Apr 9 2020 opt
drwxr-xr-x 2 root root 4096 Apr 9 2020 preserve
drwxr-xr-x 3 root root 4096 May 18 05:20 run
drwxr-xr-x 4 root root 4096 May 18 05:04 spool
drwxrwxrwt 2 root root 4096 Apr 9 2020 tmp
drwxr-xr-x 2 root root 4096 Apr 9 2020 yp
php80-php でインストールされるのは最低限のものだけなので mbstring など追加モジュールをインストールするなら 「php80-」 プレフィックス付きのパッケージをインストールします
php80-php-mbstring
php80-php-gd
php80-php-pdo
など
remi-php80 を使う
remi-safe を使わずに remi-php80 を使うと CentOS 標準の php を置き換える形でインストールされて opt/remi フォルダは作られませんコマンドも php となっています
そのほうが好みならこういうコマンドでインストールできます
yum install --disablerepo=remi-safe --enablerepo=remi-php80 php
apache から実行する
remi-safe でインストールした php80 を apache から実行できるようにしますhttpd と php-fpm をインストールします
yum install httpd php80-php-fpm
php-fpm はデフォルトでは 127.0.0.1:9000 を listen する設定です
# cat /etc/opt/remi/php80/php-fpm.d/www.conf
(略)
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
(略)
fedora だとデフォルトが unix socket を使ってたと思います
今回はこのまま port の listen のままにします
remi の php-fpm では httpd の php.conf ファイルを作ってくれないようなので 自作します
[/etc/httpd/conf.d/php.conf]
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
これで apache と php-fpm を起動させれば PHP が動くはずです
# cat /var/www/html/a.php
<?php
echo 1 + 1;
# curl http://localhost/a.php
2
CentOS 8
次は CentOS 8 ですデフォルトで php をインストールしようとすると バージョンは
php 7.2.24-1.module_el8.2.0+313+b04d0a66
でした
CentOS 8 では dnf の module 機能が使えて バージョンを切り替えできます
php の一覧をみると
# dnf module list php
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:01:49 ago on Tue May 18 07:03:25 2021.
CentOS Linux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
php 7.4 common [d], devel, minimal PHP scripting language
7.4 まではありますが残念ながら最新の 8 はないようです
remi
仕方ないので今回も remi リポジトリを追加しますremi の追加は CentOS7 のときの URL の 7 を 8 にするだけです
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
CentOS7 よりも yum.repos.d の中身がスッキリしてます
# ls /etc/yum.repos.d/
CentOS-Linux-AppStream.repo CentOS-Linux-Extras.repo CentOS-Linux-PowerTools.repo epel-testing.repo
CentOS-Linux-BaseOS.repo CentOS-Linux-FastTrack.repo CentOS-Linux-Sources.repo epel.repo
CentOS-Linux-ContinuousRelease.repo CentOS-Linux-HighAvailability.repo epel-modular.repo remi-modular.repo
CentOS-Linux-Debuginfo.repo CentOS-Linux-Media.repo epel-playground.repo remi-safe.repo
CentOS-Linux-Devel.repo CentOS-Linux-Plus.repo epel-testing-modular.repo remi.repo
バージョンごとの .repo ファイルがなくなり modular にまとまったみたいです
module のリストに remi が増えています
# dnf module list php
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:03:33 ago on Tue May 18 07:08:16 2021.
CentOS Linux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
php 7.4 common [d], devel, minimal PHP scripting language
Remi's Modular repository for Enterprise Linux 8 - x86_64
Name Stream Profiles Summary
php remi-7.2 common [d], devel, minimal PHP scripting language
php remi-7.3 common [d], devel, minimal PHP scripting language
php remi-7.4 common [d], devel, minimal PHP scripting language
php remi-8.0 common [d], devel, minimal PHP scripting language
CentOS7 のときと同じく こっちは使わずデフォルトの remi-safe から php80 をインストールします
dnf install php80
インストールすると CentOS7 のときと同じように /opt/remi や /etc/opt/remi フォルダができています
このあたりに違いはなさそうです
apache から実行する
apache との連携は CentOS7 と違っていましたphp80-php-fpm をインストールすると 「/etc/httpd/conf.d/php80-php.conf」 ができていました
ただし httpd パッケージは入らないので httpd は自分でインストールする必要があります
内容はこういう感じで unix socket を使うようになってました
(略)
# Redirect to local php-fpm if mod_php (5, 7 or 8) is not available
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<IfModule !mod_php.c>
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
<FilesMatch \.(php|phar)$>
SetHandler "proxy:unix:/var/opt/remi/php80/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
</IfModule>
</IfModule>
自分で設定ファイルを書かなくてもインストールしてサービスを起動するだけで使えるので楽ですね