データベース」カテゴリーアーカイブ

CentOS7 + nginx + phpMyAdmin

CentOS7にphpMyAdminをEPEL経由でインストールしてみた。

環境:
OS: CentOS 7.5
Webサーバ: nginx (EPELパッケージ)
PHP: php-fpm 5.4.16 (CentOS標準パッケージ)
DB: MariaDB 5.5.56 (CentOS標準パッケージ)

1. nginxインストール

EPELリポジトリを追加する(まだ追加していない場合)
$ sudo yum install epel-release

nginxをインストールする。
$ sudo yum install nginx
追加機能をコンパイルしたい場合は、SRPM を自前でリビルドしてもよい

あとは自分の用意したいWebサーバに合わせてバーチャルホスト設定ファイルを作成することになる。設定ファイルの中に、phpMyAdmin 用の記述を入れる。Apache 用の設定が /etc/httpd/conf.d/phpMyAdmin.conf にあるので、参考にする。

  root /usr/share/phpMyAdmin;
  ...
  location ~ ^/libraries/ { deny all; }
  location ~ ^/setup/lib/ { deny all; }
  location ~ ^/setup/frames/ { deny all; }
  location ~ ^/.*\.php$ {
    allow 203.0.113.100;		←自宅からのアクセス許可
    deny all;				←それ以外は全部拒否
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
  }
  location / {
    allow 203.0.113.100;
    deny all;
  }

$ sudo systemctl enable nginx
$ sudo systemctl start nginx

2. mariadb インストール・設定

$ sudo yum install mariadb mariadb-server
$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

rootパスワードの初期設定を行っておく。
$ mysql_secure_installation

3. phpインストール・設定

必要そうなパッケージをまとめてインストールしておく。
$ sudo yum install php-fpm php-mysql php-gd php-mbstring

phpの基本設定を行う。
$ sudo vi /etc/php.ini

expose_php = Off			←PHPの情報を隠す

ほかにもパフォーマンスチューニングのパラメータがphp.iniの中にあるので、必要に応じて変更しておく。

php-fpmとして動作するときの設定を行う。
$ sudo vi /etc/php-fpm.d/www.conf

listen = /run/php-fpm/php-fpm.sock	←UNIXソケットを利用
listen.owner = nginx			←UNIXソケットの所有者をnginx実行ユーザにする
listen.group = nginx
listen.mode = 0600			←nginx以外からソケットを利用できないようにする
user = nginx				←php-fpm実行ユーザをnginxにそろえておく
group = nginx

php-fpmデーモンを起動する。
$ sudo systemctl enable php-fpm
$ sudo systemctl start php-fpm

3. phpMyAdminインストール・設定

phpMyAdminをインストールする。
$ sudo yum install phpMyAdmin

必要なディレクトリの作成、nginxから読めるよう権限の修正を行う。
$ sudo mkdir -p /var/lib/php/session
$ sudo chown nginx:nginx /var/lib/php/session
$ sudo chgrp -R nginx /etc/phpMyAdmin
$ sudo chown -R nginx:nginx /var/lib/phpMyAdmin

phpMyAdminに必要なDB・テーブルの作成を行う。
$ mysql -u root -p
Enter password:
MariaDB [(none)]> source /usr/share/phpMyAdmin/sql/create_tables.sql;
MariaDB [(none)]> \q

あとはWebブラウザで http://自分のサーバ/phpMyAdmin/ にアクセスし、動作確認を行う。

Ubuntu 18.04 + MariaDB

Ubuntu 標準パッケージの MariaDB を使うにあたってハマりそうな箇所を記述してみる。

DB root ユーザでの接続に失敗する

MariaDB/MySQL データベースを使い始めるときは、まず mysql_secure_installation コマンドで状態を初期化して root パスワードを設定するのが一般的だろう。そして、設定したパスワードを使って DB root 接続し、アプリケーション等に必要なデータベースや DB 一般ユーザを作成する。この手順を実行しようとすると、DB に root ログインできない (パスワード認証が通らない) という事象にぶち当たる。

user@bionic$ sudo mysql_secure_installation (初期化してrootパスワードを設定)
Set root password? [Y/n]y
New password: testpass01
Re-enter new password: testpass01
Remove anonymous users? [Y/n]y
Disallow root login remotely? [Y/n]y
Remove test database and access to it? [Y/n]y
Reload privilege tables now? [Y/n]y

