またいつかWordPressサイトを壊して入れ直すことがあるかもしれないので、そのときのためのメモです。
タグ: Wordpress
色んなブログを参照しながら実施したものの、ドハマリしたのでメモしておく。
OriginとなるALBの設定
CloudFrontの配信元(オリジン)となるALBが、マルチホスト(複数のドメイン名を相乗りさせている)の場合は、CloudFrontのディストリビューション毎にリスナーポートを分けておいた方が無難。
こだわるならCloudFront~ALB間もHTTPS転送すべきではあるが。。。いったんHTTPで。
CloudFrontの作成
ACMを使って証明書管理するなら、N.Virginiaで証明書を発行しておく。
ALB を配信元にしてCloudFrontディストリビューションを作成。
CloudFrontのデフォルトのキャッシュ設定をする
通常の記事を表示したり、管理画面へのアクセスの時に空白ページが出たりするので、必ずHostヘッダやForwarded-Protoヘッダを通しておく。
CookieもWordpress関連のものを素通しするのと、プレビューや検索クエリのためにQuery Stringもほぼ素通ししてやる。
参考にしたブログ:
WordPress 製のサイトに CloudFront を導入してバリバリキャッシュさせようと検討したときの記録 https://hacknote.jp/archives/38406/
CloudFrontのパス毎のキャッシュ除外設定をする
WordPress固有の除外設定を追加しておく。
対象となる代表的なパスは以下の通り。
- /wp-json/*
- /wp-admin/*
- wp-login.php
- *.php
キャッシュ設定では以下のところを必ず変更しておく。
- Cache Based on Selected Request Headers (Whitelist または All)
- Forward Cookies (Whitelist または All)
- Query String Forwarding and Caching (Forward all, cache based on all)
CloudFrontのエラーページのキャッシュ設定
4xx, 5xx系のエラーは変にキャッシュされても困るので、とりあえず10秒程度に短くしておく。
WordPressのPHP書き換え
wp-config.phpの一部をCloudFront対応に書き換える
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
} elseif (isset( $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO']) && $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] ='on';
}
DNSレコードの書き換え
AレコードおよびAAAAレコードがCloudFrontのディストリビューションを指すように変更して動作を確認する。
その他参考にしたブログ
AWS CloudFront→ALB→EC2(WordPress) https://www.yuulinux.tokyo/10815/
WordPressを動かすApache HTTPd & PHP環境と、DBであるMySQLをセットでDocker-composeを利用して準備する手順。
docker-compose.yml を用意する。
version: '3.1'
services:
blogdb:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: blogdb
MYSQL_USER: blogdb
MYSQL_PASSWORD: blogdb
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./mysql:/var/lib/mysql
wordpress:
image: wordpress
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: blogdb
WORDPRESS_DB_USER: blogdb
WORDPRESS_DB_PASSWORD: blogdb
WORDPRESS_DB_NAME: blogdb
volumes:
- ./html:/var/www/html
- ./php.ini:/usr/local/etc/php/conf.d/php.ini
wordpressコンテナのvolumesでは、以下の2つの箇所を永続化している。
- /var/www/html -> ./html
WordPress 本体や、プラグイン、テーマなどのファイルを保存しておくため。
また、wp-config.php を弄りやすくしている。
ref. AWS ALB配下にWordPressを入れたら繋がらない https://blog.blue.wirednet.jp/2020/05/01/400/aws-alb%e9%85%8d%e4%b8%8b%e3%81%abwordpress%e3%82%92%e5%85%a5%e3%82%8c%e3%81%9f%e3%82%89%e7%b9%8b%e3%81%8c%e3%82%89%e3%81%aa%e3%81%84/ ) - /usr/local/etc/php/conf.d/php.ini -> ./php.ini
WordPressに画像やプラグインをアップロードするときの添付ファイル制限を緩和するために、コンテナの外からiniファイルを書き換えられるようにしている。
実際に設定している値は以下のような感じ。
file_uploads = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 600
後は、docker-compose up -d して、適当にWordpressのセットアップをすれば良い。