DockerにてWordPressを構築する（リバースプロキシの学習も）

# やりたいこと

DockerにてWordPressを構築し、ブラウザから80番ポートでアクセスしたい。

**ただし、ホスト側でもApacheを使っているため、WordPressコンテナを80番ポートに紐づけるわけにはいかない。**

ということで、WordPressコンテナは8080番ポートに紐づけます。
そしてWordPress用のサブドメインを切って、そこに来たアクセスをホスト側のApacheでlocalhostの8080番ポートにリバースプロキシするようにする。

<details><summary>経緯（自分用メモなので、読みたい人だけどうぞ）</summary>
<div>経緯としては、

- サーバにWordPressを導入したい
- Dockerで構築しようと、ネットで調べると、すぐ方法はでてくるが、どのサイトのサンプルもポート番号が8080とか。
- 80番でWordPressを起動したいが、ホスト側でもすでにApacheを使っていて、80番は使えない！
- そこでバーチャルホストを使おうとする。
- WordPressコンテナ内のHTMLは永続化のため、ボリュームマウントしてあるから、そのディレクトリ`/var/lib/docker/volumes/wordpress_v-wordpress-html/_data`をバーチャルホストで指定してみる。
- うまくいかない
- WordPressコンテナ内のApacheで何か設定がしてあるっぽいから、これを飛ばして直接アクセスするのは微妙
- じゃあホスト側のApacheをプロキシとして、localhostの8080番に飛ばせばいいのでは

こんな感じになります。
</div></details>


# 前提

OS：CentOS8
Docker：20.10.7
docker-compose：1.27.4
Apache：2.4.37

この辺は既に入っている前提でやります。

# WordPress

まずはDockerコンテナ内でWordPressを構築します。

Docker-ComposeのファイルにWordPress, MySQL, phpMyAdminを記述します。


```docker-compose.yml
version: "3"
services:
  db:
    image: mysql:5.7
    volumes:
      - v-wordpress-db:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_pass_fB3uWvTS
      MYSQL_DATABASE: wordpress_db
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_user_pass

  wordpress:
    image: wordpress:latest
    volumes:
      - v-wordpress-html:/var/www/html
      - v-wordpress-php:/usr/local/etc/php/conf.d/php.ini
    restart: always
    depends_on:
      - db
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress_db
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: wp_user_pass

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    restart: always
    depends_on:
      - db
    ports:
      - 8888:80
volumes:
  v-wordpress-db:
  v-wordpress-html:
  v-wordpress-php:
```


下記コマンドでコンテナを起動します。

```
docker-compose up
```

これでブラウザから`http://mydomain:8080`にアクセスすればWordPressが表示されるはずです！
もしできない場合は、コンテナがうまく起動していないのか、ファイアウォールなどで8080へのアクセスを制限している可能性があります。

# Apache（リバースプロキシ）

続いてApacheの設定を行います。

現状、`mydomain`へのアクセスはこうなっていると思います。
- `http://mydomain` -> もともとのサイト
- `http://mydomain:8080` -> WordPress

それをサブドメインを使って、こうします。
- `http://original.mydomain` -> もともとのサイト
- `http://wp.mydomain` -> WordPress

Apacheの設定ファイルがあるディレクトリに移動します。
だいたい`/etc/httpd/conf.d`だと思います。

そこにファイルを2つ作ります。

### original.mydomain（もともとのサイト）

```original.mydomain.conf
<VirtualHost *:80>
    ServerName original.mydomain
    DocumentRoot "/var/www/html/original.mydomain"

    <Directory "/var/www/html/original.mydomain">
        Options FollowSymLinks
        AllowOverride All
        Order deny,allow
        Allow from all
    </Directory>

    ErrorLog logs/original.mydomain-error_log
    CustomLog logs/original.mydomain-access_log combined
</VirtualHost>
```

もし`/var/www/html/`にもともとのサイトがある場合は、`/var/www/html/original.mydomain/`に移し替えましょう。

`http://original.mydomain`にアクセスしてみてください。
元のサイトが表示されていればOKです。

### wp.mydomain（WordPress）

```wp.mydomain.conf
<VirtualHost *:80>
    ServerName wp.mydomain
    ProxyPass / http://localhost:8080/
</VirtualHost>
```

ProxyPassディレクティブでプロキシを設定します。
よくProxyPassと一緒にProxyPassReverseというのを見るかもしれませんが、これはプロキシ先がリダイレクトを発行するときに必要になってくるようなので、今回は不要です。



これで設定は終わりです。

`http://wp.mydomain`にアクセスしてみてください。
WordPressが表示されていれば成功です！

# 最後に

Apacheのバーチャルホストやプロキシの勉強になってよかったです。
他にいい方法あれば教えてください。