Apacheのmod_rewriteとBフラグ

PHP のプログラムを Docker コンテナで動かそうとして、Apache の mod_rewrite の設定でちょっと苦労したのでメモ。

主題は PHP じゃないので、プログラムは簡単な例にしておく。クエリーパラメータ name を受け取って、挨拶を返すだけのプログラムだ。

<?php
$name = $_GET["name"];
echo "Hello, " . $name . "!" . PHP_EOL;
?>

Docker イメージは php:8.2-apache を使う。

takatoh@apostrophe:myphpapp$ docker run -d --rm -p 80:80 -v .:/var/www/html php:8.2-apache

これで localhost:80 で待ち受けているはず。curl コマンドで試してみる。

takatoh@apostrophe:myphpapp$ curl http://localhost/hello.php?name=Andy
Hello, Andy!

期待通りだ。

つぎに、PHP プログラムに渡すパラメータ name を、クエリーパラメータではなく、パスの一部にしたい。つまり、http://localhost/hello/Andy という URL でアクセスしたい。

そこで、つぎのような .htaccess ファイルを書いた。

RewriteEngine on
RewriteRule ^hello/(.*)\$ hello.php?name=\$1

それから、Apache で上の .htaccess が有効になるように Dockerfile を書いた。デフォルトでは mod_rewrite 自体が有効になってないんだそうだ。

FROM php:8.2-apache
RUN a2enmod rewrite
RUN sed -ri -e 's!AllowOverride None!AllowOverride FileInfo!g' /etc/apache2/apache2.conf

mod_rewrite を有効にして、なおかつ、.htaccess ファイルでルールを設定するのを許可している。これを元に Docker イメージをビルド。

takatoh@apostrophe:myphpapp$ docker build -t myphpapp:1 .

コンテナを起動する。

takatoh@apostrophe:myphpapp$ docker run -d --rm -p 80:80 -v .:/var/www/html myphpapp:1

さっきと同じように curl で試してみよう。

takatoh@apostrophe:myphpapp$ curl http://localhost/hello/Andy
Hello, Andy!

うまくいった!もちろんクエリーパラーメータで渡すのでも期待通りに動く。

takatoh@apostrophe:myphpapp$ curl http://localhost/hello.php?name=Andy
Hello, Andy!

ところが、パス形式のパラーメータ部分(Andy の部分)に空白文字を使うとうまく動いてくれない(curl で URLエンコードする方法がわからなかったので、空白文字の代わりにエンコードした %20 を使っている)。

takatoh@apostrophe:myphpapp$ curl http://localhost/hello/Andy%20Weir
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.57 (Debian) Server at localhost Port 80</address>
</body></html>

クエリーパラメータ形式では大丈夫。

takatoh@apostrophe:myphpapp$ curl http://localhost/hello.php?name=Andy%20Weir
Hello, Andy Weir!

ブラウザでも試したけど同じ結果。さて、困った。

結論を先に書くと、RewiterRule の最後に B フラグをつければ解決する。Apache の公式ドキュメントにはちゃんと書いてある。が、参考にした日本語の解説ページの中には書いてあるページはなかった。探し方が悪いのかもしれないけど。

ともかく、.htaccess ファイルをつぎのように書き換えた。

RewriteEngine on
RewriteRule ^hello/(.*)\$ hello.php?name=\$1 [B]

再度試してみる。

takatoh@apostrophe:myphpapp$ curl http://localhost/hello/Andy%20Weir
Hello, Andy Weir!

OK!!!

一件落着。

後々のために、Apache のドキュメントから解説を引用しておこう(DeepL 翻訳)。

[B] フラグは、変換を適用する前に英数字以外の文字をエスケープするよう RewriteRule に指示します。

mod_rewrite は URL をマッピングする前にエスケープを解除しなければならないので、 後方参照は適用される時点でエスケープされません。B フラグを使うと、後方参照中の英数字以外の文字がエスケープされます

‘x & y/z’という検索語が与えられた場合、ブラウザはそれを’x%20%26%20y%2Fz’としてエンコードし、リクエストを’search/x%20%26%20y%2Fz’とします。Bフラグがない場合、このリライトルールは’search.php?term=x & y/z’にマップされますが、これは有効なURLではないため、search.php?term=x%20&y%2Fz=としてエンコードされ、意図されたものではありません。

