ELB配下でHTTPをHTTPSにリダイレクト

表題の通り。ELB配下で、ELBでSSLを終端としている場合に表題を行いたい。

■ 環境

  • AWS ELB
  • nginx 1.10.3
  • Ubuntu 16.04

■ nginx

redashで使用しているサーバにて行う。ちなみにredashが提供しているAMIをそのまま起動し、接続元は制限して使っている。

対象のファイルは下記。

$ vi /etc/nginx/sites-available/redash

内容は下記のように”server“ディレクティブ内に追加した。

  if ($http_x_forwarded_proto != https) {
    return 302 https://$host$request_uri;
  }

前回の`httpd`と同様に、リターンコードは”302“として様子を見ている。

これでほとんどがHTTPS通信になったと思われる。

以上。

■ 関連

HTTPをHTTPSにリダイレクト

ELBのログに不明なフィールド

表題の件について。

■ 環境

  • AWS Application Load Balancer

■ ALB

Application Load Balancerを使用しログをS3に出力させているのだが、そのログの解析処理の中で2018/03/02もしくは2018/03/03分のログから一部で解析に失敗している箇所を発見した。なぜだろう?とデバッグしていくと、どうやら今まではなかったフィールドがログに追加されていることが原因であるようであった。

※よくよくログファイルを確認したところ、3/1分からであった。

Application Load Balancer のアクセスログ
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html

上記のマニュアルによると、”アクセスログのエントリ“には20のフィールドが出力されるようになっている。しかし前述の日付あたりから21フィールドが出力されているようであった。21番目のフィールドに『0』、ものによっては『』が出力されている。件の解析処理の中では20フィールドの場合はELBと判別しELB用の処理を、それ以外の時はCloudFrontと判定しCloudFront用の処理を行うようになっていた為、ELBであるのにCloudFront用の処理に入っていた為に失敗しているようであった。判定処理はフィールド数だけではないのだが、CloudFront用の処理に入ってしまっていた。判定処理が甘いようである。ちなみにCloudFrontのログは26フィールドである。

判定処理を20フィールドもしくは21フィールドに変更し正しい結果を得られるようになった。

以上。

WordPressのSSL化で無限ループ

表題の通り。ここではないとあるWordPressのサイトをSSL化した時にハマった。

■ 環境

  • WordPress 4.9.2
  • Amazon Linux
  • EC2
  • ELB

■ WordPress

設定 > 一般』にある下記2つの項目をSSLに設定した。ちなみにSSLはELBで終端とし、EC2へは”http“でアクセスしたい。

  • WordPressアドレス
  • サイトアドレス

どちらも、もともとある設定の”http“を”https“に変更した。”サイトアドレス“の変更時点では問題がなかったのだが、”WordPressアドレス“を”https“に変更したところ無限ループとなってしまった。

原因は、WordPressのPHPでは”https“でアクセスが来るはずと認識しているのに、実際にはELBで終端されているので”http“でアクセスが来てしまっているため、再度”https“にリダイレクトされている…という感じがする。

というわけで下記を”wp-config.php“に入れることで対応が可能であった。

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS'] = 'on';

以上。

ELB配下のApacheでremote_ipを使う

表題の通り。メモ。

■ 環境

  • Apache httpd 2.4.25
  • Amazon Linux
  • AWS

■ remote_ip

ELB等、本来のアクセス元が”X-Forwarded-For“に入っている場合の対処。

mod_remoteip – Apache HTTP Server Version 2.4
https://httpd.apache.org/docs/current/mod/mod_remoteip.html

これが最近はデフォルトで入っている。

httpd.conf“の下記行を追記する。

RemoteIPHeader X-Forwarded-For

また下記の行を書き換えれば良い。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

%h“の箇所を”%a“にすればいける。自身は”combined“とは別名で”%a“に書き換えたものを設定しておいた。お手軽だ。

以上。

ELBのヘルスチェックログを出力しない

表題の通り。AWSのELBからのヘルスチェックのログが邪魔なので非表示にという設定メモ。

■ 環境

  • nginx
  • ELB
  • AWS

■ 削除したいログ

下記のようなログである。

10.0.1.154 - - [16/Nov/2016:19:04:21 +0900] "GET /health.txt HTTP/1.1" 200 3 "-" "ELB-HealthChecker/1.0"
10.0.2.20 - - [16/Nov/2016:19:04:21 +0900] "GET /health.txt HTTP/1.1" 200 3 "-" "ELB-HealthChecker/1.0"

■ nginx.conf

該当の設定ファイル内、”server”ディレクティブの所に下記を追記する。

  location = /health.txt {
    access_log off;
    break;
  }

これでログに出力されなくなった。

※ 2017/04/25 追記
コメントを頂いたので上記を編集した。

以上。

■ 関連

ELBのヘルスチェックをログに記載しない (Apache)