Alibaba Cloud上でWordPressワークフローを実装 〜Ubuntu 16.04サーバのプロビジョニングとセキュア化〜

このチュートリアルシリーズでは、**Alibaba Cloud** LEMPインスタンス上で**WordPress**の最新の開発とデプロイのワークフローを実装するためのプロセスについて説明します。

[Alibaba Cloud Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)執筆者のJeff Cleverleyによるものです。[Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)は、技術的な知識やベストプラクティスをクラウドコミュニティ内で共有することを奨励するAlibaba Cloudのインセンティブプログラムです。

このシリーズのチュートリアルでは、LEMP（Linux、Nginx、MariaDB、PHP）がインストールされた[Alibaba Cloud Elastic Compute Service](https://www.alibabacloud.com/product/ecs?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)（ECS）インスタンス上でWordPressの最新の開発とデプロイのワークフローを実装します。このワークフローでは、本番サイトと並行して、ステージング環境とローカル開発環境を作成し、利用します。本番サイトを更新する前に、<>Git バージョン管理システムを使用して、変更をテスト用にステージング環境にプッシュします。パート1では、ステージングサイトのサブドメインを作成して確保します。

本番サイトと同じサーバーにステージングサイトを作成します。微調整を加えれば、このガイドの手順を使って、別のサーバーにデプロイするためのステージングサイトを設定することができます。

今回のチュートリアルは、LEMPスタックにWordPressをセットアップする方法を指示した前回の5つのチュートリアルに続きます。これらは以下の通りです。

1、[パート1 - Ubuntu 16.04サーバのプロビジョニングとセキュリティ確保](https://www.alibabacloud.com/blog/WordPress-with-LEMP-on-Alibaba-Cloud-%E2%80%93-Part-1-Provision-and-Secure-an-Ubuntu-16-04-Server_p247776?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)
2、[パート2 - LEMPスタックの完成](https://www.alibabacloud.com/blog/WordPress-with-LEMP-on-Alibaba-Cloud-%E2%80%93-Part-2-Completing-the-LEMP-Stack_p278805?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)
3、[パート3 - ドメインの設定とSSLを暗号化しよう](https://www.alibabacloud.com/blog/wordpress-with-lemp-on-alibaba-cloud--part-3-configuring-a-domain-and-lets-encrypt-ssl_278924?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)
4、[パート4 - WordPressのインストール](https://www.alibabacloud.com/blog/WordPress-with-LEMP-on-Alibaba-Cloud-%E2%80%93-Part-4-Installing-WordPress-on-Your-Alibaba-Cloud-ECS-Instance_p280963?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)
5、[パート5 - ダイレクトメールを使用したトランザクション電子メール](https://www.alibabacloud.com/blog/WordPress-with-LEMP-on-Alibaba-Cloud-%E2%80%93-Part-5-Using-DirectMail-for-WordPress-Transactional-Email_p287645?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)
今回のチュートリアルで使用したライブサイトは、`/var/www` ディレクトリ内の独自のディレクトリに作成され、`/etc/nginx/sites-available/` ディレクトリ（`/etc/nginx/sites-enabled/` ディレクトリにシンボリックリンクされている）内にある独自の Nginx 設定ファイルを使用している点で、上記のチュートリアルとは異なります。以前のチュートリアルでは、WordPress のサイトファイルは `/var/www/` ディレクトリ内にあり、そのディレクトリに適した `/etc/nginx/sites-available/default` 設定ファイルを使用していました。

つまり、このステップバイステップガイドとこのチュートリアルの方法論は、必要なコンポーネントがすべてインストールされていると仮定して、WordPress 用のどの LEMP スタックでも動作します。設定ファイルにはわずかな違いがあるかもしれませんので、読者の側で変更が必要になるかもしれませんが、完成を妨げるものではありません。

このチュートリアルのすべての指示は、必要に応じてsudoコマンドを使って、私のスーパーユーザである’`new_user`'によって発行されます。チュートリアルのコマンドを自分で発行する場合は、私のスーパーユーザを自分のスーパーユーザに置き換えてください。

チュートリアルの例では、メインサイトドメインとして「`another-example-domain.com`」を、ステージングサイトドメインとして「`staging.other-example-domain.com`」を使用していますが、関連するファイルやコマンドの中で、これらを自分のサイトドメインとステージングサイトドメインに置き換えることを忘れないようにしてください。

#ステップ1. ステージングサイトデータベースの作成
SSHでサーバにログインします（私のスーパーユーザとドメインを自分のものに置き換えることを忘れないでください）。

```
$ ssh new_user@another-example-domain.com
```

スーパーユーザーとしてMySQLデータベースにログインします。

```
$ sudo mysql -u root -p
```

これらのチュートリアルでは、MySQLの代わりにMariaDBをドロップインで使用していますので、MariaDBモニターからの歓迎を受けて、コマンドプロンプトがMariaDBプロンプトに変わります。

WordPressのステージングサイトに必要なデータベースを作成します。

以下のMySQLコマンドで行います。


```
CREATE DATABASE staging DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci.
```

MariaDBモニタから「クエリOK」応答が表示され、対象となる行とクエリの処理時間が表示されます。これは、「staging」データベースが正常に作成されたことを示しています。

データベースのユーザーとパスワードを作成し、そのユーザーに「staging」データベースへのすべてのアクセスを許可します。

```
GRANT ALL ON staging.* TO 'new_user'@'localhost' IDENTIFIED BY 'new_users_password’.
```

もちろん、私のシンプルなパスワードは、あなた自身の安全なパスワードに置き換えてください。では、特権をフラッシュします。

```
FLUSH PRIVILEGES
```

そして、MariaDBを終了します。

`EXIT`

あなたの端末はこのようになっているはずです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/1db80a2d-9ebc-a2dd-e5e9-8012fe52310e.png)

#ステップ2. ステージングサイトのサブドメインとDNSを設定する
Alibaba Cloud Console Homeにログインし、メインの「製品とサービス」パネルの「ドメインとウェブサイト」セクションにあるリンクをクリックして、Alibaba Cloud DNSパネルにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/35d0732a-53f4-0b92-703f-36d3ca48eb0a.png)

あなたのウェブサイトのメインドメインがリストに表示されます。設定をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/19c13436-83ee-5bd7-2cb9-8994dd39a99b.png)


「レコードの追加」をクリックして、ステージングドメインの新しいDNSレコードを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/793b36ff-0c48-9b0a-d0eb-f3f91e9e7274.png)

「ステージング」ホストに新しい「A」レコードを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f014fc98-711c-0ef8-3619-0cf6d70fad52.png)

#ステップ3. ステージングサイトのサブドメインにサービスを提供するためにNGINXを設定する
サーバー上で、メインの本番ドメイン用の Nginx 設定ファイルをコピーし、それをステージングサブドメインの名前にリネームします。

```
$ sudo cp /etc/nginx/sites-available/another-example-domain.com /etc/nginx/sites-available/staging.another-example-domain.com
```

`etc/nginx/sites-available/`ディレクトリにある、ステージングサイトで新たに作成したNginx設定ファイルを、`/etc/nginx/sites-enabled/`ディレクトリにシンボリックリンクを作成します。

```
$ sudo ln -s /etc/nginx/sites-available/staging.another-example-domain.com /etc/nginx/sites-enabled/staging.another-example-domain.com
```

`etc/nginx/sites-enabled/` ディレクトリに `cd` して、`ls` コマンドで含まれるすべてのファイルをリストアップすると、ターミナルは以下のようになるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5110a1c1-57ed-c813-bf3f-3339b89c1903.png)


