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