LOG

CentOS7 + MySQL + nginx + php-fpm

サーバー構成
OSCentOS 7.3.1611
MySQL5.7.18
nginx1.12.0
PHP7.1.5(php-fpm)

事前知識

FHS

FHS(Filesystem Hierarchy Standard)というファイルシステム階層の標準化の仕様があり、Linuxのディストリビューションはこれに従っている。
ここで定められた階層を基にディストリビュージョンは拡張していく。

SELinux

ホワイトリストタイプの強制アクセス制御をするモジュール
CentOS7からSELinuxが有効になった。

参考
Security-Enhanced Linux

SELinuxを止める

SELinuxが動いていると面倒臭いので止める。

# SELinuxの状態を確認
#   enforcing  = SELinux機能、アクセス制御が有効
#   permissive = SElinuxは警告を出力するが、アクセス制限は無効
$ getenforce

$ sudo vi /etc/selinux/config

「/etc/selinux/config」を以下のように書き換え。

# /etc/selinux/config
...
SELINUX=enforcing
...
↓↓↓↓
...
SELINUX=disabled
...

一時的に止めたい場合は・・・

# 停止
$ setenforce 0

# 再開
$ setenforce 1

専用のユーザーを作成(必須ではない)

nginxやPHPの実行用アカウントを作成しておく。
ここではwebというアカウントを作成する。

$ useradd web -p パスワード

webアカウントがsuコマンドを実行出来ないようにしておいた方が良い。

参考
suコマンドを実行できるユーザを制限する方法 | server-memo.net

MySQLの設定

MariaDBをインストールしようとしたらエラーのオンパレードで解決出来そうになかったので
諦めて、MySQLをインストール。
CentOS7はMariaDBが入っており、これがMySQLとコンフリクトを起こしてしまうので、削除する
OSに古いMariaDBが入ってる場合があるので確認。

$ rpm -qa | grep -i "mariadb"

MariaDBがあれば削除。

$ sudo yum remove [mariadb]

[mariadb]にはMariaDB-common、MariaDB-devel、MariaDB-shared、MariaDB-compat、MariaDB-server、MariaDB-clientなどが入る。

リポジトリを追加

$ su -
$ yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

インストール

$ yum -y install mysql-community-server
$ mysqld --version

バージョンが出てきたらOK。
次に設定ファイル(/etc/my.cnf)を変更する。

# /etc/my.cnf
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set = utf8mb4

[mysqld]
server_id = 1
port=3306
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
symbolic-links=0

# 一般ログの出力
general_log = 1
# 一般ログのパス
general_log_file = /var/log/mysql/query.log
# エラーログのパス
log_error = /var/log/mysql/error.log
# スロークエリの出力設定
slow_query_log=ON
# スロークエリと判定する秒数
long_query_time=3
# スロークエリログの場所
slow_query_log_file=/var/log/mysql/slow.log

#
#log_queries_not_using_indexes=1

[mysqldump]
show-warnings = 1

注意:上記の設定はチューニングをしていない。

上記の設定だとログファイルを/var/log/mysql以下に出力するのでディレクトリを作成する。

$ mkdir /var/log/mysql/
$ chown mysql: /var/log/mysql/

これで一度起動してみる。ついでに自動起動も設定しておく。

$ systemctl enable mysqld.service
$ systemctl start mysqld.service

# 動作しているか確認
$ systemctl status mysqld.service

active (running)になっていればOK。

MySQLのrootのパスワードが自動で設定されているので、ログを見て調べる。

$ cat /var/log/mysqld.log | grep "temporary password"

出てきたパスワードをメモしておく。

セキュリティの為にmysql_secure_installationを実行する。

$ mysql_secure_installation

ここでの設定は・・・

  • 新しいrootパスワードの設定
  • VALIDATE PASSWORDプラグインは使用(y)
  • anonymousユーザーは削除(y)
  • rootユーザーへの遠隔ログインは禁止(y)
  • testデータベースは削除(y)
  • privilegeテーブルのリロード(y)