新しく作成した設定ファイルをroot権限で編集用に開きます。

```
$ sudo nano /etc/nginx/staging.another-example-domain.com
```

このファイルはメインサイトのNginx設定ファイルの直接コピーなので、ドメインの'root'フォルダと'server_name'の設定が含まれています。これらの設定を変更する必要があります。

変更:

```
root /var/www/another-example-domain.com.
server_name another-example-domain.com www.another-example-domain.com;
```

こちらへ:

```
root /var/www/staging.another-example-domain.com;
server_name staging.another-example-domain.com;
```


設定ファイルには、Certbotによって設定されたメインサイトのLet's Encrypt SSL証明書とHTTPS実装のためのいくつかのディレクティブも含まれています - これらは「# managed by certbot」とマークされています。これらをすべて削除してください。後に、ステージングサイト用に別のSSL証明書を発行するためにCertbotを使用し、正しいディレクティブを再度追加します。

これで、ステージングサイトのサブドメイン用のNginx設定ファイルは以下のようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/aa9adb5c-6ea1-2ba4-cea0-63d1acc5d7ec.png)

Nginxの設定ファイルを編集する際には、以下のコマンドで構文のエラーを確認することを忘れないようにしましょう。

```
$ sudo nginx -t
```

問題がなければ、Nginxをリロードします。

```
$ sudo systemctl reload nginx
```

#ステップ4. ステージングサイトサブドメインのSSL証明書を暗号化して発行する
Certbotを既にインストールしている場合は、次のセクションを無視して次のセクションに進んでください。または、HTTPSを使用することで推奨されるセキュリティに興味がなく、HTTP2の付加的な利点を享受したくない場合は、このステップを完全に無視して、ステップ5に進んでください。