user@bionic$ mysql -u root -p
Enter password: testpass01
ERROR 1698 (28000): Access denied for user 'root'@'localhost' ←認証エラー!

上記動作の原因は、初期状態の DB root ユーザ認証に unix_socket 認証プラグインが使われていることである。この状態では、DB root として接続するために OS の root 権限にならなければならない (sudo または su コマンドを使う)。OS root になっていれば、以下のようにパスワードなしで DB root として接続可能である。

user@bionic:~$ sudo mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 35
Server version: 10.1.29-MariaDB-6 Ubuntu 18.04

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

DB root でログインすると、認証プラグインの状態も確認できる。

MariaDB [(none)]> SELECT user,host,plugin from mysql.user;
+------+-----------+-------------+
| user | host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket | ← unix_socket 認証プラグインが使われている
+------+-----------+-------------+
1 row in set (0.00 sec)

さて、この認証方式をそのまま使うか?それとも昔ながらのパスワード認証に戻すか?

初期状態の認証設定でそのまま利用する

初期設定に乗っかっていくなら、DB の root パスワードを設定する必要がない。

また一般ユーザでも同一の仕組みを使う場合は、UNIX ユーザと DB ユーザを同名で作成すればよい。

(ただし、この認証方式では外部ホストから TCP/3306 経由でログインできないことになる。必ずローカルの UNIX ドメインソケット経由でなければならない)

以下はブログエンジン WordPress を「wordpress」というユーザ名で利用する場合の例。OS の wordpress ユーザを作り、DB の wordpress ユーザも作成する。

user@bionic:~$ sudo useradd -m -s /bin/bash wordpress
user@bionic:~$ sudo mysql
MariaDB [(none)]> CREATE USER wordpress@localhost IDENTIFIED VIA unix_socket;

wordpress ユーザで接続できるかどうか確認する。

user@bionic:~$ sudo -i -u wordpress
wordpress@bionic:~$ mysql -u wordpress
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 57
Server version: 10.1.29-MariaDB-6 Ubuntu 18.04

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> \q
Bye

このやり方では、WordPress のファイル群を実行する PHP の実行ユーザが wordpress ユーザである必要がある。例えば PHP 実行環境に php-fpm を使っている場合は、/etc/php/7.2/fpm/pool.d/www.confを編集して php-fpm 実行ユーザを wordpress に変更する。

/etc/php/7.2/fpm/pool.d/www.conf 抜粋

user = wordpress
group = wordpress

wordpressデータベースの作成

user@bionic:~$ sudo mysql
MariaDB [(none)]> CREATE DATABASE wordpress;
MariaDB [(none)]> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,INDEX,ALTER ON wordpress.* TO wordpress@localhost;

wordpress 側の設定 (wp-config.php) では、パスワードを空にしておく。

define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');

従来のパスワード認証を使っていく場合

DB の root ユーザを従来のパスワード認証に変更する (以前の方式に戻す) 。私自身は、こちらの手法で行くことにする。

user@bionic:~$ sudo mysql
MariaDB [(none)]> set password for 'root'@'localhost'=password('testpass02');
MariaDB [(none)]> use mysql;
MariaDB [mysql]> update user set plugin='' where user='root';
MariaDB [mysql]> flush privileges;
MariaDB [mysql]> \q

root ユーザの認証プラグインを外し、通常のパスワードを設定している。

一般ユーザについても、通常のパスワードを設定して作成する。

user@bionic:~$ mysql -u root -p
Enter password: testpass02
MariaDB [(none)]> CREATE USER wordpress@localhost IDENTIFIED BY 'testpass03';

この場合、ログローテートの処理 (/etc/logrotate.d/mysql-server の16行目) にrootパスワードが必要になる。/etc/mysql/debian.cnf の password 行に平文パスワードを記述しておくこと。
user@bionic:~$ sudo vi /etc/mysql/debian.cnf

5行目、10行目
password = testpass02

Ubuntu 16.04 + MariaDB

※これは古い記事です。Ubuntu 18.04 の場合はこちら

※以下のサイトを参考に全面改訂しました(2017/09/12)
Ubunt 16.04でMariaDBをインストールするとパスワードが変