この同じルールにBフラグを設定すると、パラメータは出力URLに渡される前に再エンコードされ、結果として/search.php?term=x%20%26%20%y%2Fzに正しくマッピングされます

Docker上のMediaWikiにファイルをアップロードする

公式の Docker イメージを使って立てた MediaWiki だけど、ファイルをアップロードするにはやっぱりひと手間必要だった。なので、そのメモ。

MediaWiki にはファイルをアップロードする機能があるけど、デフォルトでは無効になっている。有効にするには MediaWiki と PHP 自体の設定ファイルを修正する必要がある。

  • LocalSettings.php – MediaWiki の設定ファイル
  • php.ini – PHP 自体の設定ファイル

どこをどう修正すればいいかはマニュアルに書いてある。

LocalSettings.php

LocalSettings.php ファイルは、MediaWiki をセットアップしたときにホストにダウンロードして、Docker コンテナには volume としてマウントしてあるので、ホスト側のファイルを編集すればいい。

$wgEnableUploads = true;

$wgEnableUploads に true を設定。

php.ini

で、問題はこっち。php.ini ファイルは MediaWiki の公式 Docker イメージに含まれてるものをそのまま使ったので、ホスト側にはない。なので、まずはコンテナの中で編集して、動作が変わるかどうか確認することにした。

takatoh@wplj $ docker exec -it wiki bash
root@bd8268684983:/var/www/html# php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php

php.ini ファイルの場所は php -i コマンドで確認できる(と MediaWiki のマニュアルに書いてある)。このコマンドの出力は結構な量を吐くので grep で php.ini にヒットする行だけ抜き出した。ともあれ、/usr/local/etc/php にあることがわかった。

ところが、そこに php.ini ファイルはなかった。

root@bd8268684983:/var/www/html# cd /usr/local/etc/php
root@bd8268684983:/usr/local/etc/php# ls
conf.d  php.ini-development  php.ini-production

そういうものなのかと疑問に思いながらも、ひとまずは php.ini-production ファイルの中身を見てみようとしても less コマンドがない。

root@bd8268684983:/usr/local/etc/php# less php.ini-production
bash: less: command not found

当然のように vim もない。cat はあったので中身は見れたけど編集はできない。

といわけで、方針を変更してファイルをホスト側にコピーして編集し、LocalSettings.php ファイルと同様にコンテナにマウントすることにした。ファイルをホスト側にコピーするのは次の通り:

takatoh@wplj $ docker exec -it wiki cat /usr/local/etc/php/php.ini-production > php.ini

cat コマンドをコンテナ側で実行して、ホスト側の php.ini ファイルへリダイレクトしている。

で、その php.ini ファイルを編集。3行続けて載せたけど、ファイル中では別々のところにある。

file_uploads = On
post_max_size = 16M
upload_max_filesize = 8M

file_uploads は元から On になってた。post_max_size と upload_max_filesize はそれぞれ 8M2M だったのを大きくした。

docker-compose.yml

編集した php.ini ファイルを LocalSettings.php ファイルと同じディレクトリに配置したら、コンテナにマウントすべく docker-compose.yml を修正。

  wiki:
    image: mediawiki:1.35.0
    container_name: wiki
    restart: always
    depends_on:
      - mysql
    volumes:
      - /home/takatoh/var/wiki/images:/var/www/html/images
      - /home/takatoh/var/wiki/LocalSettings.php:/var/www/html/LocalSettings.php
      - /home/takatoh/var/wiki/php.ini:/usr/local/etc/php/php.ini
    ports:
      - 9090:80

これでOK。

最後にコンテナを起動しなおしたら、無事、ファイルをアップロードできるようになった。

さくらのVPSプラン乗り換え計画(13)

PHP をインストールする。

[takatoh@tk2-254-36564 ~]$ sudo yum install php-cli php-mysql php-common php php-cgi php-fpm php-dg php-mbstring

「パッケージ php-dg は利用できません。」て出たけど、php-dg って確か画像処理のライブラリだよな。たぶん画像使わないからいいか。
インストールの確認。

[takatoh@tk2-254-36564 ~]$ php -v
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

設定ファイルを編集。

[takatoh@tk2-254-36564 ~]$ sudo cp /etc/php.ini /etc/php.ini.orig
[takatoh@tk2-254-36564 ~]$ sudo vi /etc/php.ini

エラーログの場所を変更。

