
AWS上でELBとHTTPSを利用したサイトを構築する場合は、ちょっとしたお作法があるのでかいつまんでご紹介します。今回のご紹介はApacheですが、WEBサーバがNginxであっても行う要領は同じです。
処理の流れ
- ユーザ(80) >> ELB(80) >> EC2(80) →443へリダイレクト
- ユーザ(443) >> ELB(443) >> EC2(80)
HTTPSの運営の場合、証明書はELB(ALB)に設定し、EC2は常に80番で動かしておくのがセオリーなんです。ELB(443), EC2(443)にすると実装が簡単ですが、証明書の更新など後々が面倒になっちゃいますよ~!
この記事で紹介する内容
- ヘルスチェックファイルの設定
- ELB環境のログの対応
- WordPressのリダイレクトループ対応
になります。
ヘルスチェック設定
ELBヘルスチェック用ファイルを作成します。
# vi /var/www/html/healthy.html <h1>Don'T Remove!!</h1><br/> <h2>LoadBalanser HealthCheck File</h2><br/>
ELBがアクセスしてきた時に見れるように、サーバ側で設定します。
# vi /etc/httpd/conf.d/healthcheck.conf # ヘルスチェックURL Alias /healthy.html /var/www/html/healthy.html # ヘルスチェックのALBのアクセスはログを取らない SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
ELBのヘルスチェック用パスには”/healty.html”と設定します。
ログ対応
これを設定しておかないと、ロードバランサのIPが登録されてしまい、ユーザのIPがログに残せません。
remoteipモジュールがあるか確認します。
# httpd -M | grep remoteip remoteip_module (shared)
ログフォーマット対応
# vi /etc/httpd/conf/httpd.conf
<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-Proto}i\"" elb-customlog ←追加
画像やファビコンの画像をログに出力させないようにするコンフィグ
# vi /etc/httpd/conf.d/GlobalSetting.conf # ファビコンのログを出さない SetEnvIf Request_URI "\.(ico)$" nolog # 画像やJSのログを出さない SetEnvIf Request_URI "\.(gif|jpg|png|ico|jpeg|js|css)$" nolog CustomLog logs/access_log common env=!nolog
画像のアクセスがアクセスログに記録されると、ログからシェルでアクセス集計を行う要望が出た時に邪魔になります。また、アクセスログの出力が少なくなりディスクI/Oにも良いです。
バーチャルホストファイルの設定
# cat /etc/httpd/conf.d/sample.conf
<VirtualHost *:80>
DocumentRoot /home/example.net/public
ServerName www.example.net
ServerAlias example.net
ErrorLog logs/example.net-error.log
#CustomLog logs/example.net-access.log common
CustomLog logs/example.net-access.log elb-customlog env=!nolog
## ALB対策
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Port} !^443$
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
RewriteRule ^(.*)?$ https://www.example.net$1 [R=301,L]
</IfModule>
80番でサーバに直接きたアクセスはELBにアクセスにいくようにリダイレクトさせます。
Apacheの設定を反映させます。
# httpd -t # systemctl reload httpd
WordPress側 HTTPSを認識させます。
# vi /home/example.net/public/wp/wp-config.php
(略)
/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');
※下記を挿入する
# AWS ELB(ALB) リダイレクトループ対策
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
$_SERVER['HTTPS']='on';
}
wp-config.phpにリダイレクトループにならないように、ELB経由でhttpsになっていれば$_SERVER[‘HTTPS’]の変数をonになるようにWordPressのアプリ側に設定が必要になります。
後はELBに証明書を設定して、ドメインにアクセスしたらELBに流れるようにRoute53に設定してあげればOK。
お疲れ様です!
