Database JUNKY

MySQL,MariaDBを中心としたブログです

Amazon S3の利用料節約を考えてみる2(nginxでリバースプロキシ)

・・で前回の話の続きをここに書くわけですが。結果を書かなかったのは、本当にこの手順でいいのか?というのが 若干不安だったためです。でも現状これで稼働しており。キャッシュも取れ、パフォーマンスも確保しているので掲載したいと思います。 あくまでも、私のメモ!!レベルです

設定は、nginx.conf と default.conf の2種類になります

まるっとconfファイルを掲載しましたが、CDNを作る上で重要な部分だけを抜粋します。

/etc/nginx/nginx.conf

設定すべき項目は以下の項目です。こちらは、キャッシュ全般の設定を行っております

[code lang=text] proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my-key-zone:64m max_size=180000m inactive=4d; [/code]

  • level

[code lang=text] # levelは、キャッシュパスの配下のサブディレクトリの文字数を設定するものです。 # 最大で3階層( ex. 1:2:3 )まで指定できます。 # ここでは、levels=1:2と指定しています。 # つまり、1階層目は1文字、 # 2階層目は2文字でサブディレクトリが作成されることを意味します。 [/code]

  • keys_zone

[code lang=text] # keys_zoneは、キャッシュパスのゾーン名、ゾーンサイズを設定するものです。 # 最大で3階層( ex. 1:2:3 )まで指定できます。 # ここでは、ゾーン名をmy-key-zoneとし、 # ゾーンサイズを16MBで指定しています。ここで、メモリが # 16MB消費されることに注意してください。 [/code]

  • max_size

[code lang=text] # max_sizeはキャッシュのファイルサイズ # (ゾーン内の全てのキャッシュファイルサイズ)の最大値を設定します。 # ここでは、180000mつまり180GBと指定しています。 # ここでは、zone_size と max_sizeのいずれかががサイズオーバーになった時点で # キャッシュが停止します。 [/code]

  • inactive

[code lang=text] # inactiveは、非アクセス時間を設定します。 # ここで設定した日時を越えたキャッシュ情報は自動的に削除されます。 # ここでは、4日間( 4d )を指定しています。 # つまり、特別に何もなければキャッシュは、一週間保存されることになります。 [/code]

/etc/nginx/conf.d/default.conf

amazon s3リダイレクトする設定全般の設定です。この部分を注意すればいいのかな?と思います。

[code lang=text] location / { # ストリーミング配信を有効にする sendfile on; mp4; mp4_buffer_size 5m; mp4_max_buffer_size 10m; proxy_pass https://s3-XXXXXXXX.amazonaws.com:443; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  # リバースプロキシ先のレスポンスにCache-Controlヘッダがついていて、
  # "no-cache"とされているとキャッシュされないので、
  # その場合はproxy_ignore_headersで無効化する。
  proxy_ignore_headers Cache-Control;

  # キャッシュ用にゾーンの名前を設定します。
  # http部で設定したproxy_cache_pathのキャッシュゾーン名を指定します。
  # ゾーン名自体は、複数のlocationで使用することができます。
  proxy_cache mb-key-zone;

  # ************************************************************
  # *** HTTPステータスコード毎にキャッシュ時間を設定 ***
  # ************************************************************

  # 200 OK 302 Moved Temporarily
  proxy_cache_valid 200 302 4d;
  # NOT FOUND
  proxy_cache_valid 404 5m;
  # 上記以外 
  proxy_cache_valid any 1m;
  # root   /usr/share/nginx/html;
  # index  index.html index.htm;
}

[/code]

  • proxy_pass s3のbucketurlを入力してください。s3側のセキュリティ設定に関してはこちらでは割愛します
  • sendfile ファイルの読み込みとクライアントへのレスポンスの送信にsendfile() APIを使うかの設定。sendfile()を使うと効率良くファイルの内容をクライアントに送信できるとのこと
  • mp4 疑似ストリーミング)機能を使ってMP4(H.264/AAC)ファイルのストリーミング配信する設定です。yumでインストールしましたが、モジュール自体は組み込まれていたため、使ってみました

設定したすべての内容

関係あるものもないものも全部以下に乗せておきます。

nginx.conf

[code lang=text] user nginx; worker_processes 4;

error_log /var/log/nginx/error.log;

pid /var/run/nginx.pid;

events { worker_connections 1024; }

