CentOS PHP

CentOS 8のApache環境にPHPをインストールして使えるようにする手順

2019年11月6日

centos8-php-install

以前の記事でCentOS 8にApache httpdのインストールとバーチャルホスト設定する手順を紹介しました。
今回はその続きとして、記事内で構築したApache httpdのバーチャルホスト環境へPHPをインストールしてテスト用のページが表示できるところまでの手順を紹介します。

参考CentOS 8に Apache httpdのインストールとバーチャルホスト設定手順を紹介した記事

Open Source
centos8-httpd-virtualhost-top
CentOS 8のApacheにバーチャルホストを設定してサーバーを有効利用する

CentOS 8に用意されたApache httpdパッケージをインストールしてテストページが見えるところまでを前回の記事で紹介しました。今回は記事内でインストールした「Apache httpd」を利 ...

昨今のウェブサイトは静的なHTMLではなく、ユーザーの要求に応えて動的にHTMLを生成する「アプリケーションサーバー」で作成されていることが殆どです。このアプリケーションサーバーとしてオープンソースで代表的なものがPHPです。PHPで記述されたアプリケーションはWordPressEC-CUBE等、現在のウェブサイトを構成する上で欠かせないものばかりになります。
是非、本記事を参考にPHPを導入してみて下さい。

1. PHPの概要とインストール環境

PHPのインストールですが、Apache httpdのバージョンがCentOS 7の「2.4.6」から大きく変更されてCentOS 8では「http/2」が利用できる「2.4.37」が採用されています。またPHPでもCentOS 7まで利用されていた5.4系ではなく7.2系が採用されています。インストールに関連する違いとしてはApache httpdがデフォルトで「eventMPM」に対応していることです。そのため、PHPのインストールと設定手順がCentOS 7とは大きく異なります。

1-1. Apache のMPMについて

MPMは「マルチプロセッシングモジュール」の略で、簡単に言うとApacheの並列処理に関する挙動の方式になります。MPMはその名の通り、Apacheのモジュールとして提供されており、設定ファイルを変更することで、MPMの変更が可能です。
MPMは主に以下の3つのモジュールがあります。

preforkMPM安定した通信が可能だが、アクセスが多い場合CPUとメモリを多く使う
workerMPMマルチスレッドとマルチプロセスのハイブリッド型。preforkに比べてメモリとCPU使用量が少ない
eventMPMApache2.4系から導入されたマルチスレッドとマルチプロセスのモジュール。CPUとメモリの使用量が少ない

CentOS 8ではApache httpdをパッケージでインストールした場合、デフォルトではeventMPMモジュールが読み込まれるように設定されています。eventMPMでPHPを導入するためにはCGIモードで動作する「php-fpm」のインストールと設定が必要になります。その点を踏まえて、インストールと設定の手順を紹介していきます。

1-2. PHPを導入するOSの環境と設定

CentOS 8にPHPを導入する環境は以前の記事で紹介していますが、基本的な環境について改めて記載しておきます。

PHPをインストールする環境

  • OSのバージョンはCentOSでバージョン8.0.1905.を利用
  • ウェブサーバーとしてApache httpd 2.4.37 をインストール済み
  • Apacheはバーチャルホストとして基本的な設定が完了して、テストページが表示されてる
  • サーバーはグローバルIPアドレスが割り当てられている
  • ファイアウォールとしてfirewalldを設定済み

参考

利用しているCentOSのバージョンは以下のように確認できます。

 command
$ cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

利用しているApache httpdのバージョンは以下のコマンドで確認できます。

 command
$ httpd -V | head -n 1
Server version: Apache/2.4.37 (centos)

PHPのインストールを行う前に利用しているOSとApache httpdのバージョンを確認することをオススメします。

システムにインストールするPHPのバージョンですが、現在、利用されている主なバージョンとしては以下の5つがあります。

PHPのバージョンと特徴

  • 5.4系(CentOS 7系のベースに登録されているもの、OSのサポート期間に準ずる)
  • 5.6系(2018年12月31日でサポート終了)
  • 7.1系(7系の前バージョン、サポート期間がやや短い)
  • 7.2系(CentOS 8系のAppstreamに登録されている、OSのサポート期間に準ずる)
  • 7.3系(最新のメジャーバージョン、サポート期間が長い)

これ以前のバージョン(OSのベースパッケージ以外で導入したPHPについては5.4もサポートが終了しています。)については、サポートが終了しているため、利用しないことを推奨します。本記事ではセキュリティ面とパフォーマンス(PHP5系と比較して2倍の処理能力ある)からPHP 7系でパッケージから導入できるバージョンの「7.2系」をインストールしていきます。

2. PHPパッケージの確認

PHP7.2系のインストール前に利用できるPHPパッケージの確認を行います。パッケージの確認は"dnf search"コマンドで行います。"dnf search"コマンドは後に指定した文字列のパッケージを検索するコマンドです。以下のように実行します。

 command