などを設定する。
設定が済めば、新しい設定で接続出来るか確認する。

$ mysql -u root -p

nginxの設定

リポジトリを登録する。

$ su -
$ yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

nginxをインストールする。

$ yum -y install --enablerepo=nginx nginx

設定ファイルを変更する。
この記事ではチューニングはしない。

/etc/nginx/nginx.confを開きユーザー名を変更する。

...
user  web web;
...

/etc/nginx/conf.d/default.confを変更する。

server {
    listen                       80;
    server_name                  localhost;
    charset                      UTF-8;
    access_log                   /var/log/nginx/host.access.log main;
    error_log                    /var/log/nginx/error.log warn;
    root                         /home/web/www/html;
    index                        index.html index.php;
    error_page  404              /404.html;
    error_page  500 502 503 504  /50x.html;
    location ~ [^/]\.php(/|$) {
        # PATH_INFO 部の分割に使用する正規表現を指定
        # 一つ目 ( .+\.php ) は $fastcgi_script_name の値になり、二つ目 ( /.+ ) は $fastcgi_path_info の値になる
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
        # FastCGI サーバへリクエストをプロキシする
        fastcgi_pass unix:/var/run/php-fpm7.1.5.sock;
        # スラッシュで終わる URI の後に追加されるファイル名を設定
        # $fastcgi_script_name の値になる
        fastcgi_index index.php;
        # 設定ファイルを読み込む
        include fastcgi_params;
        # FastCGI サーバに渡されるべきパラメータを設定
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    }
    # 参考:http://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc
}

※ セキュリティは考慮していない。
rootは上で作成したユーザーディレクトリ内にしている。

nginxを立ち上げる。

systemctl enable nginx

サーバーのIPアドレスをブラウザで叩けば表示される。


phpの設定

まずはPHPの依存するパッケージをインストール。

$ yum --enablerepo=epel -y install libmcrypt php-mcrypt libmcrypt-devel php-mcrypt-devel libtidy-devel re2c bzip2-devel
$ yum -y install automake autoconf libicu-devel bison libxml2-devel libcurl-devel libjpeg-devel libpng-devel readline-devel libtidy-devel libxslt-devel mod_fcgid

phpenvのインストール

phpはバージョンの切り替えがしやすいようにphpのバージョン管理ができるphpenv経由で入れる。

$ su -

$ git clone https://github.com/CHH/phpenv.git

# phpenvインストール
$ cd phpenv/bin
$ ./phpenv-install.sh
# これで~/に.phpenvディレクトリが出来上がる。

# phpenvを移動させる
$ cd ~
$ mv .phpenv /usr/local/opt/phpenv

optディレクトリが無ければ事前に作成しておく。
phpenvのファイルを変更する。

$ vi /usr/local/opt/phpenv/bin/phpenv

PHPENV_ROOT変数を変更する。

# /usr/local/opt/phpenv/bin/phpenv

export PHPENV_ROOT=${PHPENV_ROOT:-'/root/.phpenv'}
↓↓↓↓↓
export PHPENV_ROOT=${PHPENV_ROOT:-'/usr/local/opt/phpenv/'}

次にphpenvのセットアップを.zshrcか.bashrcに追記する。
以下は.zshrc

$ vi ~/.zshrc
# .zshrc
export PATH="/usr/local/opt/phpenv/bin:$PATH"
eval "$(phpenv init - zsh)"

shellがバッシュの場合は
eval “$(phpenv init – zsh)”ではなく
eval “$(phpenv init -)”

不必要な必要なファイルの削除と.zshrcの読み込み。

$ cd ~
$ rm -rf phpenv
$ source .zshrc

phpenvが利用になったかを確認。

$ phpenv -v

rbenvから始まるバージョンが表示されればOK。

php-buildのインストール

PHPのコンパイルが出来るphp-buildをphpenvのプラグインとして入れる。