MySQL から MariaDB に移行するにあたって、パッケージが前提とする流儀が違ったり、罠があったりするので手当てをする。

1. DB root ユーザでの接続に失敗する

通常は最初に DB root ユーザで DB エンジンに接続して、Web アプリケーションの要求するデータベースやDBユーザを作成するだろう。これを実行しようとすると、OS の一般ユーザのコマンドラインから DB に root ログインできないという事象にぶち当たる。

user@xenial:~$ mysql -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

mysql_secure_installationで初期化を実行しても効果がない。

上記動作の原因は、初期状態の DB root ユーザ認証に UNIX ソケット認証プラグインが使われているためである。この状態では、DB root として接続するために OS root 権限にならなければならない (sudo または su コマンドを使う)。OS root になっていれば、以下のようにユーザ名指定なし・パスワードなしで DB root として接続可能である。

user@xenial:~$ sudo mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 42
Server version: 10.0.34-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

DB root でログインすると、認証プラグインの状態も確認できる。

MariaDB [(none)]> SELECT user,host,plugin from mysql.user;
+------+-----------+-------------+
| user | host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket | ←unix_socket認証プラグインが使われている
+------+-----------+-------------+
1 row in set (0.00 sec)

2. 初期状態の認証設定でそのまま利用する

この初期設定に乗っかっていくなら、DB の root パスワードを設定する必要がない。

また一般ユーザでも同一の仕組みを使う場合は、UNIX ユーザと DB ユーザを同名で作成すればよい。

例) wordpress を「wordpress」というユーザ名で利用する場合

user@xenial:~$ sudo useradd -m -s /bin/bash wordpress (OS ユーザの作成)
user@xenial:~$ sudo mysql
MariaDB [(none)]> CREATE USER wordpress@localhost IDENTIFIED VIA unix_socket; (DB ユーザの作成)

wordpress ユーザで接続できるかどうか確認する。

user@xenial:~$ sudo -i -u wordpress
wordpress@xenial:~$ mysql -u wordpress
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 46
Server version: 10.0.34-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> \q
Bye

※上記の方式でwordpressを動かす場合は、PHP の実行ユーザが wordpress ユーザである必要がある。例えば PHP 実行環境に php-fpm を使っている場合は、/etc/php/7.0/fpm/pool.d/www.confを編集して php-fpm 実行ユーザを wordpress に変更する。

※この認証方式では、TCP/3306 経由ではログインできないことになる。必ずローカルの UNIX ドメインソケット経由でなければならない。

3. 従来のパスワード認証を使っていく場合

DB の root ユーザを従来のパスワード認証に変更したい (以前の方式に戻す) 場合は、以下の手順を実行する。

user@xenial:~$ sudo mysql
MariaDB [(none)]> set password for 'root'@'localhost'=password('パスワード文字列');
MariaDB [(none)]> use mysql;
MariaDB [mysql]> update user set plugin='' where user='root';
MariaDB [mysql]> flush privileges;
MariaDB [mysql]> \q

root ユーザの認証プラグインを外し、通常のパスワードを設定している。この対処を実施した場合は、/etc/mysql/debian.cnf に平文パスワードを記述してやらないと systemctl での起動・停止が動作しなくなる。

user@xenial:~$ sudo vi /etc/mysql/debian.cnf
[client]
host     = localhost
user     = root
password = rootのパスワード文字列
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = root
password = rootのパスワード文字列
socket   = /var/run/mysqld/mysqld.sock

一般ユーザについても、通常のパスワードを設定して作成する。

MariaDB [(none)]> CREATE USER wordpress@localhost IDENTIFIED BY 'パスワード文字列';

4. localhost の 3306/tcp に接続できない

アプリケーションから localhost あてに接続すると、システム上 IPv6 (::1) が優先される。しかし MariaDB デフォルト設定の bind-address は 127.0.0.1 になっている。

このせいで、アプリケーションの設定で、DB サーバのホスト名 / IP アドレス指定を “localhost” にしてあると接続できない。アプリケーション側での DB サーバ指定を 127.0.0.1 とするか、MariaDB 側の設定ファイル /etc/mysql/mariadb.conf.d/50-server.cnf で bind-address を ::1 にする必要がある。