WordPress, AWS

AWS CloudFront→ALB→EC2(WordPress)

CloudFrontはS3に設置したJS, CSS, 画像といった静的コンテンツに適したCDNの利用が王道だけれど、WordPressのような参照の多いサイトでのページキャッシュに利用することも効果的です!

 

環境

  • AWS
  • Amazon Linux2

 

この構成の意図

  • Nginxでのリバースプロキスにページキャッシュの場合は単一障害点になりますが、リバースプロキシの役割をCloudFrontに持たせることによってスケールすることが出来ます。
    キャッシュのTTLは任意で設定して下さい、また任意のタイミングで【invalidation】機能によりパス単位でのキャッシュ削除が可能です。

 

 

CloudFrontページキャッシュ構成の良いところ

  • CDNとして詳細設定が可能
    Cookieのキーを指定することで、ログイン中はキャッシュしないといったことが手軽に設定出来る
  • ALBと組み合わせてスケール、メンテナンス性の向上
    更にALBを間に挟むことで、EC2のメンテナンス性向上し将来的なスケールが容易になります。
  • Cloudfront転送料金 13円/1GB
    EC2から配信する場合と転送料金はほとんど大差ない、
    CloudFrontを挟めるなら挟もう

 

一時的なキャンペーンであれば

事前にCloudFrontのキャッシュ保持を行うTTLを長くして、CloudFrontにページキャッシュを十分にストックしておけばOK!

万が一CloudFrontのバックエンドに流れることが不安なら、ALB配下にEC2サーバを任意の数で待機しCPU監視によるオートスケール設定をかけておけばよいでしょう。

 

注意

  • ネイキッドドメイン(example.net等)でWEBを運用している場合は利用できない
    CloudFlare等ネイキッドドメインでも運用できるCDNがあるがRFC違反なので、メールなどで異常動作がでるかも?ハック的な実装になる。
    不具合が出た場合に常にこのネイキッドドメイン+CDNの実装が原因であるという疑惑が払拭できないので私はやらない。
  • 設計はシンプルにまっすぐいくべきと考えています。

 

プロトコルの流れ

USER → 443 → CloudFront → 443 → ALB → 80 → EC2

こういう流れになります。ALBとEC2の通信を80にすることで、AWS ACMを利用した証明書自動更新環境が作れます。

 

条件

下記ドメインの証明書をAWS ACM ヴァージニアリージョンで取得しておく

  • CloudFront適用/EC2 Apache設定用ドメイン
    www.example.net
  • ALB適用ドメイン
    alb.example.net

 

 

EC2設定

 

必要モジュールのインストール

 

起動、自動起動設定

 

WordPress DB作成

 

WordPressのダウンロード

 

バーチャルホスト設定

 

ヘルスチェックファイル設定

 

ヘルスチェックファイル サーバ内パス設定

 

 

サーバログのパラメータ

 

remoteipモジュールの確認

これがないとクライアントIPが取得できない。

 

ログフォーマット設定

 

反映

 

WordPress設定ファイルをサンプルからコピーして有効化

 

WordPress設定ファイルの編集

  • DBの設定
  • リダイレクトループ対応
  • サイト名対応

 

コンフィグファイル設定

  • DB設定
  • ALBのリダイレクトループ対策
  • サイトURL定義

 

 

CloudFront初期設定

 

 

 

CloudFront作成後、[Behaviors]-[Create Behavior]から

指定したパスに対してTTL=0, メソッドをCloudFrontにスルーさせてキャッシュをしないようにする

  • /wp-login.php
    このままだとログインが出来ない、ログイン出来るようにしよう。
  • /wp-admin/*
    管理系の情報をキャッシュしてはいけない
  • *.php
    動的なスクリプトをキャッシュさせてはいけない

 

 

ErrorのTTLを短く!Error Caching Minimum TTL

4xx, 5xx系のエラーキャッシュのデフォルトのTTLはなんと5分!

  • 各10秒程度に変更するのが良い

これをやっておかないと、復旧してもキャッシュされたエラーページが5分もクライアントに返すことになる。

 

ALB

【ターゲットグループ】 → 【ヘルスチェック】

  • プロトコル: http
  • ヘルスチェックパス:healthcheck.php

 

 

アクセスして表示されるか確認しよ~!

https://www.example.net

 

 

CloudFront動作確認

 

通常のアクセス(2回目)

x-cacheヘッダーにて「Hit from cloudfront」を確認 → キャッシュされている

 

 

ログイン中

x-cacheヘッダーにて「Miss from cloudfront」を確認 → キャッシュなし

キャッシュされてちゃだめですよ!

 

お疲れ様です。

 

 

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)