PHP Server

CentOS 8に構築したApacheにPHPとPHP-FPMの導入

PHPについて

PHP(ピー・エイチ・ピー)は 「The PHP Group」 によってコミュニティベースで開発されているオープンソースの汎用プログラミング言語です。
サーバーサイドで動的なWEBページ作成するための機能を多いのが特徴です。

本手順ではWEBブログツールの「WordPress」を安定稼働させるためのPHPの構築を行います。

 

▼公式WEB

 

構築環境

  • CentOS Linux release 8.2.2004 (Core)
  • httpd 2.4.37-21
  • PHP 7.3.20
  • WordPress 5.5
  • mysql 8.0.21

 

▼PHPインストールVer
CentOS 7まで5.4系のPHPが採用されているけど、CentOS 8からは7.2系が採用されています。
違いはApacheが『eventMPM』に対応していることです。
MPMは (Multi Processing Module) マルチプロセッシングモジュールの略で、WEBブラウザからのリクエストをApacheが効率よく並列処理をするための仕組みをモジュール化したもの。
ブラウザからのリクエストに対して外部プログラムを呼び出して処理をするCGIや、データベースとPHPにて動的に処理されるWordpressなどのWEBページに多数のリクエストが発生した際にサーバーのパフォーマンスをあげることができるのです。

 

このMPMにはいくつか種類があり、それぞれの特徴があります。

prefork WEBブラウザからリクエストが来る前に予め子プロセスを待機させておくことで子プロセスの生成回数を減らしパフォーマンスを上げる仕組みです。
worker マルチスレッドとマルチプロセスのハイブリッド型でpreforkと比べてプロセス数を抑えることができるのでCPUやメモリのリソース消費が少ないです。
しかしスレッドを使うためmod_phpなどの非スレッドモジュールにはパフォーマンスを発揮できないのです。
event Apache2.4系から導入されたworkerをベースとしたマルチスレッドモデルとマルチプロセスモデルのハイブリッドモデルです。
workerはサーバーからのレスポンス後にKeepAliveがの処理でリソースを使っていましたが、eventはサーバーからのレスポンス後、KeepAliveなどのコネクション管理を別のスレッドに任せるため、サーバースレッドのリソースが空いて次のリクエストを処理できるという仕組みです。
workerと同じくスレッドを使用するモデルです。

 

結局FPMは何を使う?

preforkはメモリ消費が多いから、非スレッドモデルのプログラムを動かさない限りeventが良いかなぁと思います。

 

 

▼php-fpm
FPM(FastCGI Process Manager)はPHPスクリプトをFastCGIとして動作させるための仕組みで、高負荷時のサーバーでパフォーマンスを発揮できます。

本手順ではこちらの構築も行います。

php-fpmをさらに詳しく

通常のCGIは、WEBブラウザからのリクエストがある度にプロセスの生成と破棄を行なっており、大量のリクエストがあればその分だけリソースを食いつぶしていた。
FastCGIは、初回リクエスト時に起動したプロセスをメモリにキャッシュして、次回以降のリクエスト処理はメモリに保持されたプロセスを実行することでCGIよりもパフォーマンスを向上させているのです。

 

 

PHPのインストール

▼PHP関連パッケージの一覧

CentOS 8 では dnf コマンドを利用してパッケージ情報検索やインストール、削除を行うことができます。
パッケージファイルが管理されているダウンロードサーバーをリポジトリと呼び、新規でリポジトリを追加することで、ダウンロードできるファイルの種類を増やすことが可能です。


 command
$ dnf search 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-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)

 

▼Wordpressで必要なPHPパッケージ

php PHPの本体。
php-xml XMLを利用できるようにするモジュール。
php-xmlrpc XML-RPCを利用できるようにするモジュール。
外部システムからの投稿や画像のアップロードにしようされるが脆弱性があるためWordpressの設定を変更する必要あります。
php-json JavaScriptObjectNotationを利用できるようにする拡張機能。
php-mbstring 日本語などマルチバイト文字に対応させるためのモジュール。
php-gd 画像を処理するために必要なモジュール。
php-mysqlnd MySQLを利用できるようにするモジュール。
php-pdo PHPからデータベースのアクセスを抽象的にできるモジュール。
MySQLやPostgreSQL等、どのデータベースを使用しても同じプログラムの書き方で使用できます。

 

▼PHP本体とモジュールのインストール

「-y」オプションを指定すると、インストール可否の確認で「yes」となり自動的にインストールが開始します。


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

 

▼インストールされたPHPパッケージを確認
リストの結果をパイプ「|」でgrep コマンドに送り「php」という文字列のみ表示。

 command
$ dnf list installed | grep php
php.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-cli.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-common.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-fpm.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-gd.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-json.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-mbstring.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-mysqlnd.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-pdo.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-xml.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream
php-xmlrpc.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @AppStream

 

▼インストールされたPHPのバージョン確認

 command
$ php -v
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

 

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

 command
