Database JUNKY

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

nginxを利用したamazon S3への動画リバースプロキシー

nginxを利用して、amazonのs3へ動画ファイルを自動取得する、コンフィグファイルの設定をメモしました。

これのメリットは、

  • s3へのアクセスが何回もいかないので、ネットワーク転送課金を低く抑えることができる

  • 動画URLを短くまとめることができる

でしょうか。

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

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

/etc/nginx/nginx.conf

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

proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my-key-zone:64m max_size=180000m inactive=4d;
  • level
    # levelは、キャッシュパスの配下のサブディレクトリの文字数を設定するものです。
    # 最大で3階層( ex. 1:2:3 )まで指定できます。 
    # ここでは、levels=1:2と指定しています。
    # つまり、1階層目は1文字、
    # 2階層目は2文字でサブディレクトリが作成されることを意味します。
  • keys_zone
    # keys_zoneは、キャッシュパスのゾーン名、ゾーンサイズを設定するものです。
    # 最大で3階層( ex. 1:2:3 )まで指定できます。 
    # ここでは、ゾーン名をmy-key-zoneとし、
    # ゾーンサイズを16MBで指定しています。ここで、メモリが
    # 16MB消費されることに注意してください。
  • max_size
    # max_sizeはキャッシュのファイルサイズ
    # (ゾーン内の全てのキャッシュファイルサイズ)の最大値を設定します。
    # ここでは、180000mつまり180GBと指定しています。
    # ここでは、zone_size と max_sizeのいずれかががサイズオーバーになった時点で
    # キャッシュが停止します。
  • inactive
    # inactiveは、非アクセス時間を設定します。
    # ここで設定した日時を越えたキャッシュ情報は自動的に削除されます。
    # ここでは、4日間( 4d )を指定しています。
    # つまり、特別に何もなければキャッシュは、一週間保存されることになります。

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

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

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

設定したすべての内容

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

nginx.conf

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 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/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;

}

default.conf

#
# 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;
    }

}

ハイパフォーマンスHTTPサーバ Nginx入門

ハイパフォーマンスHTTPサーバ Nginx入門