PHPバージョンアップの決意
このところ、3Dプリンターの話が続いていた。3Dプリンターについては一通り出力できる環境が整い、出力したいものを3DCADで作るステージへと突入しているのだが、いまだ3Dデータ制作の道は険しく、作りたいものがなかなか作れずにいる。環境を整えるまではモチベーションが高いのだが、整ってしまうと落ち着いて縁側に出てお茶菓子を食べながらお茶をすすってしまう。Webサーバーにしても、Webサイトを作るために構築し始めたはずなのに、Webサイト作製よりもWebサーバー構築やトラブルシュートの方が楽しく感じてしまっている自分に気づく。それはまるで文化祭当日より文化祭の準備を楽しんでしまう高校生のようだ。ともあれいくら自宅などの自分の為の環境がいくら快適になったからと言って、だれも誉めてはくれないのである。大切なの物はその先にある。
とはいいつつも、今回もまたサーバー保守のお話。大分前の事だが、PHPに任意のコードが実行される脆弱性があるとのお知らせを受けてVirtualBoxを使って検証環境Webサーバを建てる試みで作ったCentOSでWebサーバーはNginxという環境の上にあるPHPのバージョンアップを行った。その際にパーミッションの関係で色々手直しせねばならないポイントが発生した。PHPのバージョンアップをするたびに繰り返しているような気がするので、備忘録として行った作業を記しておこうと思う。
PHPとその他のアップデート
まずは、yumコマンドを使ってPHPとその他もろもろをアップデートしてみる。phpのインストールはremiのレポジトリーを使って行ったので、remiを指定してアップデートする。
$ su -
# yum update
# yum --enablerepo=remi update php
パーミッションパニック キャッシュディレクトリ編
アップデートが完了すると、なぜか公開しているウェブサイトでエラーが出た。まず一つ目はこちら。
502はWebサーバーまではアクセスできているが、その後ろにある人たちが正しく応答していない場合などに通知される。今回はnginxでサーバーに非力さを補うために、リバースプロキシにキャッシュさせることでサーバー負荷を下げ応答速度を上げる構成にしてある。このリバースプロキシが、後ろにある人たちに相当する。なぜアップデートするとリバースプロキシがうまく動かなくなるのかというと、 リバースプロキシでキャッシュされたデータを格納しておく/var/tmp/nginxディレクトリの所有者がなぜかrootに代わってしまうためだ。なので、所有者をnginxに戻してあげる。
# ls -ld /var/tmp/nginx
drwx------ 2 root root 4096 3月 1 12:12 2015 /var/tmp/nginx
#
# chown nginx.root /var/tmp/nginx
drwx------ 2 nginx root 4096 3月 1 12:13 2015 /var/tmp/nginx
#
パーミッションパニック ソケット編
それでもまだPHPが言う事を聞いてくれない。nginxのログを見ると、/var/run/php-fpm/php-fpm.sockのパーミッションがよろしくないと言っている。これもまた所有者と所有グループがrootになってしまっているので両方ともnginxに直しておく。
# ls -l /var/run/php-fpm/php-fpm.sock
srw-rw----. 1 root root 0 3月 1 12:11 2015 /var/run/php-fpm/php-fpm.sock
#
# chown nginx.nginx /var/run/php-fpm/php-fpm.sock
#
srw-rw----. 1 nginx nginx 0 3月 1 12:12 2015 /var/run/php-fpm/php-fpm.sock
#
パーミッションパニック セッション編
一見上記でうまく動くようになったように見えるが、それでもまだ動かない所がある。認証を必要とする会員サイトなどを運営している場合、ログインできなくなっている場合がある。そんな時はおそらく、phpのセッション情報が保存できなくなっている場合が多い。今回も、/var/lib/php/sessionのパーミッションがなぜかapacheになってしまっていた。今回の環境はapacheではなくnginxなので、nginxに直しておく。
# ls -ld /var/lib/php/session
drwxrwx---. 2 root apache 4096 3月 1 14:57 2015 /var/lib/php/session
#
# chown nginx.nginx /var/lib/php/session
#
# ls -ld /var/lib/php/session
drwxrwx---. 2 nginx nginx 4096 3月 1 14:57 2015 /var/lib/php/session
#
パーミッションパニック 番外編
nginxの起動に失敗するという状況にもよく出会う。そのうちではまりがちなのが、パーミッションをちゃんと切ってるはずなのに、パーミッションが無いと言われて起動に失敗するパターンである。例えばこんな感じに。
# service nginx start
nginx を起動中: nginx: [emerg] stat() "/var/tmp/nginx" failed (13: Permission denied)
[失敗]
#
# ls -ld /var/tmp/nginx
drwx------ 2 nginx root 4096 3月 1 12:13 2015 /var/tmp/nginx
#
パーミッションがちゃんとしてるのにまだパーミッションを呉れと要求してくる場合、それはおそらくSElinuxさんの仕業だ。ためしに、SElinuxが有効化されているか確認して、有効ならば試しに無効化してみて現象が解消されるか試してみるがよろしかろう。
# getenforce
Enforcing
#
# setenforce 0
#
# getenforce
Permissive
#
# service nginx start
nginx を起動中: [ OK ]
#
これで現象が解消されたら、SElinuxの設定を見直してどの設定が邪魔しているのか確認して、しかるべき許可を与えてあげればよろしい。さらに、nginxを起動しようとして以下のようなエラーが連発されてしまう事が、たまにある。
# nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (98: Address already in use)
nginx: [emerg] still could not bind()
#
そんな時は、ポート80や、8080を使っているものがすでにいるので、そいつを停止してからnginxを起動すればいい。
PHPのアップデートで起こりがちなあるあるエラーはこんな感じだろうか。またたまったら追記するかもしれないが、今回はこの辺で。