Certbotをまだインストールしていない場合は、外部リポジトリを'apt'パッケージマネージャに追加するために必要なパッケージをインストールする必要があります。以下のコマンドで行ってください。

```
$ sudo apt-get install -y software-properties-common
```

これで'certbot'をインストールすることができます。

certbot' リポジトリを追加します。

```
$ sudo add-apt-repository ppa:certbot/certbot
```

「apt」パッケージリストを更新して、新しいリポジトリのパッケージ情報をピックアップします。

```
$ sudo apt-get update
```

そして最後に「certbot」をインストールします。

```
$ sudo apt-get install python-certbot-nginx
```

これらのコマンドが完了したら、次のセクションに進み、'certbot'を使ってSSL証明書を発行することができます。

しかし、私は以下のコマンドに従ってメインサイトのSSL証明書を発行することをお勧めします。[このチュートリアル](https://www.alibabacloud.com/blog/wordpress-with-lemp-on-alibaba-cloud--part-3-configuring-a-domain-and-lets-encrypt-ssl_278924?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)で手順を踏んでいくのが良いと思います。

###既にサートボットをインストールしている場合
メインサイトドメイン用のSSL証明書を発行するためにLet's Encrypt Certbotをインストールしたと仮定して、プロセスを繰り返して、ステージングサイトサブドメイン用の別の証明書を発行するのは非常に簡単です。

ステージングサイトサブドメイン用のSSL証明書を発行するには、以下のコマンドを実行してください。

```
$ sudo certbot --nginx -d staging.other-example-domain.com
```

証明書を登録するためのメールアドレスと、HTTPSリダイレクトを有効にするかどうかを尋ねてきます。

すべてが適切に設定されていると仮定すると、証明書が作成され、サートボットは必要なディレクティブをステージングサイトのサブドメインNginx設定ファイルに追加します。これらのディレクティブは、HTTPSリダイレクトを有効にした場合には、HTTPSリダイレクトのためのディレクティブと一緒に、NginxがHTTPSでサイトを提供することを可能にします。

ドメインは現在 SSL で保護されており、HTTPS で提供されていますが、まだ弱い Diffie-Hellman パラメータを使用しており、初期の鍵交換が本来あるべきものよりも脆弱であることを意味しています。

これを修正するには、新しい 'dhparem.pem' ファイルを作成し、NGINX 設定ファイルの certbot 管理の 'ssl_dhparam' ディレクティブを独自のものに置き換えます。

「openssl」を使って新しいファイルを作成します。

```
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
```

時間がかかるかもしれません。ビット数を2048から4096に調整することでセキュリティを向上させることができますが、それに伴って時間がかかる可能性があります。

ステージングサイトのNginx設定ファイルをroot権限で開きます。

```
$ sudo nano /etc/nginx/sites-available/staging.another-example-domain.com
```

certbotが管理している'ssl_dhparam'ディレクティブを探して削除し、代わりに以下のディレクティブを追加します。

```
ssl_dhparam /etc/ssl/certs/dhparam.pem.
```

これで設定ファイルは以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c426e711-cbd6-e07c-3837-be15df5acc85.png)

Nginxの設定ファイルに構文エラーがないか確認し、問題がなければリロードすることを忘れないようにしましょう。

```
$ sudo nginx -t
$ sudo systemctl reload nginx
```

#ステップ5. WordPressステージングサイトのディレクトリを作成する
`var/www/` ディレクトリ内にステージングサイト用のサイトルートディレクトリをまだ作成していません。

ステージングサイトを作成するには、2つの方法があります。チュートリアルパート2とパート3では、それぞれ異なる方法をご紹介します。

1、[パート2 - デュプリケータとSFTPを使用したステージングサイトとローカルサイトの作成](https://www.alibabacloud.com/blog/implementing-a-modern-wordpress-workflow-on-alibaba-cloud---part-2_593797?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)
2、[パート 3 - ターミナルと WPCLI を使用したステージングとローカルサイトの作成](https://www.alibabacloud.com/blog/implementing-a-modern-wordpress-workflow-on-alibaba-cloud---part-3_593798?spm=a2c65.11461447.0.0.1faa18deDZ5pfO)
次の2つのチュートリアルでこれらの処理を終えた後、最後のチュートリアルではGitを使ったバージョン管理のデプロイのワークフローを作成していきます。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/implementing-a-modern-wordpress-workflow-on-alibaba-cloud---part-1_593796)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*