$ su -
git clone https://github.com/CHH/php-build.git /usr/local/opt/phpenv/plugins/php-build

PHPのインストール

インストール出来るphp一覧は

$ phpenv install -l

で確認出来る。
また[php-buildディレクトリ]/share/php-build/にPHPをインストールする際に必要な定義ファイルが入っている。

[php-buildディレクトリ]/share/php-build/default_configure_options
が、デフォルトの定義ファイル

[php-buildディレクトリ]/share/php-build/difinitions/[phpのバージョン]
が、バージョンごとの定義ファイル

となっており、default_configue_options -> バージョンごとのdifinitionの順で呼ばれるため
バージョンごとの定義ファイルでデフォルトの定義ファイルの内容を書き換えることが出来る。

今回はphp7.1.5を入れるので
[php-buildディレクトリ]/share/php-build/difinitions/7.1.5
を複製し、以下のように変更

# [php-buildディレクトリ]/share/php-build/difinitions/7.1.5
configure_option "--enable-fileinfo"
configure_option "--enable-json"
configure_option "--with-iconv"
configure_option "--with-gd"
install_package "https://secure.php.net/distributions/php-7.1.5.tar.bz2"
install_xdebug "2.5.3"
enable_builtin_opcache

この設定は単に必要なモジュールを定義しているだけなので、用途に合わせて適宜変更する。
定義ファイルでは

configure_option -D "--without-pear"

というようなオプションが利用可能。

オプション
-R値の変更
-D削除

configureの参考

php7.1.5をインストールする

$ phpenv install 7.1.5

依存パッケージが見つからなくてエラーが出る場合は適宜追加インストールする。

設定ファイルを変更する

/usr/local/opt/phpenv/version/にインストールしたバージョンのディレクトリができており、その中にある
php.iniを以下のように変更する。

# /usr/local/opt/phpenv/version/[バージョン]/etc/php.ini
;date.timezone =
↓↓↓
date.timezone = "Asia/Tokyo"

pdo_mysql.default_socket=
↓↓↓
pdo_mysql.default_socket="/var/lib/mysql/mysql.sock"

mysqli.default_socket =
↓↓↓
mysqli.default_socket = "/var/lib/mysql/mysql.sock"

;mbstring.language = Japanese
↓↓↓
mbstring.language = Japanese

次にphp.iniと同階層にあるphp-fpm.conf.defaultをphp-fpm.confにリネームして以下を変更する。

# /usr/local/opt/phpenv/version/[バージョン]/etc/php-fpm.conf

;pid = run/php-fpm.pid
↓↓↓
pid = /var/run/php-fpm7.1.5.pid

そしてphp-fpm.dディレクトリにあるwww.conf.defaultをwww.confにリネームして以下のように変更する。

# /usr/local/opt/phpenv/version/[バージョン]/etc/php-fpm/www.conf
user = nobody
↓↓↓
user = web

group = nobody
↓↓↓
group = web

listen = 127.0.0.1:9000
↓↓↓
listen = /var/run/php-fpm7.1.5.sock

;listen.owner = nobody
↓↓↓
listen.owner = web

;listen.group = nobody
↓↓↓
listen.group = web

;listen.mode = 0600
↓↓↓
listen.mode = 0600

サービスに登録する

さらにOS起動時にphp-fpmを実行したいのでサービス管理を行うsystemdにphp-fpmの設定を追加する。

$ touch /etc/systemd/system/php-fpm7.1.5.service

作成したファイルを以下のように書き換える

# /etc/systemd/system/php-fpm7.1.5.service
[Unit]
Description=The PHP 7.1.5 FastCGI Process Manager
After=network.target nginx.service

[Service]
Type=simple
PIDFile=/var/run/php-fpm7.1.5.pid
ExecStart=/usr/local/opt/phpenv/versions/7.1.5/sbin/php-fpm -F
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

サービスを起動する

$ systemctl enable php-fpm7.1.5.service
$ systemctl start php-fpm7.1.5.service

これでPHPが利用可能になる。