AWS

AWS ELB+HTTPS+ApacheでWordPressを運用する勘所

優 AWS

AWS ELB ALB ロードバランサー WordPress

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)にすると実装が簡単ですが、証明書の更新など後々が面倒になっちゃいますよ~!

 

 

この記事で紹介する内容

  1. ヘルスチェックファイルの設定
  2. ELB環境のログの対応
  3. 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。

 

お疲れ様です!

 

AWS
最新情報をチェックしよう!
>システム構築・保守に特化した会社です。

システム構築・保守に特化した会社です。

システムの構築・保守運用「システムガーディアン」 社内システム担当が欲しいが、専属で雇うほどの仕事量はない。 必要な時に必要なだけ頼りたいというお悩みを持つ企業様へ専門知識を持って対応を行っております。 サーバから各種システムまで自社・他社で構築されたシステムに対してサポートを行っております。

CTR IMG