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と同じくスレッドを使用するモデルです。 |
preforkはメモリ消費が多いから、非スレッドモデルのプログラムを動かさない限りeventが良いかなぁと思います。
▼php-fpm
FPM(FastCGI Process Manager)はPHPスクリプトをFastCGIとして動作させるための仕組みで、高負荷時のサーバーでパフォーマンスを発揮できます。
本手順ではこちらの構築も行います。
通常のCGIは、WEBブラウザからのリクエストがある度にプロセスの生成と破棄を行なっており、大量のリクエストがあればその分だけリソースを食いつぶしていた。
FastCGIは、初回リクエスト時に起動したプロセスをメモリにキャッシュして、次回以降のリクエスト処理はメモリに保持されたプロセスを実行することでCGIよりもパフォーマンスを向上させているのです。
PHPのインストール
▼PHP関連パッケージの一覧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
$ 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本体とモジュールのインストール
1 |
# dnf install -y php php-xml php-xmlrpc php-json php-mbstring php-gd php-mysqlnd php-pdo |
▼インストールされたPHPパッケージを確認
リストの結果をパイプ「|」でgrep コマンドに送り「php」という文字列のみ表示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ 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のバージョン確認
1 2 3 4 5 |
$ 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パッケージの確認
1 2 |
$ dnf list installed | grep php-fpm php-fpm.x86_64 |
php-fpmのコンフィグを設定
1 |
# vi /etc/php-fpm.d/www.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
▼Apacheに合わせてユーザーとグループを変更 例ではApacheの動作ユーザー、グループがwwwの例です。 user = www group = www ▼php-fpmの接続権限の設定 php-fpmが利用するソケットのオーナー、グループ、モードの設定します。 この設定を行わないとソケット権限不足で接続時にエラーになります。 listen.owner = www listen.group = www listen.mode = 0666 ▼root起動のソケットファイルにwwwのアクセス権限をACLで追加。 listen.acl_users = apache,nginx,www listen.acl_groups = www 【パフォーマンスチューニング】 ▼処理を行う子プロセスの最大数 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のコンフィグ変更
1 |
# vi /etc/php.ini |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
【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を起動
1 |
# systemctl start php-fpm |
php-fpmの起動時にエラーが出る場合はApache実行ユーザーと上記php-fpmのユーザーの不一致。
useraddでのユーザー作成含め、その辺りを見直しましょう。
▼php-fpmの起動後確認
1 2 3 4 |
$ 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 |
▼php-fpmの自動起動設定
1 2 3 |
# 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の自動起動確認
1 2 3 |
# systemctl is-enabled php-fpm enabled |
phpの動作確認
▼phpファイルの作成
WEBから設置PHPにアクセスすると、phpの詳細情報を表示させるコードを記述します。
Apacheのドキュメントルートに設置したPHPファイルを設置してください。
1 |
# vi phpinfo.php |
1 2 3 |
<?php phpinfo(); ?> |
▼ブラウザでアクセス
設置したPHPファイルにブラウザからアクセスして下記画像のようなPHPのインフォメーションが表示されれば動作しています。
http://192.168.0.50/phpinfo.php
エラーログについて
▼PHPのエラーログの出し方
1 |
#vi /etc/php.ini |
1 2 3 4 5 6 |
<span class="hutoaka">▼エラーログをONに設定</span> log_errors = On <span class="hutoaka">▼ログの出力先を設定</span> error_log = "/var/log/httpd/php_error.log" |
▼PHP7でMySQLエラー発生時
Call to undefined function mysql_connect()
1 |
# vi /etc/php.ini |
1 2 |
▼コメントアウト「;」を外す ;extension=mysqli |