http { include /etc/nginx/mime.types; default_type application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

log_format ltsv 'cdn:host_cdn3t'
            'time_local:$time_localt'
            'remote_addr:$remote_addrt'
            'request_method:$request_methodt'
            'request_length:$request_lengtht'
            'request_uri:$request_urit'
            'uri:$urit'
            'query_string:$query_stringt'
            'status:$statust'
            'bytes_sent:$bytes_sentt'
            'body_bytes_sent:$body_bytes_sentt'
            'referer:$http_referert'
            'useragent:$http_user_agentt'
            'forwardedfor:$http_x_forwarded_fort'
            'request_time:$request_timet'
            'upstream_response_time:$upstream_response_time';

log_format cache '$remote_addr - $host [$time_local] "$request" $status '
                 '$body_bytes_sent "$http_referer" '
                 'rt=$request_time ut="$upstream_response_time" '
                 'cs=$upstream_cache_status';

access_log  /var/log/nginx/access.log  main;
access_log  /var/log/nginx/access_ltsv.log  ltsv;
access_log  /var/log/nginx/cache.log cache;

sendfile        on;
tcp_nopush     on;

keepalive_timeout  65;

# gzip  on;

proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my-key-zone:64m max_size=180000m inactive=4d;

# levelは、キャッシュパスの配下のサブディレクトリの文字数を設定するものです。
# 最大で3階層( ex. 1:2:3 )まで指定できます。 
# ここでは、levels=1:2と指定しています。
# つまり、1階層目は1文字、
# 2階層目は2文字でサブディレクトリが作成されることを意味します。

# keys_zoneは、キャッシュパスのゾーン名、ゾーンサイズを設定するものです。
# 最大で3階層( ex. 1:2:3 )まで指定できます。 
# ここでは、ゾーン名をmy-key-zoneとし、
# ゾーンサイズを16MBで指定しています。ここで、メモリが
# 16MB消費されることに注意してください。

# max_sizeはキャッシュのファイルサイズ
# (ゾーン内の全てのキャッシュファイルサイズ)の最大値を設定します。
# ここでは、180000mつまり180GBと指定しています。
# ここでは、zone_size と max_sizeのいずれかががサイズオーバーになった時点で
# キャッシュが停止します。

# inactiveは、非アクセス時間を設定します。
# ここで設定した日時を越えたキャッシュ情報は自動的に削除されます。
# ここでは、4日間( 4d )を指定しています。
# つまり、特別に何もなければキャッシュは、一週間保存されることになります。

proxy_temp_path /var/cache/nginx/tmp;

# キャッシュのテンポラリパスを設定します。 
# ここでもproxy_cache_pathと同じようにlevelを追加で指定することができます。
# しかし、一般的には使わないことが多いようです。

# Load config files from the /etc/nginx/conf.d directory
# The default server is in conf.d/default.conf
include /etc/nginx/conf.d/*.conf;

} [/code]

default.conf

[code lang=text] #

The default server

# server { listen 80 default_server; server_name _; charset UTF-8;

#access_log  logs/host.access.log  main;

error_page  404              /404.html;
location = /404.html {
    root   /usr/share/nginx/html;
}

# redirect server error pages to the static page /50x.html
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}

location / {
  # ストリーミング配信を有効にする
  sendfile            on;
  mp4;
  mp4_buffer_size     5m;
  mp4_max_buffer_size 10m;
  proxy_pass https://s3-XXXXXXXX.amazonaws.com:443;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  # リバースプロキシ先のレスポンスにCache-Controlヘッダがついていて、
  # "no-cache"とされているとキャッシュされないので、
  # その場合はproxy_ignore_headersで無効化する。
  proxy_ignore_headers Cache-Control;

  # キャッシュ用にゾーンの名前を設定します。
  # http部で設定したproxy_cache_pathのキャッシュゾーン名を指定します。
  # ゾーン名自体は、複数のlocationで使用することができます。
  proxy_cache mb-key-zone;

  # ************************************************************
  # *** HTTPステータスコード毎にキャッシュ時間を設定 ***
  # ************************************************************

  # 200 OK 302 Moved Temporarily
  proxy_cache_valid 200 302 4d;
  # NOT FOUND
  proxy_cache_valid 404 5m;
  # 上記以外 
  proxy_cache_valid any 1m;
  # root   /usr/share/nginx/html;
  # index  index.html index.htm;
}

} [/code]