Nginx+PHP7.1+MariaDBのphpMyAdminを構築

以前、「[さくらVPS(CentOS7)で、Nginx+PHP7.1(7.3)+MariaDBのWordPressを構築(HTTPS対応)](https://qiita.com/ktkiyoshi/items/bf920b4df02d98b570e3)」という記事を書きましたが、その続編（だいぶ時間空いてるけど）として、同じ環境下に**phpMyAdmin**を入れてみます。

前提としては、

- CentOS Linux release 7.2.1511 (Core)
- nginx version: nginx/1.12.1
- PHP 7.1.8 (cli) (built: Aug 2 2017 12:13:05) ( NTS )
- mysql Ver 15.1 Distrib 10.2.7-MariaDB, for Linux (x86_64) using readline 5.1

# 一応、Remiリポジトリを確認
```
$ rpm -qa | grep "remi-"
remi-release-7.7-1.el7.remi.noarch
```
[前回](https://qiita.com/ktkiyoshi/items/bf920b4df02d98b570e3#%E8%B5%B7%E5%8B%95%E3%81%A8%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E8%A8%AD%E5%AE%9A)入れているので、特に問題はないですが、前回は以下のように入れました。

```
// Remiリポジトリ
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
Updating / installing...
   1:remi-release-7.3-2.el7.remi      ################################# [100%]
```
# yumでphpMyAdmin
```
$ sudo yum --enablerepo=remi-php71 install phpMyAdmin
```
`--enablerepo=remi-php71`がないと、依存性の部分でエラーが発生してしまいます。

## メモ: php7.3 version
```
$ sudo yum --enablerepo=remi,remi-php73 install phpMyAdmin
```

# phpMyAdmin用のDB
phpMyAdminを動かすだけなら(おそらく)DBは不要なのですが、どうやら環境設定を保持できない（セッション限りになる？）ようなので、作っておくことにします。

## create_tablesの編集
必要なDBやTableを作成するためのSQLファイルがもともと`create_tables.sql`として準備されているので、これを一部編集して使います。

※編集しなくても使えるはずですが、DBユーザがrootになる気がします。

### Before
```sql:/usr/share/phpMyAdmin/sql/create_tables.sql
-- (activate this statement if necessary)
-- GRANT SELECT, INSERT, DELETE, UPDATE, ALTER ON `phpmyadmin`.* TO
--    'pma'@localhost;
```
### After
```sql:/usr/share/phpMyAdmin/sql/create_tables.sql
-- (activate this statement if necessary)
GRANT SELECT, INSERT, DELETE, UPDATE, ALTER ON `phpmyadmin`.* TO
  'hogehoge'@localhost;
```
ちなみに、ここで権限を与えるhogehogeユーザは既に存在していることが前提です。

## 実行
rootユーザで入ります。

```
$ mysql -u root -p
MariaDB [(none)]> source /usr/share/phpMyAdmin/sql/create_tables.sql
MariaDB [(phpmyadmin)]> FLUSH PRIVILEGES;
```
実行結果は省略してますが、特にエラーが出なければ大丈夫です。

# PHP-FPM
これも前回インストール済みですが、確認しておきます。

```
$ yum info installed php-fpm
読み込んだプラグイン:fastestmirror, langpacks
インストール済みパッケージ
名前                : php-fpm
アーキテクチャー    : x86_64
バージョン          : 7.1.32
リリース            : 1.el7.remi
容量                : 4.7 M
リポジトリー        : installed
提供元リポジトリー  : remi-php71
要約                : PHP FastCGI Process Manager
URL                 : http://www.php.net/
ライセンス          : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
説明                : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
                    : implementation with some additional features useful for sites of
                    : any size, especially busier sites.
```
もし、存在しない場合は、

```
$ sudo yum -y install --enablerepo=remi-php71 php-fpm
```
nginxでPHPを動かす際、`PHP-FPM`を使いますが、連携のための設定として`UNIX socket`と`127.0.0.1:9000`といったポート指定の二種類があります。
参考）[PHP-FPMの設定はUNIX socketとポート番号、どちらが良いのか](https://tech.cloudgarage.jp/archives/5394)

[前回](https://qiita.com/ktkiyoshi/items/bf920b4df02d98b570e3#%E8%B5%B7%E5%8B%95%E3%81%A8%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E8%A8%AD%E5%AE%9A)は何も考えず、後者のポート指定を使っていましたが、いい機会なので前者の`UNIX socket`に切り替えてみます。

## PHP-FPMの設定変更
```conf:/etc/php-fpm.d/www.conf
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock

;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
```

## PHPの設定変更（php.ini）
```/etc/php.ini
;session.save_path = "/tmp"
session.save_path = "/var/lib/php/session"
sudo chown -R root.nginx /var/lib/php/session
```

## nginxの設定変更
ポート指定となっている`127.0.0.1:9000`をコメントアウトし、`php-fpm.sock`のファイルパスを入れます。（この時点では`php-fpm.sock`は存在していなくて大丈夫です）

```conf:/etc/nginx/conf.d/default.conf
       #fastcgi_pass  127.0.0.1:9000;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
```
```conf:/etc/nginx/conf.d/default.conf
    location /phpMyAdmin {
        alias /usr/share/phpMyAdmin/;
        try_files $uri $uri/ /index.php;

        location ~ ^/phpMyAdmin/(.+\.php)$ {
            alias /usr/share/phpMyAdmin;
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_param SCRIPT_FILENAME /usr/share/phpMyAdmin/$1;
            include fastcgi_params;
            fastcgi_intercept_errors on;
            allow XXX.XXX.XX.XX;  # 接続元許可IP（あれば）
            deny  all;            # 上記のIP以外からの接続を拒否
        }
    }
```

## 再起動（設定の反映）
```
$ sudo systemctl restart php-fpm.service
$ sudo systemctl reload nginx.service
```
## sockファイルの確認
再起動すると生成されるようです。

```
$ ls -l /var/run/php-fpm/php-fpm.sock
srw-rw-rw- 1 nginx nginx 0  9月 28 17:01 /var/run/php-fpm/php-fpm.sock
```
# 動作確認
`https://hogehoge.com/phpMyAdmin/`といったURLでアクセスできます。

![スクリーンショット 2019-09-29 1.12.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59926/44e45583-fedd-f419-5a02-711da9e006b3.png)

# Appendix

## nginxのwarning
phpMyAdminとは直接関係はないですが、nginxのエラーログに時々`[warn]`で以下のようなログが出てくるようになりました。

PHP-FPMとの連携を、ポート指定から`UNIX socket`に変更したのがトリガーだと思われます。
参考）[Nginxの「proxy_buffer_size」のエラーログ対策・設定方法まとめ（upstream response is buffered to a temporary file）](https://parudou3.com/nginx/715/)

```/var/log/nginx/error.log
2019/09/28 18:36:42 [warn] 9529#9529: *1078 an upstream response is buffered to a temporary file /var/cache/nginx/fastcgi_temp/2/02/0000000022 while reading upstream, client: 66.249.64.116, server: hogehoge.com, request: "GET /wp/page/51/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "hogehoge.com"
```

取り急ぎ、バッファサイズの変更を設定してみたところ、エラーは出なくなりました。

```conf:/etc/nginx/nginx.conf
http {
//　略
    proxy_buffering on;
    proxy_buffer_size     8k;
    proxy_buffers         100 8k;
//　略
}
```

## tempディレクトリへのアクセス
phpMyAdminにログイン後、以下のようなエラーが出ていました。
![スクリーンショット 2019-09-29 1.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59926/a5a70e81-3f71-3e90-0bb7-1d43805b1667.png)

該当のディレクトリの権限を確認し、Webサーバ（nginx）の実行ユーザに変更します。

### Before

```
$ ll /var/lib/phpMyAdmin
drwxr-x--- 2 apache apache 6  9月 21 15:20 config
drwxr-x--- 2 apache apache 6  9月 21 15:20 save
drwxr-x--- 2 apache apache 6  9月 21 15:20 temp
drwxr-x--- 2 apache apache 6  9月 21 15:20 upload
```

### Run
```
$ cd /var/lib/
$ sudo chown nginx:nginx phpMyAdmin -R
```

### After
```
$ ll /var/lib/phpMyAdmin
合計 0
drwxr-x--- 2 nginx nginx  6  9月 21 15:20 config
drwxr-x--- 2 nginx nginx  6  9月 21 15:20 save
drwxr-x--- 3 nginx nginx 17  9月 29 01:43 temp
drwxr-x--- 2 nginx nginx  6  9月 21 15:20 upload
```
## 暗号化用の非公開パスフレーズ

tempディレクトリ同様にphpMyAdminにログイン後の画面にてエラーが出ていました。（キャプチャなし）

```
設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。
```

設定ファイルを確認してみると、`blowfish_secret`の項目には値が入っています。

```/etc/phpMyAdmin/config.inc.php
/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
```
こちらもやはり権限の問題でした。

### Before
```
$ sudo ls -ld /etc/phpMyAdmin/
drwxr-x--- 2 root apache 27  9月 29 01:50 /etc/phpMyAdmin/

$ sudo ls -l /etc/phpMyAdmin/config.inc.php
-rw-r----- 1 root apache 4587  9月 28 17:21 /etc/phpMyAdmin/config.inc.php
```

### Run
```
sudo chown root:nginx /etc/phpMyAdmin -R
```

### After
```
$ sudo ls -ld /etc/phpMyAdmin/
drwxr-x--- 2 root nginx 27  9月 29 01:50 /etc/phpMyAdmin/

$ sudo ls -l /etc/phpMyAdmin/config.inc.php
-rw-r----- 1 root nginx 4587  9月 28 17:21 /etc/phpMyAdmin/config.inc.php
```



---
phpMyAdminはDBを操作できてしまうあれなので、公開している環境で運用する場合、アクセス制限などは要検討かと思います。