error_log = /var/log/php_errors.log

日本語の設定。

mbstring.language = Japanese
(中略)
mbstring.internal_encoding = UTF-8

http_input。

mbstring.http_input = auto

detect_order。

mbstring.detect_order = auto

expose_php を Off に。

expose_php = Off

最後にタイムゾーン。

date.timezone = Asia/Tokyo

php-fpm の設定。
設定ファイルは /etc/php-fpm.d/www.conf。
使用するポート。デフォルトのまま。

listen = 127.0.0.1:9000

許可するクライアントの IP アドレス。これも localhost だけなのでデフォルト。

listen.allowed_clients = 127.0.0.1

php-fpm サービスの実行ユーザとグループ。nginx としたので、あとで作る。

; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

php-fpm のプロセス数を定量にする。

pm = static

最大子プロセス数の設定。

pm.max_children = 5

php-fpm が受け付ける最大要求数。これを超えると子プロセスが再起動する。

pm.max_requests = 500

これで編集は終了。
実行ユーザを nginx としたので作る。

[takatoh@tk2-254-36564 ~]$ sudo useradd nginx
[sudo] password for takatoh: 
useradd: ユーザ 'nginx' は既に存在します

あれ、あった。
じゃあ、php-fpm を起動。ついでに自動起動するように設定。

[takatoh@tk2-254-36564 ~]$ sudo /etc/init.d/php-fpm start
php-fpm を起動中:                                          [  OK  ]
[takatoh@tk2-254-36564 ~]$ sudo chkconfig php-fpm on
[takatoh@tk2-254-36564 ~]$ sudo chkconfig --list php-fpm
php-fpm        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

よし、最後にテストしてみよう。Nginx のデフォルトのデータ置き場が /usr/share/nginx/html になってるので、そこに phpinfo.php ファイルを置く。

これでブラウザでアクセスしてみると……あれ?ダメだ。
そうか。Nginx に PHP 用の設定をしてないからか。デフォルトの設定ファイルに追記。

location ~\.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

これでどうだ!
OK。ちゃんと表示された。

[追記]

インストールできなかった php-dg、dg じゃなくて gd だった。php-gd。
ま、どっちにしろいいか。

[更に追記]

とりあえず、php-gd もインストールしておいた。

PHPをインストールしてNginxで動くようにする

このページが参考になった。

 cf. nginx + php-fpmでphpを動かす – Qiita

インストール

takatoh@wplj $ sudo apt install php-fpm

php-fpmサービスの確認

takatoh@wplj $ systemctl status php7.0-fpm
● php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor prese
   Active: active (running) since 土 2017-02-25 17:00:15 JST; 47s ago
 Main PID: 16510 (php-fpm7.0)
   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/se
   CGroup: /system.slice/php7.0-fpm.service
           ├─16510 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)      
           ├─16514 php-fpm: pool www                                            
           └─16515 php-fpm: pool www                                            

 2月 25 17:00:15 wplj systemd[1]: Starting The PHP 7.0 FastCGI Process Manager...
 2月 25 17:00:15 wplj systemd[1]: Started The PHP 7.0 FastCGI Process Manager.

active (running) とか出てるからこれでいいのかな。

socket

/etc/php/7.0/fpm/pool.d/www.conf にソケットの記述あり。

    listen = /run/php/php7.0-fpm.sock
takatoh@wplj $ ls -l /run/php/php7.0-fpm.sock
srw-rw---- 1 www-data www-data 0  2月 25 17:00 /run/php/php7.0-fpm.sock

Nginxから使えるようにする

/etc/nginx/sites-available/default を編集。

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html index.php;

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    #
    # # With php7.0-cgi alone:
    # fastcgi_pass 127.0.0.1:9000;
    # With php7.0-fpm:
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

で、Nginx の設定ファイルを読みなおし。

takatoh@wplj $ sudo service nginx reload

動作確認

/var/www/html に phpinfo.php ファイルを作る。

<?php
 phpinfo();
?>

ブラウザで確認。

OK。

PHPで$foo = ” || ‘foo’;とやると

$foo は 1 になる。
1 になるというか、真になってそれを出力すると 1 になる、といったほうがいいか。論理演算 || の結果は真偽値(この場合は真)で、echo で出力すると 1 になるということらしい。

もともとの話をすると、フォームからポストされたデータが空文字列だった場合にデフォルト値を設定しようとしたこと。こんな感じ:

$name = $_POST['name'] || 'no name';

上に書いたとおり、これだと $name を出力すると 1 になってしまう。

で、こう書けばいいようだ。

$name = $_POST['name'];
$name |= 'no name';

1行増えるのがめんどくさいな。

PHPで掲示板作った

つい先日 C++ の本を読み始めたばかりだけど、この3連休はにわかPHPerになっていた。
コトのはじめは、自宅サーバに掲示板を設置しようとしたこと。ググってみると無料で配布されている掲示板アプリはいろいろとあるんだけど、どうにも気に入ったものがない。メールやホームページのアドレスなんかいらないんだよ。文字の色を変える機能なんかもいらない。一方でメッセージにコメント(reply)を付けたい……といった希望に沿うものがなかなかなくて、おまけに 2つほど試したみたらきちんと動かない(設定のせいかもしれいけど)。
結局、それじゃちょっと自分で作ってみようか、ということになった。配布されている掲示板アプリは大抵が PHP だった(あとちょっとだけ Perl)ので、見様見真似で PHP で書いてみることにしたわけだ。
で、作ってみたのがこれ:

 cf. miniBBS – GitHub/takatoh

PHP についてほとんど何も知らないところから3日で作ったので、ホント基本的な機能しかない。メッセージがポストできて、そのメッセージにコメントが付けられるだけ。削除機能はなし。管理者用ログイン機能もなし。まあ、このへんは気が向いたらあとから実装するかも。

PHP についての印象だけど、良くも悪くも Web 用の言語だなあといったところ。もうちょっと具体的には:

  • 言語自体がテンプレートエンジンになってる感じ
  • 変数名にいちいち $ マークめんどくさい
  • 文末のセミコロンもめんどくさい
  • クラスのメンバ変数にアクセスするのにいちいち $this-> 付けなきゃいけないのめんどくさい
  • 文字列分割する関数の名前が explode ってなんだよ
  • でも $_GET や $_POST は簡単で便利

上にも書いたとおり、ほとんど何も知らない状態から始めたわりには、特に引っかかるような概念もなく、掲示板くらいは作れるようになった。取っ付き易い言語ではあるのかもね。

NginxのユーザディレクトリでPHPを動かす

Nginx の設定ファイルの server セクションで次のように設定する。

# User dir (PHP)
location ~ ^/~([^/]+?)/(.+\.php)$ {
    alias /home/$1/public_html/$2;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    include fastcgi_params;
}

# User dir (static)
location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
    index index.html index.htm;
    autoindex on;
}

