ApacheのリバースプロキシとDocker-Composeを使ってSSL対応のWordPressを配置した話

# はじめに
僕がやってるPSO2っていうオンラインゲームがあるんですけどそのチームのWebページを作ったときの話です。
Ubuntu 18.04にApacheとDockerとDocker-composeをインストールして運用してます。
ほぼ自分への備忘録なのであんまり参考にしないほうがいいと思います。

# とりあえずいろいろインストール
まずはApacheとDockerとDocker-composeがないと始まりません。

```shell
# apt install apache2
# apt install docker docker-compose
```
Ubuntu18.04だとリポジトリ追加しなくてもdockerのインストールできるっぽいですね・・・。

# Apacheの設定
リバースプロキシの設定の前にApacheの設定をします。

## ディレクトリを表示しないようにする
URLで存在しないページを指定した場合そのディレクトリが表示されてしまいます。下みたいな感じに表示される機能ですね。

![フォルダ.png](https://qiita-image-store.s3.amazonaws.com/0/247786/58d91ea8-134d-f2ba-2fb1-152ac520fd26.png)

これだとセキュリティ的にあまりよろしくないので表示しないようにする設定です。

```shell
# vim /etc/apache2/apache2.conf
```
上記コマンドでapache2.confを開き(ここではvimを使ってますがお好きなテキストエディタを使ってください)、<Directory /var/www>のセクションで

```:apache2.conf
Options Indexes FollowSymLinks
```
となっているところを

```:apache2.conf
Options FollowSymLinks
```
とします。

## /var/www/htmlを表示させない
apacheインストールしてアクセスすると表示されるあのテストページを表示されないようにします。

```shell
vim /etc/apache2/sites-enabled/000-default.conf
```
で000-default.confファイルのDocumentRootの前に#をつけてコメントアウトします。
あと、<Location />のセクションを以下のようにします。なかったら追加してください。

```:000-default.conf
<Location />
   Order deny,allow
   Deny from All
</Location>
```

## バーチャルドメイン・リバースプロキシの設定
さっきホストでインストールしたapacheをリバースプロキシにしてdockerコンテナにつなげるのでそれの設定です。
/etc/apache2/sites-enabledにvirtualdomain.confを作成し、そこにリバースプロキシの設定を書き込みます。

```:virtualdomain.conf
<VirtualHost *:80>
   ServerName ドメイン名
   ProxyRequests On
   ProxyPass / http://[ホストのIPアドレス]:8080/
   ProxyPassReverse / http://[ホストIPアドレス]:8080/
</VirtualHost>
```
[ホストのIPアドレス]ってところはlocalhostでも127.0.0.1でも::1でもいけると思うけど自分の環境だとなぜかいけない・・・

最後にapacheを再起動します。

```
# systemctl restart apache2
```

#Docker-ComposeでWordPressのコンテナを作成
まずはdocker-compose.ymlを書きます。

```yml:docker-compose.yml
version: '2'
services:
   database:
      image: mysql:5.7.24
      container_name: database
      env_file: .env
      volumes:
         - db-data:/var/lib/mysql
   wordpress:
      image: wordpress:latest
      container_name: WordPress
      ports:
         - "8080:80"
      links:
         - database
      volumes:
         - ./html:/var/www/html
      environment:
         WORDPRESS_DB_HOST: "database:3306"
      env_file: .env
volumes:
   db-data:
```
環境変数のファイルは.envとして別に記述して、docker-compose.ymlと同じ場所に置きます。

```:.env
WORDPRESS_DB_NAME=wordpress_database
WORDPRESS_DB_USER=worduser
WORDPRESS_DB_PASSWORD=password

MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wordpress_database
MYSQL_USER=worduser
MYSQL_PASSWORD=password
```
データベースのユーザー名とパスワードは適当に変えてください。

#Docker-ComposeでWordPressのコンテナを作成（自分流)
ここは自分の環境のやり方なので興味がある人だけ読めばいいと思います。
データベースとwordpressが動くサーバを自分の環境では別々のサーバで動かしているのでデータベースとHTTPサーバのIPアドレスが異なります。そこで、docker-compose.ymlは自分ではこのように書いてます。

```yml:docker-compose.yml
version: '2'
services:
   wordpress:
      image: wordpress:latest
      container_name: WordPress
      ports:
         - "8080:80"
      volumes:
         - ./html:/var/www/html
      environment:
         WORDPRESS_DB_HOST: "[データベースIPアドレス]:3306"
      env_file: .env
```
.envファイルは上のと同じです。(Mysql関連の環境変数は消してもいいかも)

# コンテナを立ち上げよう
コンテナを立ち上げるだけです。

```shell
$ docker-compose up -d
```

最初はイメージとかダウンロードするので時間がかかるのでバウムクーヘンでも食べながらまったりお待ちください。
立ち上がるとapacheのバーチャルドメインで設定したドメイン名でWordPressの設定画面が表示されると思うので適当にWordPressの設定をしてください。

# SSLへの対応
WordPressをSSLに対応させると絶対パスで指定してるところがhttpsでなくなります。そこで、WordPressの以下のプラグインをインストールすることでWordPressがSSLに対応します。
https://ja.wordpress.org/plugins/really-simple-ssl/

## Let's Encryptで証明書取得
ここからはルーターのポートのTCP 80番と443番が空いてないとできないと思います。ルーターのポートフォワードが設定されているかを確認してください。
まず、certbotをインストールします。

```shell
# apt install certbot
```
次に以下のコマンドを実行してcertbotでLet's Encryptの証明書を取得します。

```shell
# certbot
```
いろいろ聞かれると思いますが適当に答えれば証明書がもらえると思います。
最後にhttpでアクセスしてきた場合もhttpsにリダイレクトするか的な質問もあると思うのでyesを選んでおけばhttpsを強制できます。

# まとめ
多分これでDockerコンテナを使ってSSL対応WordPressを動かすことができます。自分はこれでいけました。