$ dnf search php
==================================== 概要 & 名前 一致: php ====================================
php.x86_64 : PHP scripting language for creating dynamic web sites
php-common.x86_64 : Common files for PHP
php-fpm.x86_64 : PHP FastCGI Process Manager
php-dbg.x86_64 : The interactive PHP debugger
php-cli.x86_64 : Command-line interface for PHP
php-pgsql.x86_64 : A PostgreSQL database module for PHP
php-devel.x86_64 : Files needed for building PHP extensions
php-xml.x86_64 : A module for PHP applications which use XML
php-ldap.x86_64 : A module for PHP applications that use LDAP
php-json.x86_64 : JavaScript Object Notation extension for PHP
php-embedded.x86_64 : PHP library for embedding in applications
php-enchant.x86_64 : Enchant spelling extension for PHP applications
php-pear.noarch : PHP Extension and Application Repository framework
php-intl.x86_64 : Internationalization extension for PHP applications
php-odbc.x86_64 : A module for PHP applications that use ODBC databases
php-dba.x86_64 : A database abstraction layer module for PHP applications
php-pdo.x86_64 : A database access abstraction module for PHP applications
php-soap.x86_64 : A module for PHP applications that use the SOAP protocol
php-gmp.x86_64 : A module for PHP applications for using the GNU MP library
php-mysqlnd.x86_64 : A module for PHP applications that use MySQL databases
php-process.x86_64 : Modules for PHP script using system process interfaces
php-bcmath.x86_64 : A module for PHP applications for using the bcmath library
php-recode.x86_64 : A module for PHP applications for using the recode library
php-gd.x86_64 : A module for PHP applications for using the gd graphics library
php-snmp.x86_64 : A module for PHP applications that query SNMP-managed devices
php-xmlrpc.x86_64 : A module for PHP applications which use the XML-RPC protocol
php-mbstring.x86_64 : A module for PHP applications which need multi-byte string handling
======================================= 名前 一致: php ========================================
php-opcache.x86_64 : The Zend OPcache
php-pecl-zip.x86_64 : A ZIP archive management extension
php-pecl-apcu.x86_64 : APC User Cache
php-pecl-apcu-devel.x86_64 : APCu developer files (header)

上記のように「php」文字列が含まれるパッケージのリストが表示されました。この中でPHPを利用するうえで基本となるパッケージとして以下が必要となります。

php7.2系基本パッケージ

  • php.x86_64 : Package that installs PHP 7.2
  • php-xml.x86_64 : A module for PHP applications which use XML
  • php-xmlrpc.x86_64 : A module for PHP applications which use the XML-RPC protocol

マルチバイト(主に日本語)に対応するためのパッケージと画像を処理するためのパッケージとして以下が必要になります。

マルチバイトと画像処理関連パッケージ

  • php-mbstring.x86_64 : A module for PHP applications which need multi-byte string handling
  • php-gd.x86_64 : A module for PHP applications for using the gd graphics library

データベース(MySQL、MariaDBを想定)と連携するためのパッケージは以下が必要です。データベースはMySQL(Mariadb)を利用する前提となります。PostgreSQLなど、MySQL系以外のデータベースを利用する場合には、これとは異なるパッケージが必要になります。

MySQLデータベース連携用パッケージ

  • php-pdo.x86_64 : A database access abstraction module for PHP applications
  • php-mysqlnd.x86_64 : A module for PHP applications that use MySQL databases

本記事では上記で紹介したPHP関連パッケージをインストール対象とします。

3. PHPパッケージのインストール

本章ではPHP7.2系のパッケージをインストールする手順を紹介していきます。まずインストールするパッケージの情報を確認してから"dnf install"コマンドでシステムへのインストールを行います。

3-1. PHPパッケージの情報確認

phpパッケージのインストール前に、パッケージの情報を確認しておきます。パッケージの情報は"dnf info"コマンドで行います。インストールする前にパッケージの役割を確認しておくことをおすすめします。実行結果は以下の通りです。

 command
