アクセス解析
2015-05-01 1:06 by 仁伯爵

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 Bad Gateway
  •  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のアップデートで起こりがちなあるあるエラーはこんな感じだろうか。またたまったら追記するかもしれないが、今回はこの辺で。

    WebサーバーのPHPバージョンアップ作業時に遭遇したエラーとその顛末

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


    *


    *

    投げ銭はこちらへ
    bitcoin :
    1FtNVmXFAkwKPPz7MTcbNXzRnKJaYdMyKf

    bitcoin :
    1AFU37YroGt8ohmFz8nG1N2ockL56Z4hfQ

    2017年8月
    « 7月    
     123456
    78910111213
    14151617181920
    21222324252627
    28293031  
    カテゴリー