2016年3月16日水曜日

【備忘録】nginx にて phpMyAdminを動作させるには

ちょっとハマったのでメモしておきます。

2016年3月16日  Nginx 1.9.12 + PHP7.0.4 (PHP-FPM) (RedHat EL 6)をソースからコンパイルした環境でのお話です。なお、DBとしては MariaDB 10.1.12を yum からインストールしました。

構築しながらのメモのため、もっとうまい方法があるかしれません。
またサーバー管理者向けのメモという感じです。


がphpMyAdminにログインしたときの、サーバー情報です。
データベースのクライアントのバージョン:libmysql - mysqlnd 5.0.12-dev - 20150407 は、 MariaDBのものが誤認識されてるのかなぁと思います。
yum remove mysql* で削除(rpm -qa |grep -i mysql でパッケージないことを確認)したのですけどねぇ

PHPをyumで入れてるなら


素直に、epelリポジトリでも追加して、 yum install phpMyAdmin して入れるほうがらくです。

何故 yumを使わぬ?

php-mysql とか諸々のライブラリやモジュールがいっしょに入る(/etc/php.d/以下に大体インストールされる)のですが、PHPをソースからコンパイルしている場合、それってどの程度まで影響があるかチェックするの面倒!!だからです。

前提条件


ドキュメントルート以外に、設置することを目的とします。
この手のシステム系は、ドキュメントルートに置いてうっかり公開設定になっちゃってたらセキュリティ的に面倒くさ、、、じゃなくて住み分けをしたいためです。
  • nginxのドキュメントルート
    • /var/www/html
  • phpmyadminの置き場所
    • /usr/local/phpmyadmin
  • phpmyadminのアクセス先
    • https://◯◯/phpmyadmin/
  • BASIC認証のファイル(nginxには htpasswdないので、 yum install httpd-tools でいれておけばOK)
    • /etc/nginx/.htpasswd
と仮定します。

以下ではこの例では、IPアドレス制限+BASIC認証+SSL暗号としています。
nginxにおけるSSL設定については割愛します。


phpMyAdmin側のダウンロードと設定

https://www.phpmyadmin.net/ より phpMyAdminをダウンロードして解凍(展開)し、サーバーの /usr/local/phpmyadmin に置いたとします。

cd /usr/local/phpmyadmin
cp config.sample.inc.php  config.inc.php 

と、設定サンプルファイルをコピーして、 config.inc.phpファイルを作成します。

$cfg['blowfish_secret'] = 'ユニーク文字';
$cfg['PmaAbsoluteUri'] = 'https://◯◯/phpmyadmin/';

を編集・追加します。
この$cfg['PmaAbsoluteUri'] は、nginxのaliasで phpmyadminへのアクセスをしたときに必須かなと思います。もしなければ、phpmyadminへログインしたときのログイン先が / 以下になってしまい Not found や /以下のコンテンツが出てしまいます。それでも、再度 /phpmyadmin にアクセスしたらログインしたことになっていてアクセス自体はできるのですが鬱陶しいですよね。


nginx側の設定

関連性のある部分のみ書き出します。

        location / {
            root   html;
            index  index.html index.htm;

           # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
           location ~ \.php$ {
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
                    include       /etc/nginx/fastcgi_params;
           }  
        } 

        location /phpmyadmin {
            alias /usr/local/phpmyadmin;
            index  index.php;
            allow 127.0.0.1;
            allow 接続を許可するIPアドレス;
            deny all;

            auth_basic  "phpmyadmin"
            auth_basic_user_file  /var/nginx/.htpasswd   

            location ~ ^/phpmyadmin/.+\.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_split_path_info ^/phpmyadmin(.+\.php)(.*)$;
                fastcgi_param  SCRIPT_FILENAME  /usr/local/phpmyadmin$fastcgi_script_name;
                include       /etc/nginx/fastcgi_params;
           }
        }

とまぁざっとこんな感じになります。

ポイント1「ドキュメントルートへの php設定は内包せよ!」


よくある説明では、

        location / {
            root   html;
            index  index.html index.htm;
        } 
         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
         location ~ \.php$ {
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
                    include       /etc/nginx/fastcgi_params;
         }  

となっていることが多いのですが、パターンマッチングの優先順位の問題でうまくいきません。この「location ~ \.php$ { } 」については、 location / の中のみで有効に限定してあげるとよいということです。

ポイント2「どうせなら 各設定は分離するとよい」

location ごとの設定は、その中に内容してしまったほうがすっきりするということです。まぁそのほうが問題も少ないだろうと思いますね。


2016年3月16日 @kimipooh

0 件のコメント: