LOG

続・Vagrantで開発環境(中)

前回の続き。
前回はvirtualhostの設定を行ってHTMLが表示されるところまで確認した。
今回はMySQLを入れて、複数のPHPをhtaccessで切り替えられるようにして、WordPress導入しちゃったりしてみよう。

MacOS X 10.9.3
Vagrant1.8.1
CentOS7.1
Apache2.4
MySQL5.7.10
PHP5.6.17

MySQL

% sudo yum remove mariadb-libs
% sudo yum -y install perl-Data-Dumper
% wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
% sudo rpm -Uvh mysql57-community-release-el7-7.noarch.rpm
% sudo yum -y install mysql-community-server

MySQLを起動する

% su -
% systemctl start mysqld.service
# 確認
% systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2016-02-04 01:19:02 JST; 23h ago
 Main PID: 2039 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─2039 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

# 自動起動するにようにする
% systemctl enable mysqld.service
% systemctl list-unit-files --type=service | grep mysql

とりあえず終了しておく

% systemctl stop mysqld.service

必要なディレクトリやファイルを作成

ログ用のディレクトリを作成

# su
% mkdir /var/log/mysql
% chown mysql: /var/log/mysql

socketのファイルを作成

# su
% ls -al /var/lib/mysql/mysql.sock
# でファイルが無ければ
% touch /var/lib/mysql/mysql.sock
% chown mysql: /var/lib/mysql/mysql.sock
% chmod 777 /var/lib/mysql/mysql.sock

ルートユーザーのパスワードを知る

rootユーザーの初期パスワードはランダムが設定されるので以下のコマンドで初期パスワードを知る。

% cat /var/log/mysqld.log | grep "temporary password"
# [Note] A temporary password is generated for root@localhost: ufut-4=vXEsh

ログインしてパスワードを変更する

# su
% mysql -u root ufut-4=vXEsh
Access denied for user 'root'@'localhost' (using password: NO)
ふぁー

下記設定を行った後に再度設定するのでとりあえず無視。

デフォルトの設定ファイルをコピーして編集する

% sudo cp /usr/share/mysql/my-default.cnf /etc/my.cnf

以下のように書き換える

[mysqld]
# デフォルトの文字コードを設定
character-set-server = utf8mb4

# ポート3306をMySQLで使う
port = 3306

# パスワードの検証を外す
validate_password = 0

# デフォルトのストレートエンジンをinnodbに
default-storage-engine = innodb

# データをメモリにキャッシュする量をVagrantマシンの半分を指定
# 70%〜80%が良いらしい
innodb_buffer_pool_size = 512M

# デフォルトでオンのようだけど念のため
innodb_file_per_table = 1

# 照合順序
collation-server = utf8mb4_general_ci

# パスワードの有効日数は無期限に
default_password_lifetime = 0

# MySQLがインストールされているディレクトリ
# basedir = /bin/mysql

# データベースのデータを格納するデータディレクトリ
# datadir = /var/lib/mysql/data

# ソケットの場所
socket = /var/lib/mysql/mysql.sock

# サーバーのID
server_id = 1

# バイナリログのファイル名
log_bin = /var/log/mysql/mysql-bin

# ログの出力先
log_output = FILE

# ログレベル 1:エラーのみ / 2:エラーと警告 / 3:エラー、警告、ノート
log_error_verbosity = 3

# エラーログのパス
log_error = /var/log/mysql/error.log

# 一般ログの出力
general_log = 1

# 一般ログのパス
general_log_file = /var/log/mysql/query.log

# スロークエリログの出力
slow_query_log = 1

# 時間のかかるクエリとみなす秒数
long_query_time = 1

# ロケール
log_timestamps = SYSTEM

sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

explicit_defaults_for_timestamp = true

#[client]
# クライアントから受け取ったデータのデフォルトの文字コード
#default-character-set=utf8mb4
character-set-server = utf8mb4
# ポート3306をMySQLで使う
port = 3306

[mysqldump]
show-warnings = 1

#[mysql]
show-warnings = 1
character-set-server = utf8mb4

mysql_secure_installationを実行

ここで、rootユーザーのパスワードを変更する。
ここではパスワードを「root」に変更

# su
% mysql_secure_installation
## ↓以降パスワードを変更したところから

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.



Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

これで接続してみる。

