WordPress + StaticPress S3で静的WebサイトをS3でホストする

#**概要**
##何ができるのか
![wp-s3.png](https://qiita-image-store.s3.amazonaws.com/0/80392/ba743427-1423-339e-8e13-1d0949f13fba.png)

* WordPressの「StaticPress S3」プラグインを使うことで、WordPressサイトの静的コンテンツをAmazon S3でWebホスティングすることができます
* WordPressは静的コンテンツを吐き出すだけなので、サーバスペックは最低限でOKです
* イベントサイトなどの永代供養に最適です
* メールフォームなどPOSTを伴うコンテンツやGetによる検索クエリは利用できません。CloudFrontを利用しましょう<BR>
[WordPressサイトをCloudFrontで配信する](http://qiita.com/Ichiro_Tsuji/items/38592e737257cb45ca13)

＜参考＞JAWS-UG京都 第5回勉強会登壇スライド
[ヤフー砲も怖くない!? WordPressとS3で落ちない コーポレートサイトを立ち上げよう](http://www.slideshare.net/mobile/ichiroohkini/word-presss3-54226328)

##前提条件
* WordPressのインストールが完了していること。本手順は、AMIMOTO AMI(Apache HTTPD PHP7)の環境が前提となっていますので、他の環境では期待通りの動作をしない可能性があります<BR>
http://qiita.com/Ichiro_Tsuji/items/88f9009f80f3439ad9fa
* WordPressサーバにSSHでアクセスできること
* S3のバケットがWeb公開できる状態になっており、APIアクセス用のKeyが取得できていること<BR>
http://qiita.com/Ichiro_Tsuji/items/c174d580587a622d3358
* 手順中に登場するFQDN(サイトのURL)は下記の通りです。ご自分の環境に合わせて読み替えて下さい

```
Wordpressサイト    -> wp.jaws-ug.tk
S3バケットのWeb公開 -> s3.jaws-ug.tk
```

* 独自ドメインをもっていない場合は下記の通り読み替えて下さい

```
Wordpressサイト    -> WordPressサーバのPublic DNS
S3バケットのWeb公開 -> S3バケットのEndpoint
```

#**プラグインをインストールする**
##StaticPress S3プラグイン
* WordPressサーバにSSHでアクセスし、下記コマンドを実行する<BR>
※ SSH接続できない場合は[**こちら**](http://qiita.com/Ichiro_Tsuji/items/88f9009f80f3439ad9fa#sshクライアントでコンソールにアクセスできることを確認する)<BR>
※ `i-xxxxxxxx`は、AMIMOTO AMIインストール時に指定したインスタンスID。`i-`まで入力してTabキーで補完してもよい

```
$ cd /var/www/vhosts/i-xxxxxxxx/wp-content/plugins
$ sudo git clone https://github.com/megumiteam/staticpress-s3.git
$ sudo chown -R nginx:nginx staticpress-s3
```
##StaticPressプラグイン
* WordPressダッシュボードを開く
* [プラグイン] -> [新規追加]
* 「staticpress」で検索し、[今すぐインストール]をクリックする
![スクリーンショット 2016-02-07 13.43.27.png](https://qiita-image-store.s3.amazonaws.com/0/80392/4db1fab2-3c83-4183-2025-0d163fdd3c68.png)

##プラグインの有効化／停止
* [プラグイン]をクリックする
* Nginx Cache Controllerの[停止]をクリックする
* StaticPressの[有効化]をクリックする
* StaticPress S3の[有効化]をクリックする
![スクリーンショット 2020-05-26 18.11.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80392/c608e436-e472-9056-ad48-022fccc0f888.png)


#**各種設定**
設定中の**`wp.jaws-ug.tk`**は、自分のWordPressサイトアドレスに読み替えてください。
##リバースプロキシキャッシュの削除
* WordPressサーバにSSHでアクセスし、下記コマンドを実行する

```
$ sudo rm -rf /var/cache/nginx/proxy_cache
```

##コード修正
* WordPressサーバにSSHでアクセスする

<!--
###wp-config.phpの修正
この修正を行わないとCSSなど一部のファイルのリンクがWordPressサイトアドレスの絶対パスで張られてしまい、永代供養にしか使えなくなってしまいます。
※ **`http://`**のつけ忘れに注意
※ `i-xxxxxxxx`は、AMIMOTO AMIインストール時に指定したインスタンスID。`i-`まで入力してTabキーで補完してもよい


```
$ cd /var/www/vhosts/i-xxxxxxxx
$ sudo cp wp-config.php wp-config.php.org
$ sudo vim wp-config.php
```

```php:wp-config.php
/*53行目あたり、//define('WP_DEBUG_DISPLAY', false);の後に追記する*/

define('WP_HOME','http://wp.jaws-ug.tk');
define('WP_SITEURL','http://wp.jaws-ug.tk');
```
-->

###class-S3_helper.phpの修正
`$magic_file`のパスをAMIMOTO環境に合わせて修正します。
※ `i-xxxxxxxx`は、AMIMOTO AMIインストール時に指定したインスタンスID。`i-`まで入力してTabキーで補完してもよい

```
$ cd /var/www/vhosts/i-xxxxxxxx/wp-content/plugins/staticpress-s3/includes
$ sudo cp class-S3_helper.php class-S3_helper.php.org
$ sudo vim class-S3_helper.php
```

```php:class-S3_helper.php
/*188行目あたり
$magic_file = '/usr/share/misc/magic'; 
をコメントアウトまたは削除し、追記する*/

$magic_file = '/usr/share/percona-server/magic';
```
###class-static_press.phpの修正
[画像つきの投稿を新規作成するとうまく動かない](http://www.sssg.org/blogs/hiro345/archives/16751.html)事象への対処です。

```
$ cd /var/www/vhosts/i-xxxxxxxx/wp-content/plugins/staticpress/includes
$ sudo cp class-static_press.php class-static_press.php.org
$ sudo vim class-static_press.php
```

```php:class-static_press.php
/*730行目あたり
                        if (is_wp_error($permalink))
                                continue;
の後に追記する*/

if (preg_match('/.*\.html\/.*/', $permalink, $m)) {
                                continue;
}
```

##パーマリンクの設定
* [設定] -> [パーマリンク設定] 
* カスタム構造を選択し、**`/%postname%.html`**を入力する
* [変更を保存]をクリックする
![スクリーンショット 2016-02-07 15.43.53.png](https://qiita-image-store.s3.amazonaws.com/0/80392/832949bb-51b5-b3d7-dbea-215c9cf01261.png)

##StaticPress S3の設定
* StaticPress設定を開く
* 静的サイトURLにS3バケットのWeb公開URL(独自ドメインをもっていない場合は、S3バケットのEndpoint)を入力する
* 出力先ディレクトリの最後尾に**`static/`**を追加する
* [設定を保存]をクリックする
![StaticPress 設定 ‹ カレーは最強の飲み物 — WordPress 2016-07-15 22-14-44.png](https://qiita-image-store.s3.amazonaws.com/0/80392/8cda25df-99ba-f8f9-4db1-9584e0602839.png)
<BR><BR>
* S3バケットのIAM Access Keyを入力し、リージョンを選択する<BR>
※ 東京リージョンはAP_NORTHEAST_1
* [変更を保存]をクリックする
![スクリーンショット 2016-02-07 14.54.24.png](https://qiita-image-store.s3.amazonaws.com/0/80392/d0262db0-fade-d97b-12b4-714fcb57b799.png)
<BR><BR>
* S3 Bucketが選択できるようになっているので、同期先のバケットを選択する
![スクリーンショット 2016-02-07 14.56.30.png](https://qiita-image-store.s3.amazonaws.com/0/80392/53b1c93d-889a-86a2-19bf-14e2f9107162.png)
<BR><BR>
* [変更を保存]をクリックする<BR>

#**記事を投稿する**
管理画面から新規記事を投稿します。写真入りの記事が望ましいです。

#**コンテンツを同期する**
* [StaticPress] -> [再構築]<BR>
![スクリーンショット 2016-02-07 15.39.19.png](https://qiita-image-store.s3.amazonaws.com/0/80392/49991998-267b-6272-b8b9-5ec662861210.png)
<BR><BR>
* [終了]と表示されたら同期完了
![スクリーンショット 2016-02-07 15.42.23.png](https://qiita-image-store.s3.amazonaws.com/0/80392/dcc24f20-9329-1c8e-932c-af8eade4f662.png)
<BR><BR>

```
■「エラー！」と表示された場合のトラブルシューティング
・class-S3_helper.phpの修正部分を見直す
・StaticPress S3の設定を見直す
・S3バケットのIAM Access Keyを作りなおす
・サーバのstaticディレクトリを削除する(次項参照)
```

* S3バケットのWeb公開URLにアクセスしてブログサイトが表示されることを確認する
![スクリーンショット 2016-07-15 22.28.36.png](https://qiita-image-store.s3.amazonaws.com/0/80392/46940e48-ae68-7f3c-eb1c-5bfbc7a17ca4.png)

#**コンテンツを更新する**
**記事の投稿など、コンテンツを更新した際は都度「再構築」を実行する必要があります。**
ただし、テーマの変更など大きくコンテンツが変更された場合など、同期がうまくいかず「エラー！」と表示されることがあります。
その時は、下記コマンドでサーバのstaticディレクトリを削除してから「再構築」を実行してみましょう。
※ `i-xxxxxxxx`は、AMIMOTO AMIインストール時に指定したインスタンスID。`i-`まで入力してTabキーで補完してもよい

```
$ sudo rm -rf /var/www/vhosts/i-xxxxxxxx/static
```

#**WordPressサーバを停止してみよう**
WoudPressサーバを停止してもS3バケットのWeb公開URLに正常にアクセスできれば、落ちないWebサイトの完成です！(ブラウザキャッシュの影響を排除するために別のブラウザを使って確認した方が良いでしょう) もし、画像等一部コンテンツが欠落するようなら、Webページのソースを調べて、オリジンの絶対パスの記述がないか確かめます。
※ EC2でElasticIPをアサインしていない場合、サーバ停止 -> 起動でグローバルIPが変わりますので注意して下さい。IPが変わってしまった場合は、DNSのレコードを修正する必要があります

##サーバの停止
**Elastic IP(固定IP)を設定していない場合はIPアドレスが変わります**

* AWS ConsoleでEC2を開く
* 左ペインの[Instances]をクリックする
* 停止するインスタンスの上で右クリック -> [Instance State] -> [Stop]<BR>
※ 起動する場合は[Instance State] -> [Start]<BR>
![スクリーンショット 2016-05-31 22.59.47.png](https://qiita-image-store.s3.amazonaws.com/0/80392/42ab6ba6-73da-2d82-d399-099634d431f8.png)<BR><BR>
* [Yes, Stop]をクリックする<BR>
![EC2 Management Console 2016-05-31 23-00-42.png](https://qiita-image-store.s3.amazonaws.com/0/80392/bf2bd563-4124-8da4-221e-8557134df64b.png)