$ dnf info php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd
利用可能なパッケージ
名前 : php
バージョン : 7.2.11
リリース : 1.module_el8.0.0+56+d1ca79aa
アーキテクチ : x86_64
サイズ : 1.5 M
ソース : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.src.rpm
Repo : AppStream
概要 : PHP scripting language for creating dynamic web sites
URL : http://www.php.net/
ライセンス : PHP and Zend and BSD and MIT and ASL 1.0
説明 : PHP is an HTML-embedded scripting language. PHP attempts to make it
: easy for developers to write dynamically generated web pages. PHP also
: offers built-in database integration for several commercial and
: non-commercial database management systems, so writing a
: database-enabled webpage with PHP is fairly simple. The most common
: use of PHP coding is probably as a replacement for CGI scripts.
:
: The php package contains the module (often referred to as mod_php)
: which adds support for the PHP language to Apache HTTP Server. 名前 : php-gd
バージョン : 7.2.11
リリース : 1.module_el8.0.0+56+d1ca79aa
アーキテクチ : x86_64
サイズ : 83 k
ソース : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.src.rpm
Repo : AppStream
概要 : A module for PHP applications for using the gd graphics library
URL : http://www.php.net/
ライセンス : PHP
説明 : The php-gd package contains a dynamic shared object that will add
: support for using the gd graphics library to PHP. 名前 : php-mbstring
バージョン : 7.2.11
リリース : 1.module_el8.0.0+56+d1ca79aa
アーキテクチ : x86_64
サイズ : 580 k
ソース : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.src.rpm
Repo : AppStream
概要 : A module for PHP applications which need multi-byte string handling
URL : http://www.php.net/
ライセンス : PHP and LGPLv2 and OpenLDAP
説明 : The php-mbstring package contains a dynamic shared object that will add
: support for multi-byte string handling to PHP. 名前 : php-mysqlnd
バージョン : 7.2.11
リリース : 1.module_el8.0.0+56+d1ca79aa
アーキテクチ : x86_64
サイズ : 190 k
ソース : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.src.rpm
Repo : AppStream
概要 : A module for PHP applications that use MySQL databases
URL : http://www.php.net/
ライセンス : PHP
説明 : The php-mysqlnd package contains a dynamic shared object that will add
: MySQL database support to PHP. MySQL is an object-relational database
: management system. PHP is an HTML-embeddable scripting language. If
: you need MySQL support for PHP applications, you will need to install
: this package and the php package.
:
: This package use the MySQL Native Driver 名前 : php-pdo
バージョン : 7.2.11
リリース : 1.module_el8.0.0+56+d1ca79aa
アーキテクチ : x86_64
サイズ : 122 k
ソース : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.src.rpm
Repo : AppStream
概要 : A database access abstraction module for PHP applications
URL : http://www.php.net/
ライセンス : PHP
説明 : The php-pdo package contains a dynamic shared object that will add
: a database access abstraction layer to PHP. This module provides
: a common interface for accessing MySQL, PostgreSQL or other
: databases. 名前 : php-xml
バージョン : 7.2.11
リリース : 1.module_el8.0.0+56+d1ca79aa
アーキテクチ : x86_64
サイズ : 188 k
ソース : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.src.rpm
Repo : AppStream
概要 : A module for PHP applications which use XML
URL : http://www.php.net/
ライセンス : PHP
説明 : The php-xml package contains dynamic shared objects which add support
: to PHP for manipulating XML documents using the DOM tree,
: and performing XSL transformations on XML documents. 名前 : php-xmlrpc
バージョン : 7.2.11
リリース : 1.module_el8.0.0+56+d1ca79aa
アーキテクチ : x86_64
サイズ : 89 k
ソース : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.src.rpm
Repo : AppStream
概要 : A module for PHP applications which use the XML-RPC protocol
URL : http://www.php.net/
ライセンス : PHP and BSD
説明 : The php-xmlrpc package contains a dynamic shared object that will add
: support for the XML-RPC protocol to PHP.

各パッケージのバージョンや機能の説明を確認後、インストールに入ります。

3-2. PHPのインストール

パッケージは"dnf install"コマンドでインストールすることができます。「項目3-1.」 でインストールが必要なパッケージの情報が確認できましたので、以下のようにコマンドを実行してパッケージをインストールします。

 command
# dnf install -y php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd

上記では"dnf install"コマンドに"-y"オプションを付けることでインストール時の確認応答を省いています。パッケージを複数インストールする場合はスペースを入れてパッケージ名を列記します。コマンドを実行すると、以下のようにインストールが開始されます。

 log