% mysql -u root -p
% Enter password:root
mysql>
#接続出来たら「exit」コマンドで抜ける
mysql> exit
Bye
MySQLで参考にした記事
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL Community Server 5.7.7 rc – Installing on Windows 7
MySQLのクエリログ・スローログ出力 – asa nisi masa (id:january / @january108)
innodb_buffer_pool_sizeのチューニング:どれくらい割り当てる?
MySQL 5.7 をインストールしたら最初に行うセットアップ | WEB ARCH LABO
MySQL5.7.9を試した by @ryouma_nagare
CentOS6.5にmysql5.6をインストールする手順
MySQL 5.5ではdefault-character-setが廃止されてた…

PHP

PHPはCGI版をインストールする。
まずはPHPを利用するのに必要なパッケージをインストール。

% sudo yum -y install gcc-c++
% cd workspace
% wget https://github.com/skvadrik/re2c/releases/download/0.16/re2c-0.16.tar.gz
% tar zxvf re2c-0.16.tar.gz
% cd re2c-0.16
% ./configure
% make
% sudo make install
% su -
% yum --enablerepo=epel -y install libmcrypt php-mcrypt libmcrypt-devel php-mcrypt-devel libtidy-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を入れる。

# su
% git clone https://github.com/CHH/phpenv.git
% cd phpenv/bin
% ./phpenv-install.sh
% cd ~
% mv ~/.phpenv /usr/local/phpenv
% touch /etc/zshenv
% vi /etc/zshenv

/etc/zshenvに以下の内容を追記。

export PATH="/usr/local/phpenv/bin:$PATH"
eval "$(phpenv init - zsh)"

/usr/local/phpenv/bin/phpenvを変更。

# su
% vi /usr/local/phpenv/bin/phpenv
# ---------------------------------
export RBENV_ROOT='/usr/local/phpenv'

zshenv再読み込みさせる。

# su
% source /etc/zshenv

php-build

php-buildをphpenvのプラグインとして追加する。

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

PHPをビルドする際のオプションは

/usr/local/phpenv/plugins/php-build/share/php-build/default_configure_options

にあり、バージョンごとのプションは

/usr/local/phpenv/plugins/php-build/share/php-build/definitions/<バージョン>

に指定する。

とりあえず5.6.17用の設定を以下のようにする

# /usr/local/phpenv/plugins/php-build/share/php-build/definitions/5.6.17
configure_option -D "--without-pear"
configure_option "--with-pear"
install_package "https://secure.php.net/distributions/php-5.6.17.tar.bz2"
install_xdebug "2.3.3"
enable_builtin_opcache
オプション
-R値の変更
-D削除

変更出来るオプション一覧は・・・
http://php.net/manual/ja/configure.about.php

# su
% phpenv install 5.6.17
% phpenv global 5.6.17
% php -v
PHP 5.6.17 (cli) (built: Jan 31 2016 13:53:28)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
補足
モジュール版で利用する場合は、phpenv-apache-versionが便利。

php.iniの変更

php.iniは

/usr/local/phpenv/versions/バージョン/etc/

にある。
php.iniを複製して以下のように変更。

;date.timezone =
# ↓
date.timezone = Asia/Tokyo

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

mysql.default_socket =
# ↓
mysql.default_socket = /var/lib/mysql/mysql.sock

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

mysql.default_port =
# ↓
mysql.default_port = 3306

mysqli.default_port = 3306
# ↓
mysqli.default_port = 3307
phpenvで参考にした記事
あなたのサイトの PHPは,CGI方式ですか? Module方式ですか?
Ubuntu に phpenv を入れて複数バージョンのPHP管理しようとした by @Qurage on @Qiita
phpenvのコマンドとphpenv-apache-versionの切り替えコマンド on @Qiita
phpenv+php-buildでphpをinstallしまくる – 萌えキャラとは何だったのか
phpenvの導入して複数バージョンのPHPを管理する by @memememomo on @Qiita
CentOS7.1 64bitのyumリポジトリにEPELを追加 | kakiro-web カキローウェブ
CentOSにphpenvでPHP環境を構築する by @trisland on @Qiita

ApacheでPHPを使えるようにする

apacheがPHPを扱えるようにsuExecを利用する。
まずは現状の確認

# su
% which suexec
# /sbin/suexec
% suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_SYSLOG
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=500
 -D AP_USERDIR_SUFFIX="public_html"
AP_DOC_ROOTapacheのドキュメントルート。suexec実行出来るディレクトリ
AP_HTTPD_USERapacheを動作させるユーザー。suexecが実行可能なユーザー
AP_LOG_SYSLOGログはシステムログ出るようになった模様。
AP_USERIDR_SUFFIXsuexec実行出来るディレクトリのサブディレクトリ

suexecの変更はapacheコンパイル時のオプションで指定する。
面倒なので、ここではsuexecの設定に合わせる。
(力技で変更する方法もあるそう。。。)

