
準備
必要なシステム
BayServerのインストールは完了しているものとします。
最低限必要なものは以下です。
- PHP7
- MariaDB or MySQL
FCGI経由でPHPを動かす場合は、以下が必要です
- php-fpm
WordPressのインストール
以下のサイトからダウンロードします
ここではWordPressを$HOME/app/wordpressにインストールします。
$ cd $HOME/app
$ unzip wordpress-5.8.1-ja.zip
$ cd wordpress
MariaDBの起動
起動していなければ起動します
$ sudo service mariadb start
MariaDBユーザーの作成
ここでは、”wpress”というユーザーを作成します。パスワードは”wpress”です。
$ mysql -u root
> create user 'wpress'@'localhost' identified by 'wpress';
> grant all on *.* to 'wpress'@'localhost';
> \q
接続できるか確認しておきます
$ mysql -u wpress -p
Enter password:
>
php-fpmの設定と起動
CGIでphpを動かす場合はここの設定は必要ありません。
php-fpmはPHPを実行するための専用のサーバープログラムです。BayServerはFCGIと呼ばれるプロトコルを使用してphp-fpmにPHPの実行を依頼します。すなわち、BayServerはプロキシのような役割をします。
php-fpmの設定
php-fpmの設定ファイルの位置は、PHPのパッケージやバージョンによって違うので注意が必要です。
見つからない場合は「ディストリビューション名」と「php-fpm」という単語を使うなどして検索してみてください。
ちなみに、こちらの環境では /etc/opt/remi/php74/ にありました。なお、別の環境では/etc/の下にありました。これらのディレクトリ内に、php-fpm.conf や /etc/php-fpm.d ディレクトリなどがあると思います。
今回確認する設定は php-fpm.d/www.conf ファイルです。
いくつか設定を確認・変更しておきます。以下の記述があるかと思います。
ユーザー設定
php-fpmをrootユーザーで起動する場合は、PHPを実行するOSユーザーを設定する必要があります。(一般ユーザーで起動する場合はそのユーザーで実行されるため設定する必要はありません)
user = user1
group = user1
ポートの設定
ポート番号は特に変える必要もないと思いますが一応確認だけしておきます。
listen = 127.0.0.1:9000
ログの設定
ログファイルの場所を確認しておきます
php_admin_value[error_log] = /var/opt/remi/php74/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
パフォーマンスに関する設定
pm.max_children や pm.start_servers など様々なパラメータがありますが、今回はデフォルトのまま使用します。
パフォーマンスのチューニングが必要になった場合は、コメントを見ながら数値を変更してみてください。
ドキュメントルートの設定は?
そういえば、php-fpmはドキュメントルートの指定がないですね。実行するPHPファイルをどうやって見つけてるんでしょうか。
それは、CGI環境変数から取っています。おそらく、DOCUMENT_ROOTやSCRIPT_FILENAME、SCRIPT_NAMEあたりから取っていると思われます。
つまり、BayServer側の設定をしっかりしておくことで、これらの環境変数が正しくphp-fpmに渡され、正しくPHPが実行可能になります。
php-fpmの起動
起動方法もパッケージによって異なりますが、serviceコマンドで起動できる場合は以下のように起動します
$ sudo service php-fpm start
終了する場合はstartをstopに変えます。
serviceとして登録されていない場合は直接起動します
$ sudo /opt/remi/php74/root/sbin/php-fpm
BayServerの設定(CGIモード)
ここでは、パス /wordpress で WordPress を動かす設定例を載せます。
以下は、CGIモードでPHPを動かす場合の設定です。
[city *]
[town /wordpress]
location /home/user1/app/wordpress
welcome index.php
[reroute *]
docker wordpress
[club *.php]
decodePathInfo yes
charset UTF-8
docker phpCgi
[town /xmlrpc.php]
[permission]
refuse ip *
ちょと細かく見ていきましょう。
パスの設定
まず、/wordpressというTownを定義しています。これにより、/wordpressという仮想パス以下へのリクエストはWordPressが起動されることになります。
このTownのOS上の場所はlocationパラメータで指定しますが、ここにWordPressをインストールしたディレクトリを指定します。
welcomeパラメータは、ディレクトリが指定された際にアクセスされるファイルで、ここにはindex.phpを指定します。
rerouteの設定
見慣れない rerouteドッカーの設定がありますが、これはURLのRewrite(書き換え)を行うドッカーです。
この設定はWordPressのパーマネントリンク機能を正常に動作させるために必要になります。
パーマネントリンクとは、サイトの任意のページを固定URLのように見せる機能なのですが、実はこの機能はWordPressの機能ではなく、WebサーバーのURL Rewriteの機能を利用して実現しているんです。例えば以下のようなパーマネントリンクがあるとします
http://yourhost/wordpress/2020/02/02/hogehoge
これは以下のようなURLにRewriteされてWordPressに渡され、index.phpが起動されます
http://yourhost/wordpress/index.php/2020/02/02/hogehoge
これにより、WordPress側で目的のコンテンツにアクセスできるというわけです。
Apacheの場合、WordPressを展開したディレクトリにある.htaccessでこの設定をやっているので何もしなくてよいのですが、他のWebサーバーの場合はそれぞれのサーバーごとに設定が必要になります。(そして実はこれが地味に面倒くさい)
BayServerではこのURL Rewriteをしてくれるのがwordpressドッカーで、これを指定するだけでWordPressが使えるようになっています。
clubの設定
次のclubドッカーでは、phpファイルがアクセスされたときに起動されるドッカーを設定しています。PHP倶楽部ってとこでしょうか。
起動されるドッカーはphpドッカーで、これはPHPを実行するためのお膳立てをしてくれます。
decodePathInfo, charsetの設定
WordPressのパーマネントリンクURLには日本語が含まれることが多々あります。
記事のタイトルやカテゴリ名などをURLに含んでいるからです。
パーマネントリンクURLに日本語が含まれる場合、WordPressが正常にコンテンツを取り出せず、「404 Not Found」が発生してしまうことがあります。
これを嫌って、記事やカテゴリなどを作成した場合に、日本語を含まないパーマネントリンクを常に設定する人もいるようです。
BayServerではこの問題を回避するために decodePathInfo パラメータが用意されています。
このパラメータを yes に設定すると、PATH_INFO 環境変数にデコードされた生の日本語文字列が渡され、WordPress側で日本語を含むパーマネントリンクを使用することができます。
なお、PHPの使用するエンコーディングはデフォルトで UTF-8 です。このため、PATH_INFOはUTF-8ででこーcharset パラメータの設定もしておきます。(charsetパラメータは、harborドッカーで指定してもよい)
実は、decodePathInfoのデフォルト値は「yes」なので、これは指定しなくても構いません。ただし、charsetパラメータはclubドッカーまたはharborドッカーで指定してください。
スパムのブロック
次の「/wordpress/xmlrpc.php」というTownですが、これはスパム防止のために定義しています。
このファイルはリモートでWordPressをいじれるらしく、攻撃の対象になってしまいます。
いっそのことファイルを消してしまってもいいのかもしれませんが、バージョンアップなどで復活したりすると困るので、このファイルへのアクセスはすべて禁止するようにしておきます。
BayServerの設定(php-fpmを使用する場合)
php-fpmを使用し、FCGIモードでPHPを動かす場合は以下の用に設定します。
[city *]
[town /]
location $HOME/app/wordpress
welcome index.php
[reroute *]
docker wordpress
[club *.php]
decodePathInfo yes
charset UTF-8
docker fcgiWarp
destCity 127.0.0.1
destPort 9000
destTown wordpress
基本的にはCGIモードでの設定と同じですが、phpファイルへのアクセスで起動されるClubドッカーがプロキシであるFCGI Warpドッカーに変わります。
このドッカーはリクエストをFCGIサーバーに転送するためのもので、destCity, destPort, destTownパラメータに接続先の情報を指定します。
接続先のパスが「/wordpress」になっていますが、ここはBayServer側のTownと同じにしておいた方が無難です。つまり、php-fpmの方も、/wordpressのパスへリクエストが来た時にWordPressが起動されるように設定しておきます。