# dnf install -y php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd
メタデータの期限切れの最終確認: 0:12:47 時間前の 2019年11月02日 17時16分09秒 に実施しました。
依存関係が解決しました。
===============================================================================================
パッケージ アーキテクチャー
バージョン リポジトリ サイズ
===============================================================================================
Installing:
php x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 1.5 M
php-gd x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 83 k
php-mbstring x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 580 k
php-mysqlnd x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 190 k
php-pdo x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 122 k
php-xml x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 188 k
php-xmlrpc x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 89 k
依存関係をインストール中:
nginx-filesystem noarch 1:1.14.1-9.module_el8.0.0+184+e34fea82 AppStream 24 k
php-cli x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 3.1 M
php-common x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 653 k
弱い依存関係をインストール中:
php-fpm x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa AppStream 1.6 M
Enabling module streams:
nginx 1.14
php 7.2 トランザクションの概要
===============================================================================================
インストール 11 パッケージ ダウンロードサイズの合計: 8.1 M
インストール済みのサイズ: 29 M
パッケージのダウンロード中です:
(1/11): nginx-filesystem-1.14.1-9.module_el8.0.0+184+e34fea82. 247 kB/s | 24 kB 00:00
(2/11): php-common-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64. 1.4 MB/s | 653 kB 00:00
(3/11): php-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64.rpm 2.2 MB/s | 1.5 MB 00:00
(4/11): php-gd-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64.rpm 1.9 MB/s | 83 kB 00:00
(5/11): php-mbstring-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_6 3.8 MB/s | 580 kB 00:00
(6/11): php-cli-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64.rpm 3.3 MB/s | 3.1 MB 00:00
(7/11): php-pdo-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64.rpm 1.9 MB/s | 122 kB 00:00
(8/11): php-mysqlnd-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 1.7 MB/s | 190 kB 00:00
(9/11): php-fpm-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64.rpm 3.3 MB/s | 1.6 MB 00:00
(10/11): php-xmlrpc-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 1.4 MB/s | 89 kB 00:00
(11/11): php-xml-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64.rp 2.6 MB/s | 188 kB 00:00
-----------------------------------------------------------------------------------------------
合計 3.3 MB/s | 8.1 MB 00:02
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
準備 : 1/1
Installing : php-common-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 1/11
Installing : php-cli-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 2/11
Installing : php-pdo-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 3/11
Installing : php-xml-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 4/11
scriptletの実行中: nginx-filesystem-1:1.14.1-9.module_el8.0.0+184+e34fea82.noarch 5/11
Installing : nginx-filesystem-1:1.14.1-9.module_el8.0.0+184+e34fea82.noarch 5/11
Installing : php-fpm-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 6/11
scriptletの実行中: php-fpm-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 6/11
Installing : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 7/11
Installing : php-xmlrpc-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 8/11
Installing : php-mysqlnd-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 9/11
Installing : php-gd-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 10/11
Installing : php-mbstring-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 11/11
scriptletの実行中: php-mbstring-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 11/11
scriptletの実行中: php-fpm-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 11/11
検証 : nginx-filesystem-1:1.14.1-9.module_el8.0.0+184+e34fea82.noarch 1/11
検証 : php-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 2/11
検証 : php-cli-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 3/11
検証 : php-common-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 4/11
検証 : php-fpm-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 5/11
検証 : php-gd-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 6/11
検証 : php-mbstring-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 7/11
検証 : php-mysqlnd-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 8/11
検証 : php-pdo-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 9/11
検証 : php-xml-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 10/11
検証 : php-xmlrpc-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 11/11 インストール済み:
php-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
php-gd-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
php-mbstring-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
php-mysqlnd-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
php-pdo-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
php-xml-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
php-xmlrpc-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
php-fpm-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
nginx-filesystem-1:1.14.1-9.module_el8.0.0+184+e34fea82.noarch
php-cli-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64
php-common-7.2.11-1.module_el8.0.0+56+d1ca79aa.x86_64 完了しました!

エラーがなく「完了しました!」と表示されれば、PHPパッケージはシステムにインストールされています。

3-3. インストールされたPHPパッケージの確認

PHPがインストールされたことを確認します。インストールされているパッケージは"dnf list"コマンドで確認できます。以下のようにコマンドを実行することで、インストールされたPHPパッケージを確認します。

 command
$ dnf list installed | grep php
php.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-cli.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-common.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-fpm.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-gd.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-mbstring.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-mysqlnd.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-pdo.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-xml.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream
php-xmlrpc.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream

インストールされているPHPパッケージが表示されれば、パッケージの確認は完了です。

3-4. php72 cliの動作確認

PHPはウェブサーバー以外に「CLI」(Command Line Interface:コマンド入力用インターフェイス)から動作させることも可能です。CLI用に用意された"php"コマンドを使ってPHPのバージョンを確認してみます。"-v"オプションを付けて以下のように実行します。

 command