システムログは
「/var/log/secure」なので

% tail -f /var/log/secure

で出せる。
apacheのエラーログはデフォルトだと「/var/log/httpd/error_log」なので

% tail -f /var/log/httpd/error_log

suxecを確認したら、/etc/httpd/conf.d/vhost.confを変更する。

<VirtualHost *:80>
    ServerName test1
    DocumentRoot /var/www/public_html/test1/
    SuexecUserGroup vagrant vagrant
    Action php5.6.17 /cgi-bin/vagrant/php5.6.17
    <Directory "/var/www/public_html/test1/">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Require all granted
        DirectoryIndex index.php index.html index.htm
    </Directory>
</VirtualHost>

「Action」でphp5.6.17 とパスを紐付けている。
「/var/www/cig-bin」ではなく「/cgi-bin」となっているのは、httpd.confに
エイリアスが記載されているため(デフォルト)

更に「AddHandler」で「Action」で定義したphp5.6.17と拡張子.phpを紐付ける必要があるが
これは.htaccessで行う。

追記
セキュリティ的にAddHandlerは使わない方が良いようで。
ApacheのAddHandlerはセキュリティ上の懸念から使用すべきではない

cgi版PHPを動かす下準備

# su
% chown apache.apache /var/www/cgi-bin
# ユーザー用ディレクトリ作成
% mkdir /var/www/cgi-bin/vagrant
# 作成したディレクトリの所有者とグループをvagrantに変更
% chown vagrant.vagrant /var/www/cgi-bin/vagrant
% cd /var/www/cgi-bin/vagrant
% cp /usr/local/phpenv/versions/5.6.17/bin/php-cgi php5.6.17
# ファイルもvagrantに変更
% chown vagrant.vagrant php5.6.17
% ls -al
drwxr-xr-x  2 vagrant vagrant       22 Feb  2 23:55 .
drwxrwxrwx. 3 apache  apache        20 Feb  3 00:04 ..
-rwxr-xr-x  1 vagrant vagrant 40068199 Feb  2 23:48 php5.6.17
% exit

ユーザーvagrantをapacheグループに入れる

% sudo gpasswd -a vagrant apache
% id vagrant
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),48(apache)

他の環境ではわからないが、
「cgi-bin/php5.6.17」では動かなかった
ディレクトリも含めてスクリプト実行ユーザーが所有者じゃないとダメなのか・・・

apacheの再起動とファイルの追加

% sudo apachectl restart
補足
apache 2.4.10からこんなのが使えるみたい
php-fpm + apache2.4.10(mod_proxy_fcgi) at softelメモ
ApacheでPHPを使えるようにするために参考にした記事
apache のsuEXEC で phpを動かしてみる

phpmyadminを入れる

データベースの操作にコマンドラインを使ってもいいが
phpMyAdminを使うのに慣れているのでphpMyAdminを入れる。

ここでは、phpMyAdminはhttp://phpmyadmin/でアクセス出来るようにする。

virtualhostの設定を追加する

# su
% vi /etc/httpd/vhosts.conf
# 以下を追記
<VirtualHost *:80>
    ServerName phpmyadmin
    DocumentRoot /var/www/public_html/phpmyadmin/
    SuexecUserGroup vagrant vagrant
    Action php5.6.17 /cgi-bin/vagrant/php5.6.17
    <Directory "/var/www/public_html/phpmyadmin/">
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Require all granted
        DirectoryIndex index.php index.html index.htm
    </Directory>
</VirtualHost>

Vagrantfileを開いて

web.hostsupdater.aliases  = ["test1"]
# ↓
web.hostsupdater.aliases  = ["test1","phpmyadmin"]

に変更。
共有ディレクトリ内のtest1と同階層にphpmyadminというディレクトリを作成し
phpMyAdminからダウンロードしていた一式をディレクトリに突っ込む
あとtest1ディレクトリの「.htaccess」を複製して突っ込んでおく。

Vagrantマシンから抜けて

$ vagrant reload

http://phpmyadmin/でログイン画面が出る。
rootユーザーで設定したパスワードを入れてログイン。
データベースを1つ作成する。


WordPressを入れる

test1ディレクトリにWordPressを入れる。
共有フォルダに「www」ディレクトリが出来てるはずなのでMacの場合Finderとかでダウンロードしてきた一式を放り込む方が早いかも
ここでは

共有フォルダ(www)/public_html/test1/sys/

にダウンロードしてきた一式を入れた。
http://test1/sys/にアクセスして登録をすると・・・


やったー!
次回はPHPの設定などを行う。