非エンジニアでも自力でローカルでWordpress環境を構築したい

# はじめに
非エンジニア(デザイナー)でもWordpressをローカルで制作したいので常時SSLでPHP7なWordpress環境を構築してみる。単にWordpressを動かすのなら[VCCW](http://vccw.cc/)や[Scotch Box](https://box.scotch.io/)みたいな素晴らしいものもあるけど、今回は勉強も兼ねて出来るだけ自作してみようと思う。

### 自分の環境
Windows10
VirtualBox バージョン 5.1.28 r117968 (Qt5.6.2)

```bash:
$ vagrant -v
Vagrant 2.0.0
```

### 必要なもの
これは必須なので各自PCにインストール
- [Vagrant](https://www.vagrantup.com/)
- [VirtualBox](https://www.virtualbox.org/)

### Vagrantについて
今回はサーバーのセットアップについて詳しくまとめたいので、Vagrantについては下記を参考に
https://qiita.com/kidach1/items/e63c1607705178aa257c

### コマンドライン/ターミナル
WindowsのPowershellでもいいし、Macのターミナルでも良い。
でも[ConEmu](https://conemu.github.io/)や[iTerm](https://www.iterm2.com/)なんかだともっと捗るかと思う。

# STEP.1 Vagrantの準備と立ち上げまで

### まずは作業用フォルダを作成して移動

```bash:
mkdir sample
cd sample
```

### boxを追加
boxは公式の[Vagrant Cloud](https://app.vagrantup.com/boxes/search)からCentOS6.4を選択。
本当はCentOS7xを利用したかったが、どうも公式のboxはGuest Additionsがなかったり、Private keyのエラーが出たりと、中々安定しなかったので、枯れたCentOS6を選択。この辺りは今後の課題としたい。
ちなみにboxのダウンロードはそこそこ時間がかかるのでコーヒーでも飲んで待とう。

```bash:
$ vagrant box add puppetlabs/centos-6.6-64-puppet
```

### Vagrantfileの作成
デフォルトのVagrantfileを作成

```bash:
$ vagrant init
```

### Vagrantfileの編集
Vagrantfileに先程DLしたboxの情報など記入する

```ruby:Vagrantfile
#15行目にboxを記入
config.vm.box = "puppetlabs/centos-6.6-64-puppet"

#35行目のコメントアウトを外す。192.168.33.10でアクセス出来るようにする。
config.vm.network "private_network", ip: "192.168.33.10"

#46行目にサーバーのドキュメントルートと同期するフォルダやオプションを記入
config.vm.synced_folder "public", "/var/www/", create: true, owner: 'vagrant', group: 'vagrant', mount_options: ['dmode=777,fmode=666']

#52-58のコメントアウトを外し有効メモリを1Gに設定。vb.gui = trueはデバッグ用にVMが自動で立ち上がるので今回はfalseに。
config.vm.provider "virtualbox" do |vb|
  # Display the VirtualBox GUI when booting the machine
  vb.gui = false
  
  # Customize the amount of memory on the VM:
  vb.memory = "1024"
end
```

### CentOS6.4の起動

```bash:
$ vagrant up
```

ここまでで一旦vagrantが立ち上がり、CentOS6.4が起動するところまで出来た

# STEP.2 サーバーのインストールと設定
ここからApacheやPHPをインストールをしていく

### ルートフォルダを作る
Vagrantfileで設定したドキュメントルートと同期するフォルダを作る。
ここが最終的に[https://192.168.33.10](https://192.168.33.10)のルートになる。

```sbash:
$ mkdir public
```

### ここからSSHで設定していく
```sbash:
$ vagrant ssh
[vagrant@localhost ~]$ 
```

```bash:
# rootでログイン
[root@localhost vagrant]$ sudo su

# selinuxを無効化する
[root@localhost vagrant]$ sed -i -e "s/SELINUXTYPE=targeted/SELINUXTYPE=disabled/" /etc/selinux/config
[root@localhost vagrant]$ setenforce 0

# iptablesを無効にする
[root@localhost vagrant]$ /sbin/service iptables stop
[root@localhost vagrant]$ /sbin/chkconfig iptables off

#Apacheをインストールして開始
[root@localhost vagrant]$ yum -y install httpd
[root@localhost vagrant]$ /etc/init.d/httpd start
```

この時点で[http://192.168.33.10](http://192.168.33.10)にアクセスするとApacheのテストページが見れるはず。
どんどんセットアップしていきましょう。

```bash:
# 後のPHPのインストールのためにEPELとRemiリポジトリを追加
[root@localhost vagrant]$ yum -y install epel-release
[root@localhost vagrant]$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# php 7.1をインストール
[root@localhost vagrant]$ yum -y remove php-*
[root@localhost vagrant]$ yum -y install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-mcrypt php-gd php-xml php-intl php-pear php-mysql

# ちゃんとインストール出来たか、phpのバージョンを確認
[root@localhost vagrant]$ php -v
PHP 7.1.10 (cli) (built: Sep 27 2017 08:42:15) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

# mod_sslのインストール
[root@localhost vagrant]$ yum -y install mod_ssl
```

ここからはviコマンドで設定ファイルを変更します。
```vi [触るファイル]```

この機会によく使うコマンドは覚えましょう。

```bash:
# 検索
/[検索する文字列]
# インサートモード
i
# インサートモードの終了
Esc
# 保存しないで終了
:q!
# 保存して終了
:wq
```

### 各種設定ファイルを変更

```apache:/etc/httpd/conf/httpd.conf
# ドキュメントルートの設定を変更
DocumentRoot "/var/www"
<Directory "/var/www">

# CSSが反映しない場合があるのでOFFに
EnableSendfile off

#httpからhttpsへリダイレクトするように。一番下部に追記。
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{SERVER_PORT} !^443$
	RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
```
```bash:/etc/php.ini
# これをOnにしとかないとphpinfo()が真っ白になっちゃったよ...
short_open_tag = On
mbstring.language = Japanese  
mbstring.internal_encoding = UTF-8  
mbstring.http_input = UTF-8
```

### Apacheの再起動と自動起動を設定
ついでにApacheのインストールで出来た不要なフォルダを消しておきましょう

```bash:
[root@localhost vagrant]$ /etc/init.d/httpd restart
[root@localhost vagrant]$ /sbin/chkconfig httpd on

# 不要ファイル削除
[root@localhost vagrant] rm -rf /var/www/cgi-bin
[root@localhost vagrant] rm -rf /var/www/html
[root@localhost vagrant] rm -rf /var/www/error
[root@localhost vagrant] rm -rf /var/www/icons
```

ここで一度phpinfo();を出力してPHPが問題なく動作しているかとhttpsでアクセス出来るか、リダイレクトが動作しているかを確認してみる。

```bash:
[root@localhost vagrant]$ vi /var/www/info.php
```
```php:/var/www/info.php
<? phpinfo(); ?>
```

ここで[http://192.168.33.10/info.php](http://192.168.33.10/info.php)にアクセスすると*PHP Version 7.1.10*と表示されhttpsにリダイレクトされればOKです。

# STEP.3 WordpressとMySQLのインストール
Wordpressは[WP-CLI](http://wp-cli.org/ja/)を利用する

```bash:
# WP-CLIのインストール。公式のとおりに。
[root@localhost vagrant]$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
[root@localhost vagrant]$ chmod +x wp-cli.phar
[root@localhost vagrant]$ mv wp-cli.phar /usr/local/bin/wp

# ルートユーザーでWordpressをインストール(パスを通すかrootから抜けて実行でも可能)
[root@localhost vagrant]$ sudo -u vagrant -i -- wp core download --locale=ja --path=/var/www/

# MySQLのインストール
[root@localhost vagrant]$ rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
[root@localhost vagrant]$ yum -y install mysql-community-server
```

## MySQLのパスワードを変更する

### MySQLの設定(my.cnf)を変更

```bash:/etc/my.cnf
[mysqld]
default_password_lifetime = 0
character-set-server=utf8
collation-server = utf8_general_ci
skip-character-set-client-handshake

[mysql]
default-character-set=utf8
```

### MySQLの立ち上げ(--skip-grant-tablesオプションあり)

```bash:
# 設定ファイルの所有権を変更
[root@localhost vagrant]$ chmod 644 /etc/my.cnf
# パスワードを回避してMySQLを開始
[root@localhost vagrant]$ service mysqld start --skip-grant-tables
[root@localhost vagrant]$ mysql
```

### 仮パスワードに変更する

```mysql:mysql>
mysql> use mysql;
mysql> UPDATE user SET authentication_string=password('root') WHERE user='root';
mysql> CREATE DATABASE wordpress;
mysql> flush privileges;
mysql> quit
```

### MySQLを再起動と自動起動を設定

```bash:
[root@localhost vagrant]$ service mysqld restart
[root@localhost vagrant]$ chkconfig mysqld on
```

# STEP.4 Wordpressの設定と構築完了まで

### 先程設定した仮パスワードで再度ログイン

```bash:
# パスワードを聞かれるので「root」でログインする
[root@localhost vagrant]$ mysql -u root -p
```

### パスワードのルールが厳しいので緩くする

```mysql:mysql>
mysql> SET GLOBAL validate_password_length=4;
mysql> SET GLOBAL validate_password_policy=LOW;
mysql> set password for root@localhost=password('root');
mysql> flush privileges;
mysql> quit
```
MySQLのパスワード変更がややこしいが、これはデフォルトパスワードがlogに記載されているのを回避するためと、パスワードのvalidate_password_policyが高いのでlowに変更する手順を踏んでいるため。この辺りも今後の課題としたい。

### WP-CILを利用してDBの設定とwp-configを設定
```bash:
#wp-config.phpの生成
sudo -u vagrant -i -- wp core config --dbname='wordpress' --dbuser='root' --dbpass='root' --dbhost='localhost' --path='/var/www/'

#dbの作成
sudo -u vagrant -i -- wp core install --url='https://192.168.33.10' --title='Sample Wordpress' --admin_user='root' --admin_password='root' --admin_email='admin@email.jp' --path=/var/www/
```

これで下記で管理画面に入ることが出来る

|ログイン|https://192.168.33.10/wp-login.php
|---|---
|ユーザー名|root
|パスワード|root

|データベース|MySQL
|---|---
|サーバー|localhost
|ユーザー名|root
|パスワード|root
|データベース|wordpress

# 自動化
これまでのコマンドをまとめてシェルスクリプトにして、```vagrant up```の時に実行されるようにまとめてみた。
provisonってすごく便利ですね。

https://github.com/hanuman6/vagrant-wordpress

ただ、STEP.4以降が結局```vagrant ssh```して手動でやらないと行けないので、もう少しMySQLを勉強して完全に自動化したい。-eオプションでうまく行かず...


# 課題
- やはりCentOS7を利用したい
- WP-CLIとMySQLのをもう少しなんとかしたい。
- nginx(php-fpm)対応版とかもやってみたい。
- いろいろきっと無駄が多い...
- そしてセキュリティ...