目的
普段はオンプレミスのサーバでコンテンツを配信しているのですが、ネットワークの帯域やオンプレミスサーバの負荷が上昇したときの対策として、AWSのCloudFrontを利用したい。
なんかイベント的な配信をするらしいです・・・。
インフラ側のこともちょっと考えてほしいよなあ・・・
CloudFront準備
では、CloudFrontを準備していきます。
まずはAWSのページからCloudFrontをクリックします。
そして「Create Distribution」をクリック
今回はHTTP(S)を使用するためWebの方の「Get Start」をクリック
設定は以下な感じ。
基本的にいじらないが、赤枠の部分だけいじっております。
CORSを利用するのであれば、「Cache Base on Selected Request Headers」をWhiteListにして、Originを追加してください。
IPv6は使わないのでOFF
ここまで入れたらあとはDistributionを作成します。
こんな感じでStatusがDeployedになっていたら完了です。
※作成完了に10分~15分程度かかるようです。
CloudFront側は以上。
Cacheサーバの設定
今回、どうやってCloudFrontにトラフィックを流そうか考えましたが、Route53はドメイン管理者の都合で利用できず。
ので、今回はリダイレクトを使うことにしました。
現在の設定はこんな感じ。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 65536;
use epoll;
multi_accept on;
accept_mutex off;
}
worker_rlimit_nofile 65536;
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 5;
# log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# server config
server {
listen 443 ssl;
server_name main.hogehoge.com;
access_log /var/log/nginx/access.log main;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate_key /etc/nginx/ssl/main.hogehoge.com.key; #鍵指定
ssl_certificate /etc/nginx/ssl/main.hogehoge.com.cer; #証明書指定
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!eNULL:!MD5:!DH;
location /
{
proxy_pass http://[OriginのIPアドレス];
add_header 'Access-Control-Allow-Origin' $http_origin; #CORS用設定
add_header 'Access-Control-Allow-Credentials' 'true'; #CORS用設定
}
}
}
現在は全てのリクエストをOriginサーバに送るようになっています。
これだとCloudFrontにリクエストを流せないので、リダイレクト設定を入れましょう。
とはいえ、Nginxにはコネクションが○○以上になったら~みたいなifが書けそうになかったので、「このコンテンツが来たときはCloudFrontに流す!」みたいなコンフィグにしてみました。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 65536;
use epoll;
multi_accept on;
accept_mutex off;
}
worker_rlimit_nofile 65536;
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 5;
# log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# server config
server {
listen 443 ssl;
server_name main.hogehoge.com;
access_log /var/log/nginx/access.log main;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate_key /etc/nginx/ssl/main.hogehoge.com.key; #鍵指定
ssl_certificate /etc/nginx/ssl/main.hogehoge.com.cer; #証明書指定
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!eNULL:!MD5:!DH;
location /
{
proxy_pass http://[OriginのIPアドレス];
add_header 'Access-Control-Allow-Origin' $http_origin; #CORS用設定
add_header 'Access-Control-Allow-Credentials' 'true'; #CORS用設定
}
#To CloudFront
location = /hogehogefile.html
{
return 301 https://xxxxxxxxxxxxx.cloudfront.net$request_uri;
add_header 'Access-Control-Allow-Origin' $http_origin; #CORS用設定
add_header 'Access-Control-Allow-Credentials' 'true'; #CORS用設定
}
}
}
これだと、例えばhttps://main.hogehoge.com/hogehogefile.html
とかいうリクエストが来た場合に、CloudFront側にトラフィックを流します。
コネクションで動的に流したい時は自分でスクリプトなりなんなりを組んで、デーモン化しておいて条件でnginx.confを書き換えたりするようにすればよいかと思います。
というか、本当はそこまでしたかったんだけど、さすがに時間がなさ過ぎた・・・。
nginx のifで以上、以下条件を指定できればいいんだけど・・・
まあ、nginxのifは害悪と言われているので、使わないに越したことはないですね。
ちなみに、リダイレクトするときにもCORS用のヘッダを入れておかないとエラーをはきやがりました。
それのせいで2時間ぐらい無駄にしました。
でも、よく考えたら当たり前ですよねー・・・。
コメント