# For PHP
location ~ \.php$ {
    root /var/www/html;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

キモは User dir (PHP) のセクションを For PHP のセクションよりも前に書くこと。そうしないとブラウザで PHP のファイルにアクセスしても Not found になってしまう。なぜなら location ~ \.php$ に先にマッチしてしまってファイルが見つからないから(たぶん)。

さくらVPSにPHPをインストールする

PHPをインストール

これも yum コマンドでインストールできる。

[takatoh@www2465uo ~]$ sudo -s
[sudo] password for takatoh: 
[root@www2465uo takatoh]# yum install php-cli php-mysql php-common php php-cgi php-fpm php-gd php-mbstring
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package php.x86_64 0:5.3.3-27.el6_5.1 will be installed
--> Processing Dependency: httpd-mmn = 20051115 for package: php-5.3.3-27.el6_5.1.x86_64
--> Processing Dependency: httpd for package: php-5.3.3-27.el6_5.1.x86_64
---> Package php-cli.x86_64 0:5.3.3-27.el6_5.1 will be installed
---> Package php-common.x86_64 0:5.3.3-27.el6_5.1 will be installed
---> Package php-fpm.x86_64 0:5.3.3-27.el6_5.1 will be installed
---> Package php-gd.x86_64 0:5.3.3-27.el6_5.1 will be installed
---> Package php-mbstring.x86_64 0:5.3.3-27.el6_5.1 will be installed
---> Package php-mysql.x86_64 0:5.3.3-27.el6_5.1 will be installed
--> Processing Dependency: php-pdo(x86-64) for package: php-mysql-5.3.3-27.el6_5.1.x86_64
--> Running transaction check
---> Package httpd.x86_64 0:2.2.15-31.el6.centos will be installed
--> Processing Dependency: httpd-tools = 2.2.15-31.el6.centos for package: httpd-2.2.15-31.el6.centos.x86_64
--> Processing Dependency: apr-util-ldap for package: httpd-2.2.15-31.el6.centos.x86_64
---> Package php-pdo.x86_64 0:5.3.3-27.el6_5.1 will be installed
--> Running transaction check
---> Package apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 will be installed
---> Package httpd-tools.x86_64 0:2.2.15-31.el6.centos will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package            Arch        Version                      Repository    Size
================================================================================
Installing:
 php                x86_64      5.3.3-27.el6_5.1             updates      1.1 M
 php-cli            x86_64      5.3.3-27.el6_5.1             updates      2.2 M
 php-common         x86_64      5.3.3-27.el6_5.1             updates      526 k
 php-fpm            x86_64      5.3.3-27.el6_5.1             updates      1.1 M
 php-gd             x86_64      5.3.3-27.el6_5.1             updates      107 k
 php-mbstring       x86_64      5.3.3-27.el6_5.1             updates      456 k
 php-mysql          x86_64      5.3.3-27.el6_5.1             updates       82 k
Installing for dependencies:
 apr-util-ldap      x86_64      1.3.9-3.el6_0.1              base          15 k
 httpd              x86_64      2.2.15-31.el6.centos         updates      824 k
 httpd-tools        x86_64      2.2.15-31.el6.centos         updates       73 k
 php-pdo            x86_64      5.3.3-27.el6_5.1             updates       76 k

Transaction Summary
================================================================================
Install      11 Package(s)

Total download size: 6.6 M
Installed size: 22 M
Is this ok [y/N]: y
Downloading Packages:
(1/11): apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm         |  15 kB     00:00     
(2/11): httpd-2.2.15-31.el6.centos.x86_64.rpm            | 824 kB     00:03     
(3/11): httpd-tools-2.2.15-31.el6.centos.x86_64.rpm      |  73 kB     00:00     
(4/11): php-5.3.3-27.el6_5.1.x86_64.rpm                  | 1.1 MB     00:05     
(5/11): php-cli-5.3.3-27.el6_5.1.x86_64.rpm              | 2.2 MB     00:09     
(6/11): php-common-5.3.3-27.el6_5.1.x86_64.rpm           | 526 kB     00:02     
(7/11): php-fpm-5.3.3-27.el6_5.1.x86_64.rpm              | 1.1 MB     00:05     
(8/11): php-gd-5.3.3-27.el6_5.1.x86_64.rpm               | 107 kB     00:00     
(9/11): php-mbstring-5.3.3-27.el6_5.1.x86_64.rpm         | 456 kB     00:01     
(10/11): php-mysql-5.3.3-27.el6_5.1.x86_64.rpm           |  82 kB     00:00     
(11/11): php-pdo-5.3.3-27.el6_5.1.x86_64.rpm             |  76 kB     00:00     
--------------------------------------------------------------------------------
Total                                           193 kB/s | 6.6 MB     00:34     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : php-common-5.3.3-27.el6_5.1.x86_64                          1/11 
  Installing : php-cli-5.3.3-27.el6_5.1.x86_64                             2/11 
  Installing : php-pdo-5.3.3-27.el6_5.1.x86_64                             3/11 
  Installing : httpd-tools-2.2.15-31.el6.centos.x86_64                     4/11 
  Installing : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                        5/11 
  Installing : httpd-2.2.15-31.el6.centos.x86_64                           6/11 
  Installing : php-5.3.3-27.el6_5.1.x86_64                                 7/11 
  Installing : php-mysql-5.3.3-27.el6_5.1.x86_64                           8/11 
  Installing : php-mbstring-5.3.3-27.el6_5.1.x86_64                        9/11 
  Installing : php-gd-5.3.3-27.el6_5.1.x86_64                             10/11 
  Installing : php-fpm-5.3.3-27.el6_5.1.x86_64                            11/11 
  Verifying  : php-mbstring-5.3.3-27.el6_5.1.x86_64                        1/11 
  Verifying  : php-cli-5.3.3-27.el6_5.1.x86_64                             2/11 
  Verifying  : httpd-2.2.15-31.el6.centos.x86_64                           3/11 
  Verifying  : php-gd-5.3.3-27.el6_5.1.x86_64                              4/11 
  Verifying  : php-5.3.3-27.el6_5.1.x86_64                                 5/11 
  Verifying  : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                        6/11 
  Verifying  : php-pdo-5.3.3-27.el6_5.1.x86_64                             7/11 
  Verifying  : httpd-tools-2.2.15-31.el6.centos.x86_64                     8/11 
  Verifying  : php-mysql-5.3.3-27.el6_5.1.x86_64                           9/11 
  Verifying  : php-fpm-5.3.3-27.el6_5.1.x86_64                            10/11 
  Verifying  : php-common-5.3.3-27.el6_5.1.x86_64                         11/11 

Installed:
  php.x86_64 0:5.3.3-27.el6_5.1         php-cli.x86_64 0:5.3.3-27.el6_5.1      
  php-common.x86_64 0:5.3.3-27.el6_5.1  php-fpm.x86_64 0:5.3.3-27.el6_5.1      
  php-gd.x86_64 0:5.3.3-27.el6_5.1      php-mbstring.x86_64 0:5.3.3-27.el6_5.1 
  php-mysql.x86_64 0:5.3.3-27.el6_5.1  

Dependency Installed:
  apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1    httpd.x86_64 0:2.2.15-31.el6.centos
  httpd-tools.x86_64 0:2.2.15-31.el6.centos php-pdo.x86_64 0:5.3.3-27.el6_5.1  

Complete!

ちゃんとインストールできたかテスト。

[root@www2465uo takatoh]# php -v
PHP 5.3.3 (cli) (built: Aug  6 2014 05:54:27) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

5.3.3 がインストールされているのがわかる。

PHPの設定

/etc/php.ini ファイルを編集する。

[root@www2465uo takatoh]# cp /etc/php.ini /etc/php.ini.orig
[root@www2465uo takatoh]# vim /etc/php.ini

編集するのは次の箇所。まずはエラーログの場所を変更。

error_log = /var/log/php_errors.log

日本語の設定。

mbstring.language = Japanese

(中略)

mbstring.internal_encoding = UTF-8

http_input。

mbstring.http_input = auto

detect_order。

mbstring.detect_order = auto

expose_php を Off に。

expose_php = Off

最後にタイムゾーン。

date.timezone = Asia/Tokyo

これで PHP の設定は終了。Nginx を再起動する。

[root@www2465uo takatoh]# service nginx restart
nginx を停止中:                                            [  OK  ]
nginx を起動中:                                            [  OK  ]

php-fpmの設定

php-fpm てのは、PHP を Fast-CGI で動かすものらしい。設定ファイルは /etc/php-fpm.d/www.conf。

使用するポート。これはデフォルトのまま。

listen = 127.0.0.1:9000

許可するクライアントの IP アドレス。これも localhost だけなのでデフォルト。

listen.allowed_clients = 127.0.0.1

php-fpm サービスの実行ユーザとグループ。ここでは nginx としたので、あとで作る。

; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

php-fpm のプロセス数を定量にする。

;pm = dynamic
pm = static

最大子プロセス数の設定。

;pm.max_children = 50
pm.max_children = 3

php-fpm が受け付ける最大要求数の設定。これを超えると子プロセスが再起動する。

pm.max_requests = 500

これで、編集は終了。

さて、実行ユーザを nginx としたので、それを作る。

[root@www2465uo takatoh]# useradd nginx
useradd: ユーザ 'nginx' は既に存在します

あれ、そうなの。Nginx をインストールした時に作られたのかな。
じゃあこのまま php-fpm を起動。ついでに自動起動するようにしておく。

[root@www2465uo takatoh]# /etc/init.d/php-fpm start
php-fpm を起動中:                                          [  OK  ]
[root@www2465uo takatoh]# chkconfig php-fpm on

Nginxの設定

今度は Nginx の設定だ。編集するファイルは /etc/nginx/nginx.conf。といっても変えたのは1行だけ。あとはデフォルトのまま。

user nginx nginx;

つぎは、Fast-CGI のための設定。ファイルは /etc/nginx/fastcgi_params だけど、このデフォルトのファイルをそのまま使うので編集はなし。

さて、あとはバーチャルホストの設定なんだけど、まだドメインを取っていないので、ここでいったん終了。

参考サイト

 cf. さくらのVPS入門 – ドットインストール
 cf. CentOS,ScientificLinuxでLAMP(Nginx+MySQL+PHP)インストールからWordPressを動かすまで(Nginx編)