Nginx入りのWindows ServerにWordPressを導入する件

# 背景
イントラ内のWindows Server上で動作させているアプリがあり、その使い方を社内ユーザ向けに説明するマニュアルを作成したかったのですが、いちいちWordでマニュアルとか書いてられないので、WordPressを使うことになりました。

「WordPressのインストール？　そんなもん余裕でしょ」
と思ってたのですが、全然余裕ではなく、むしろかなり手間取ったので:japanese_goblin:
ここに顛末を記します:pencil:

# 今回の環境
- OS: Windows Server 2012 R2　【構築済み】
- Nginx: v1.13.12　【構築済み】
- WordPress: v4.9.6
- PHP: v7.2.6 NTS(non thread safe版)
- MySQL: v8.0.11
- Python: v2.7.15

思えば、Apacheじゃなく、Nginxだけが先に入っているという時点で、普通じゃないと少し警戒しておくべきだったのかもしれない…

# 作業
## インストール順
もし「今から素のWinに入れ直せ」って言われたら、たぶん以下の順にします
1. Python
2. PHP
3. MySQL
4. WordPress
5. Nginx
 
## インストール
### Python
Download Pythonから入手可能
https://www.python.org/downloads/

ウィザードに従って入れていくだけなので、特に苦労はない

### PHP
#### バイナリ入手
PHP for Windowsから入手可能
https://windows.php.net/download/
- NginxやIISの場合は「Non Thread Safe」を選ぶこと
- Apacheなら「Thread Safe」で問題なし

#### インストール
既に多くの情報がWebにあるので、それらを参考にすれば難しくない
- 任意のフォルダに展開
- php.iniを作成
- 環境変数 PATH を設定

#### ハマりどころ
extension系の設定を追加
Webの情報だと「コメント “;” を削除」と書いてあったが、
私のものには書かれていなかったので、都度追記

    extension_dir = “ext”
    extension=php_mbstring.dll
    extension=php_mysqli.dll

#### 動作確認
    <?php
     phpinfo();
    ?>

### MySQL
これが一番面倒だった
※インストール時にPython 2.7を使うので、先に入れておくこと

#### バイナリ入手
MySQL :: Download MySQL Installerから入手
https://dev.mysql.com/downloads/installer/
Community > Windows > Installer の順に手繰っていく

32bit用のしか無いように見えるが、実際には64bit環境でも同じインストーラを利用可能
オフライン版（サイズの大きい方）を選んでおけば、ネットが繋がらない環境でも問題なし

なお「Oracleのユーザアカウント」を作ることを促されます
- いらない場合は無視
- Oracle JDK入手などにも使えるアカウントなので、必ずしも無駄になるかと言われると…

#### インストール
ダウンロードした.msiを実行
面倒なら「Developer Default」で問題なしですが、インストールフォルダを変えたければ、「Choosing a Setup Type」で「Custom」を選ぶ必要がある
（なぜフォルダを選ぶだけで「カスタム」なんだ…）

#### データベースとユーザを作る
MySQLに繋ぐ

    > mysql -u root -p`
MySQL内で以下の操作

    mysql> CREATE DATABASE test_db;`
    Query OK, 1 row affected (0.06 sec)
    mysql> CREATE USER 'testman'@'localhost' IDENTIFIED BY 'test123';
    Query OK, 0 rows affected (0.11 sec)
    mysql> GRANT ALL ON test_db.* to 'testman'@'localhost';
    Query OK, 0 rows affected (0.08 sec)`

#### ユーザの認証方式を変更
WordPressから、MySQLを呼び出す際には以下の設定が必要
**MySQL 8.0以降のみで発生するため、Web上にはほとんど情報がない**

現在作成済みユーザの一覧を表示すると

    mysql> select user,host,plugin from mysql.user;
    +------------------+-----------+-----------------------+
    | user             | host      | plugin                |
    +------------------+-----------+-----------------------+
    | mysql.infoschema | localhost | mysql_native_password |
    | mysql.session    | localhost | mysql_native_password |
    | mysql.sys        | localhost | mysql_native_password |
    | root             | localhost | caching_sha2_password |
    | testman          | localhost | caching_sha2_password |
    | wpman            | localhost | mysql_native_password |
    +------------------+-----------+-----------------------+
    6 rows in set (0.00 sec)

となるが、ここで `caching_sha2_password` はMySQL 8.0からサポートされた認証プラグインで、このままだと、`testman` がWordPressからMySQLに対して参照することができません。

一番簡単な方法は、`wpman` のように `mysql_native_password`にしておくことのようです。
詳しくは[mysql8-0におけるデフォルトの認証プラグインの変更](http://variable.jp/2018/02/23/mysql8-0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E8%AA%8D%E8%A8%BC%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E5%A4%89%E6%9B%B4/) を参照のこと。

### Nginx
Nginxは、ご存知の通りWebサーバだけでも使えるため、今回はたまたま先に入っていた
ただ、WordPressを後から入れると結構手間がかかるようなので、一緒に使うことが分かっているならWordPressから入れたほうが良いようです
（頑張ればどちらでもいけるんですが）

#### バイナリ入手
nginx: downloadから入手
https://nginx.org/en/download.html
基本的に「Mainline version」を選ぶ

#### インストール
任意のフォルダに置く
コマンドプロンプトでカレントに移動し、

    > start nginx 

で、Webサーバ起動

http://localhost/ にアクセスし、「Welcome to nginx!」と表示されることを確認

#### Config設定
既に多くの情報がWebにあるので、それらを参考に

- `\cong\nginx.conf` が変更対象
- コメント `#` を外し、機能を有効化
 - 拡張子 *.php のところ（今回はPHPを使うので）
 - log_format, access_log, error_log
- `server` の `listen` を実際に使うポート番号に変更すること（たとえば `8088`）
（余談ですが、Webサーバを持つアプリを複数入れると「80xx」がだんだん衝突しだしますよね…）

#### 起動/終了バッチファイル作成
既に多くの情報がWebにあるので、それらを参考に

- PHPは、FastCGI(9000/tcp)を使う設定
- 終了時も必ずバッチファイルで落とすこと

#### 運用時
公開ファイルはとりあえず `.\html` 以下にどんどん置いていけばよい

# おわりに
既存の環境に何かを足しこむのは難しいです:frowning2:
特に、今回ハマったのはMySQL8が割と新しいために、関連する情報がWebになかったことです。
ただ、時間をかけて探した結果、リンク先の文章があったのでだいぶ救われました:relaxed:
やはりWeb上に知見を残していくことは、後から来た誰かにとって有益になるのだと思います。

[羽生さん](https://ja.wikipedia.org/wiki/%E7%BE%BD%E7%94%9F%E5%96%84%E6%B2%BB) 風に言えば、高速道路を敷くイメージですね:red_car:

これからも誰かの知の高速化に役立てるような記事を書いていきたいと思いました
（おわり）