$ dnf list installed | grep php-fpm
php-fpm.x86_64

 

 

php-fpmのコンフィグを設定

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

 

www.conf


▼Apacheに合わせてユーザーとグループを変更

例ではApacheの動作ユーザー、グループがwwwの例です。
user = www
group = www


▼php-fpmの接続権限の設定

php-fpmが利用するソケットのオーナー、グループ、モードの設定します。
この設定を行わないとソケット権限不足で接続時にエラーになります。
listen.owner = www
listen.group = www
listen.mode = 0666

 

【パフォーマンスチューニング】

▼処理を行う子プロセスの最大数
50だとメモリを容量以上に使ってしまうので半分に減らします。
pm.max_children = 25


▼php-fpmのサービス起動時の子プロセスの数

5から少し多めの10に変更します。
pm.start_servers = 10


▼待機状態のphp-fpmの子プロセスの最小数

5から少し多めの10に変更します。
pm.min_spare_servers = 10


▼待機状態のphp-fpmの子プロセスの最大数

35から25に少し減らします。
pm.max_spare_servers = 25


▼メモリーリーク対策

用に500リウエストを超えたら子プロセスが再起動するように設定します。
pm.max_requests = 500

 

 

phpのコンフィグ変更

 command
# vi /etc/php.ini

 

php.ini(PHPブロック)


▼レスポンスヘッダにPHPのバージョンを表示させない

expose_php = Off


▼ブラウザでのエラー表示させない

display_errors = Off


▼エラーをログに残す

log_errors = On


▼エラーログの最大バイト数

log_errors_max_len = 2048


▼エラーログ出力先

error_log = /var/log/php_errors.log


▼文字エンコーディング

default_charset = "UTF-8"

 

php.ini(Dateブロック)


▼タイムゾーンの設定

コメント「#」を外します。
date.timezone = "Asia/Tokyo"

 

php.ini(mbstringブロック)

▼デフォルト言語
コメント「#」を外します。
mbstring.language = Japanese


▼内部文字エンコーディング

コメント「#」を外します。
mbstring.internal_encoding = UTF-8


▼HTTP入力文字エンコーディング

コメント「#」を外します。
mbstring.http_input = auto


▼文字エンコーディング検出順序

mbstring.detect_order = auto

 

 

php-fpmの起動

▼php-fpmを起動

 command
# systemctl start php-fpm

ココに注意

php-fpmの起動時にエラーが出る場合はApache実行ユーザーと上記php-fpmのユーザーの不一致。
useraddでのユーザー作成含め、その辺りを見直しましょう。

 

▼php-fpmの起動後確認

 command
$ systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2020-09-27 13:54:37 +03; 8min ago

最後までエラーが無く Active: active (running) となっていればOK。

 

▼php-fpmの自動起動設定

 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.

 

php-fpmの自動起動確認

 command
# systemctl is-enabled php-fpm
enabled

enabled になっていればサーバー再起動で自動で敵にサービスが起動します。

 

 

phpの動作確認

▼phpファイルの作成
WEBから設置PHPにアクセスすると、phpの詳細情報を表示させるコードを記述します。
Apacheのドキュメントルートに設置したPHPファイルを設置してください。

 command
vi phpinfo.php

 

phpinfo.php

<?php
phpinfo();
?>

 

▼ブラウザでアクセス
設置したPHPファイルにブラウザからアクセスして下記画像のようなPHPのインフォメーションが表示されれば動作しています。

http://192.168.0.50/phpinfo.php

 

 

エラーログについて

▼PHPのエラーログの出し方

 command
#vi /etc/php.ini

 

php.ini

▼エラーログをONに設定
log_errors = On

▼ログの出力先を設定
error_log = "/var/log/httpd/php_error.log"

 

▼PHP7でMySQLエラー発生時

エラー内容

Call to undefined function mysql_connect()

 command
# vi /etc/php.ini

 

php.ini

▼コメントアウト「;」を外す
;extension=mysqli

 

 

おすすめ

1

Windows10で構築するサーバー構成の例 知らない人も多いかと思いますが、Windows8のころからWindowsは Hyper-v(ハイパーブイ)と呼ばれるハイパーバイザ型の仮想化システムと、 ...

2

記憶域について この記事ではWindows 10 の記憶域によるストレージの作成方法について解説します。 そもそも記憶域について詳しく知りたい方は、下記の記事で解説していますので、ご覧ください。 St ...

3

概要 WordPressとAFFINGER5についての解説記事でも少し紹介しましたが、AFFINGER5には270以上のタグ機能があります。 あまりにも数が多く探すのが大変なので、効果一覧を作っておき ...

4

ディレクションを担当した世界遺産のガイドアプリより、ムービー用のBGMを1曲担当しました。 Misumi-nishikou It is BGM created for app video. sound ...

5

こちらはプライベートで作成したYoutube投稿用サイクリングムービーのBGMです。 EDM Sound-2 EDM sound for my Youtube. soundcloud.com

-PHP, Server