$ php -v
PHP 7.2.11 (cli) (built: Oct 9 2018 15:09:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

インストールされている7.2系のバージョンが表示されました。

4. php-fpmの設定

ここからはphp側の追加作業としてphp-fpmの設定を説明していきます。php-fpm(FastCGI Process Manager)はPHPスクリプトをCGIとして動作させるためのパッケージです。

PHPには「モジュール版」「CGI版」があり、古いバージョンのApacheで利用されるものはモジュール版になります。「php-fpm」はCGI版で、FastCGIは通常のCGIよりパフォーマンスの向上が見込めるものになります。モジュール版と比較して、高負荷なサイトでのパフォーマンスアップを期待できます。

4-1. インストールされたphp-fpmパッケージの確認

項目.でPHPパッケージのインストールを行うと、合わせてphp-fpmのパッケージもインストールされます。念のためシステムに「php-fpm」パッケージがインストールされていることを確認します。

インストールされているパッケージは"dnf list"コマンドで確認できます。以下のようにコマンドを実行して、システムにphp-fpmパッケージがインストールされていることを確認します。

 command
$ dnf list installed | grep php-fpm
php-fpm.x86_64 7.2.11-1.module_el8.0.0+56+d1ca79aa @AppStream

上記のようにphp-fpmパッケージ名が表示されれば、インストール後のパッケージ確認は完了です。

4-2. php-fpm設定ファイルの変更

php-fpmは本記事の環境で利用するために、いくつかの設定変更を行う必要があります。本章では設定ファイルの場所と、設定変更が必要なパラメータについて説明していきます。設定の前提条件は以下になります。

  • 動作ユーザーとグループをApacheに合わせてwwwに変更
  • メモリなどのパフォーマンス設定を行う(メモリ1GBと前提)

パフォーマンス設定については、運用環境に合わせて行う必要がありますが、本記事ではサンプルとしてメモリが1GBあるサーバーで動作させることを考えた数値設定を行います。実際には設定値の調整が必要になりますので、参考として考えて下さい。なお、本記事ではパフォーマンス設定の詳細や調整については割愛しています。

4-2-1. php-fpm設定ファイルのバックアップ

php-fpmの設定は"/etc/php-fpm.d/"以下にある「www.conf」ファイルで行います。www.confの設定変更前に、ファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

 command
# cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org

バックアップの完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/php-fpm.d/www.conf

4-3. www.conf設定ファイルの変更

バックアップの後、www.confファイルの変更を行います。変更点は以下となります。

4-3-1. php-fpmを動作させるユーザー、グループの設定変更

php-fpmを動作させるユーザーとグループについては、Apache側での設定に合わせる必要があります。本記事で利用している環境では、Apacheの動作ユーザーとグループとしてwwwを設定していますので、www.conf設定ファイルの以下の部分をapacheからwwwに変更します。20行目付近にある設定パラメーター、userとgroupを変更します。

 code
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

上記の"user"と"group"パラメータを以下のように変更します。

 code
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = www
; RPM: Keep a group allowed to write in log dir.
group = www

4-3-2. ソケット接続用の設定

php-fpmが接続用に利用するソケットのlistenオーナーとlistenグループ、listenモードを設定します。本環境を変更しない場合にはapacheからphp-fpmのソケットに権限不足で接続出来ずにエラーになります。

 code
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
; mode is set to 0660
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

上記の"listen.owner"、"listen.group"、"listen.mode"パラメータをApache httpdの設定に合わせて以下のように変更します。

 code
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
; mode is set to 0660
listen.owner = www
listen.group = www
listen.mode = 0666

続いてパフォーマンスに関するパラメータを設定します。

4-3-3. pm.max_パラメーターの変更

次にパフォーマンスに関するパラメータの"pm.max_"が付いた各パラメータを変更します。デフォルトでの設定だとメモリを多く使い過ぎてしまうことがありますので、数値をやや低めに設定しています。基本的にはサーバーのスペックやHTTPのリクエスト数に応じて設定を変更する必要がありますので、ここでの設定は参考までに考えて下さい。

まず"pm.max_children"パラメータを50から25に変更します。pm.max_childrenは処理を行う子プロセスの最大数で多すぎるとメモリを容量以上に利用しますので、ここでは50から25へ落としています。

 code
;pm.max_children = 50
pm.max_children = 25

「pm.start_servers」パラメータはphp-fpmのサービス開始時に起動される子プロセスの数になります。少し多めに5から10へ変更しています。

 code
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
;pm.start_servers = 5
pm.start_servers = 10

「pm.min_spare_servers」パラメータは待ち状態にあるphp-fpm子プロセスの最小の数値になります。多少、多めに5から10へ変更しています。

 code
; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
;pm.min_spare_servers = 5
pm.min_spare_servers = 10

「pm.max_spare_servers」パラメータは待ち状態にあるphp-fpm子プロセスの最大の数値になります。多少、少な目に35から20へ変更しています。

 code
; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
;pm.max_spare_servers = 35
pm.max_spare_servers = 20

「pm.max_requests」パラメータは子プロセスが再起動するまでに実行するリクエスト数です。デフォルトでは0なので再起動しませんが、メモリリークの対応として再起動を行うようにコメントアウトを外します。(500リクエストを実行後に子プロセスが再起動を行う。)

 code
; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
;pm.max_requests = 500
pm.max_requests = 500

以上のパラメータを変更後にファイルを保存します。これでphp-fpmの設定ファイル変更は完了です。

5. php-fpmの起動と自動起動設定

ここまででphp-fpmの基本的な設定は完了しましたので、本章ではphp-fpmの起動と起動後の状態確認、及びphp-fpmの自動起動設定を行います。

5-1. php-fpmの起動と起動後の確認

起動できる状態に設定が完了しましたので、早速php-fpmを起動してみます。"systemctl start"コマンドを以下のように実行します。

 command
# systemctl start php-fpm

上記のようにActive項目に”active (running)”に出力されておりエラーが出力されなければphp-fpmは正常に起動しています。起動後にphp-fpmのstatusを確認します。

 command
$ systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2019-11-02 18:08:09 JST; 20min ago
Main PID: 5061 (php-fpm)
Status: "Processes active: 0, idle: 10, Requests: 2, slow: 0, Traffic: 0req/sec"
Tasks: 11 (limit: 11374)
Memory: 35.7M
CGroup: /system.slice/php-fpm.service
tq5061 php-fpm: master process (/etc/php-fpm.conf)
tq5062 php-fpm: pool www
tq5063 php-fpm: pool www
tq5064 php-fpm: pool www
tq5065 php-fpm: pool www
tq5066 php-fpm: pool www
tq5067 php-fpm: pool www
tq5068 php-fpm: pool www
tq5069 php-fpm: pool www
tq5070 php-fpm: pool www
mq5071 php-fpm: pool www

上記の出力結果から、php-fpmは正常に起動していることが確認できます。これでphp-fpmの起動と確認は完了です。

5-2. php-fpmの自動起動設定

サーバーの再起動や停止の復旧時に、php-fpmが自動的に起動するように設定します。サービスの自動起動を設定するには"systemctl enable"コマンドを利用します。自動起動は以下のようにsystemctlコマンドを実行します。

 command
# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

エラーが出力されなければ、自動起動の設定は正常に完了しています。
続いて自動起動が設定されたことを確認します。こちらも"systemctl is-enabled"コマンドから確認できます。

 command
$ systemctl is-enabled php-fpm
enabled

上記のように「enabled」と表示されれば自動起動は設定されています。これでphp-fpm自動起動の確認は完了です。

6. PHPの基本的な設定

「項目5.」の手順までで、PHP7.2系パッケージの導入とphp-fpmの設定までが完了しました。phpの場合、この状態でも動作しますが、基本的な設定を行うことをお勧めします、本記事では運用するにあたって最低限、必要になる設定を行います。設定の前提は以下の通りです。

PHP 設定の前提

  • 最低限のセキュリティ設定
  • アップロードサイズの変更(2Mから20MBへ)
  • タイムゾーンの設定
  • マルチバイト対応(日本語対応)

この条件に合わせて設定を行っていきます。

6-1. php.iniの変更

PHPの設定は/etc/以下にあるphp.iniファイルで行います。php.iniの設定変更前に、既存のファイルをバックアップしておきます。以下の手順でコピーを行います。

 command
# cp -p /etc/php.ini /etc/php.ini.org

設定ファイルのバックアップ完了後、エディタでphp.ini設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/php.ini

6-1-1. PHPのセキュリティ設定

PHPはデフォルトの設定ではhttpヘッダーにバージョンを表示します。バージョンは必要以上に外部公開しないほうがシステムがセキュアになりますので、PHPのバージョンを非表示にする設定を行います。374行目にある「expose_php」パラメータを変更します。

 code
expose_php = On

「expose_php」OnをOffに変更します。

 code
expose_php = Off

6-1-2. アップロードサイズの変更

PHPのデフォルトではアップロードできるファイルのサイズが2MBに設定されています。2MBだとWordPressのテーマや大き目の動画をアップロードする際にエラーになりますので「20MB」に変更します。
まずはPOST アップロードするデータの最大サイズを設定する「post_max_size」を変更します。デフォルトでは8MBですが、これを20MBに変更します。
672行目にある

 code
post_max_size = 8M

「post_max_size = 8M」を20Mに変更します。

 code
post_max_size = 20M

「post_max_size」パラメータの変更だけでは、ファイルのアップロード容量を増やせないため、あわせて「upload_max_filesize」パラメータを変更します。
825行目にある

 code
upload_max_filesize = 2M

「upload_max_filesize = 2M」を 「20M」に変更します。

 code
upload_max_filesize = 20M

6-1-3. タイムゾーンの設定

タイムゾーンの設定を行います。これを設定しないとログにタイムゾーンが合っていないというエラーが大量に出力されます。勿論、アプリケーションが時間を扱う時にも運用環境に合わせて適切な設定が行われていないと問題になります。タイムゾーンを日本に合わせる場合には設定値は「Asia/Tokyo」になりますので、これを"date.timezone"パラメータに設定します。

902行目にコメントアウトされている

 code
;date.timezone =

「;date.timezone =」からコメントの「;」を削除して"Asia/Tokyo"を追記します。

 code
date.timezone = "Asia/Tokyo"

6-1-4. マルチバイト対応(日本語対応)設定

以下の項目は日本語を利用するうえでの設定変更になります。一般的な設定を紹介していますが、日本語の扱いは運用環境によって異なると思います。動作するアプリケーションに応じて、適宜、変更してください。まずはmbstringで使用される言語のデフォルト値を定義する「mbstring.language」を設定します。
1509行目のパラメーター「mbstring.language」を変更します。

 code
;mbstring.language = Japanese

上記のパラメータ「;mbstring.language = Japanese」のコメントアウトを外して以下のように変更します。

 code
mbstring.language = Japanese

続いて内部文字エンコーディングのデフォルト値を定義するパラメータ「mbstring.internal_encoding」を設定します。ここではOSのロケールに合わせて「UTF-8」を指定しています。
1516行目のパラメーター

 code
;mbstring.internal_encoding =

 code
mbstring.internal_encoding = UTF-8

に変更します。

HTTP通信の時のインプット文字コードを指定するmbstring.http_inputを設定します。ここではUTF-8を指定しています。
1524行目のパラメーター

 code
;mbstring.http_input =

 code
mbstring.http_input = UTF-8

に変更します。

HTTP 出力文字コードを指定する「mbstring.http_output」を設定します。ここではpassを指定して自動変換を行わないようにします。
1534行目のパラメーター

 code
;mbstring.http_output =

 code
mbstring.http_output = pass

に変更します。

HTTP 入力変換を有効にするmbstring.encoding_translationをOnにします。文字化けが発生した場合はOffにします。
1542行目のパラメーター

 code
;mbstring.encoding_translation = Off

 code
mbstring.encoding_translation = On

に変更します。

文字コード自動検出の優先順位を定義するパラメーターであるmbstring.detect_orderを設定します。autoの場合、UTF-8が最初に選択されるため、ここはautoで問題ないかと思います。コメントである”;”を削除します。
1547行目のパラメーター

 code
;mbstring.detect_order = auto

 code
mbstring.detect_order = auto

に変更します。

コードとして変換できない文字がある場合に、代替の文字を出力しないようmbstring.substitute_characterを設定します。コメントである”;”を削除します。
1552行目のパラメーター

 code
;mbstring.substitute_character = none

 code
mbstring.substitute_character = none

に変更します。
以上でphp.iniの設定変更は完了です。変更したファイルを保存します。

7. php.ini設定ファイルの反映とhttpdの確認

ここまででPHPとphp-fpmの基本的な設定は完了しました。変更した設定を反映するためにphp-fpmサービスを再起動します。systemctl restartコマンドを以下のように実行します。

 command
# systemctl restart php-fpm

エラーが出力されなければphp-fpmは正常に再起動しています。再起動後にphp-fpmサービスのstatusを確認します。

 command
$ systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2019-11-02 18:08:09 JST; 20min ago
Main PID: 5061 (php-fpm)
Status: "Processes active: 0, idle: 10, Requests: 2, slow: 0, Traffic: 0req/sec"
Tasks: 11 (limit: 11374)
Memory: 35.7M
CGroup: /system.slice/php-fpm.service
tq5061 php-fpm: master process (/etc/php-fpm.conf)
tq5062 php-fpm: pool www
tq5063 php-fpm: pool www
tq5064 php-fpm: pool www
tq5065 php-fpm: pool www
tq5066 php-fpm: pool www
tq5067 php-fpm: pool www
tq5068 php-fpm: pool www
tq5069 php-fpm: pool www
tq5070 php-fpm: pool www
mq5071 php-fpm: pool www

php-fpmの再起動に合わせてApache httpdサービスも再起動しておきます。

 command
# systemctl restart httpd

エラーが出力されなければApache httpdは正常に再起動しています。再起動後にApache httpdサービスのstatusを確認します。

 command
$ systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/httpd.service.d
mqphp-fpm.conf
Active: active (running) since Sat 2019-11-02 18:08:14 JST; 3h 38min ago
Docs: man:httpd.service(8)
Process: 5326 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 5077 (httpd)
Status: "Total requests: 2; Idle/Busy workers 100/0;Requests/sec: 0.000153; Bytes served/se>
Tasks: 213 (limit: 11374)
Memory: 25.0M
CGroup: /system.slice/httpd.service
tq5077 /usr/sbin/httpd -DFOREGROUND
tq5338 /usr/sbin/httpd -DFOREGROUND
tq5339 /usr/sbin/httpd -DFOREGROUND
tq5340 /usr/sbin/httpd -DFOREGROUND
mq5341 /usr/sbin/httpd -DFOREGROUND

上記の出力結果から、Apache httpdは正常に再起動していることが確認できます。これでPHPの設定反映は完了です。

8. 動作確認

ここまででPHPの設定が完了しましたので、ここからは実際にCLIを利用したテストと、ブラウザでサイトへ接続して正常にPHPが動作していることを確認していきます。利用しているブラウザはGoogle Chromeになります。

8-1. コマンドによるPHPの動作確認

コマンドラインからphpコマンドを利用してPHPの動作を確認することができます。phpコマンドを以下のように実行します。

 command
# php -r 'phpinfo();'

実行結果は以下のようになります。(出力される量が多いので一部のみを記載しています)

 log
phpinfo()
PHP Version => 7.2.11 System => Linux www 4.18.0-80.11.2.el8_0.x86_64 #1 SMP Tue Sep 24 11:32:19 UTC 2019 x86_64
Build Date => Oct 9 2018 15:09:36
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
Scan this dir for additional .ini files => /etc/php.d
Additional .ini files parsed => /etc/php.d/20-bz2.ini,
/etc/php.d/20-calendar.ini,
/etc/php.d/20-ctype.ini,
/etc/php.d/20-curl.ini,
/etc/php.d/20-dom.ini,
/etc/php.d/20-exif.ini,
/etc/php.d/20-fileinfo.ini,
/etc/php.d/20-ftp.ini,
/etc/php.d/20-gd.ini,
/etc/php.d/20-gettext.ini,
/etc/php.d/20-iconv.ini,
/etc/php.d/20-mbstring.ini, 【略】 PHP License
This program is free software; you can redistribute it and/or modify
it under the terms of the PHP License as published by the PHP Group
and included in the distribution in the file: LICENSE This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. If you did not receive a copy of the PHP license, or have any
questions about PHP licensing, please contact license@php.net.

以上のようにPHPの設定情報が表示されれば、PHPは正常に動作しています。

8-2. ブラウザでのPHP動作確認

ウェブブラウザからもPHPが動作することを確認しておきます。以前の記事設定したApache httpdのバーチャルホスト「rem-site.jp」側で確認を行います。「rem-site.jp」サイトのドキュメントルートにPHP動作確認用のファイルを作成して、ウェブブラウザからアクセスを行います。

8-2-1. 動作確認用のPHPファイル 作成

PHPの動作を確認するために利用するファイルを作成します。ここではドキュメントルートとして"/home/www/html/rem-site.jp"が設定されている前提です。ホームディレクトリに移動します。

 command
# cd /home/www/html/rem-site.jp
# ls
index.html

ホームディレクトリにviコマンドでtest.phpというファイル名を作成します。

 command
# vi test.php

test.phpファイルの内容は以下のようにしました。

 command
<?php phpinfo(); ?>

test.phpの変更後にファイルを保存してください。これで動作確認用ファイルの作成は完了です。

8-2-2. ウェブブラウザからテストファイルへのアクセス

ブラウザからインストールしたPHPの情報を表示する「phpinfo」が動作することを確認します。バーチャルホスト名が「rem-site.jp」の場合は以下のようにブラウザに入力します。

http://rem-site.jp/test.php

PHPがインストールされて、適切に設定ができている場合、以下のようなPHPの情報が画面に表示されます。

centos8-httpd-php

これでPHPの動作確認は完了です。作成したtest.phpファイルはセキュリティホールになりますので、削除しておきます。

9. まとめ

ここまででApache httpdとPHPの導入が完了しました。この状態でPHPプログラムは動作しますので、PHPの入門にも利用できます。WordPressなどのCMSを動作させるためには、別途データベースが必要になります。オープンソースの代表的なデータベースであるMariaDBを導入する手順については記事

Open Source
centos-mariadb-install-top2
MySQL互換のオープンソースDB MariaDB 10をインストールして利用する

前回の記事でウェブサーバーであるhttpdとアプリケーションサーバーであるphpのインストールが完了しましたので、作成した環境にデータベースとしてあるMariaDB(以前ならMySQL)をインストール ...

で紹介しています。まずは本環境でPHPでプログラムを作成して、PHPに慣れることをお勧めします。その後にデータベースを導入してLAMP環境を作成してみては如何でしょうか。


レムシステムでは、ブログで紹介した設定ができない場合や、利用中のサーバー・ネットワークについての相談を受け付けています。利用中のシステムやセットアップでお困りの点がございましたら、お気軽にご相談ください。

メールでのお問い合わせ

メールフォームからシステムの
知りたいことや問題点をお問い合わせ

メールで問い合わせる

電話でのお問い合わせ

電話でお気軽にお問い合わせください
(受付時間:平日10:00〜18:00)

053-525-7357

  • この記事を書いた人
  • 最新記事
レムシステム

小村定

SIerでIT系インフラの設計と構築を経験したのちに独立、「レムシステム株式会社」を設立する。インフラ系エンジニア歴20年の経験を活かしてITに関わる課題解決や効率化に取り組む日々を送っている。

Copyright© レムシステム エンジニアブログ , 2019 All Rights Reserved.