Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

17
Nginxのお話 Kentaro Yoshida at Web サーバ勉強会 on 2011/11/11

description

PHPを使うには、ApacheをPreforkで動作させる必要があります。そういった環境で画像配信を行うと必要な同時接続数がとても多くなるため効率的ではありません。そこで、Nginxを併用した高速静的ファイル配信方法を紹介します。 2つ目のトピックには、APIリクエストをNginxにて透過的にプロキシすることでコンテンツキャッシュを行う仕組みを紹介します。

Transcript of Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

Page 1: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

Nginxのお話Kentaro Yoshida at Webサーバ勉強会 on 2011/11/11

Page 2: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

本日の流れ

#1 ApacheとNginxの連携で高速画像配信Apache等のVirtualHost設定と2重管理は行わない実質メンテナンスフリーを実現

#2 Nginxによる中間キャッシュサーバ期限切れの削除性能高く、かなり実用的nginx cache managerが軽い理由も解説

Page 3: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

#1 ApacheとNginxの連携で高速画像配信

こんなケースに最適

Nginxの高速な応答性能を取り入れたい

画像の配信にpreforkで動くApacheから応答する事は卒業したい

でも、PHPを利用している都合上、Apacheをworkerには出来ない

ApacheのVirtualHost設定ファイルと重複する内容は書きたくない

Page 4: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

#1 ApacheとNginxの連携で高速画像配信

構成ロードバランサ配下にWebサーバがある構成Apacheとは別のポートを使い、互いに依存しない構成

メリット別ポートを使うため、Apacheと共存可能で設定変更も不要ApacheとNginxの良いところ取りが出来る

Page 5: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

#1 ApacheとNginxの連携で高速画像配信 upstream backend-apache { server 127.0.0.1:80; }

server { listen 8080; server_name _; access_log off;

location / { log_not_found off; expires 12h; root /var/www/site; try_files /$host$uri /$host/web/$uri @unicorn; }

location @unicorn { log_not_found off; expires 12h; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://backend-apache; } }

Page 6: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

upstream backend-apache { server 127.0.0.1:80; }

server { listen 8080; server_name _; access_log off;

location / { log_not_found off; expires 12h; root /var/www/site; try_files /$host$uri /$host/web/$uri @unicorn; }

location @unicorn { log_not_found off; expires 12h; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass ; } }

Page 7: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

upstream backend-apache { server 127.0.0.1:80; }

server { listen 8080; server_name _; access_log off;

location / { log_not_found off; expires 12h; root /var/www/site; try_files /$host$uri /$host/web/$uri @unicorn; }

location @unicorn { log_not_found off; expires 12h; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://backend-apache; } }

Page 8: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

#2 Nginxによる中間キャッシュサーバ

こんなケースに最適

mod_mem_cache や mod_disk_cacheでiowaitに悩まされている

squidよりも簡単な透過的なキャッシュサーバが欲しい

n時間に1回リフレッシュしたいAPIリクエストのキャッシュ

Page 9: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

構成ロードバランサ配下にWebサーバがある構成Nginxが待ち受け、キャッシュが無ければApacheへ受け流すメリット

tmpfsにキャッシュを書き込む事で読み書きの圧倒的高速化設定がシンプルで簡単に利用できる定期的なキャッシュ削除が軽い

#2 Nginxによる中間キャッシュサーバ

Page 10: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

残念な実装(mod_disk_cache + Cronで期限切れファイル削除)ディレクトリを上から順番に探索ファイルリストを取得し、それぞれの更新日を取得条件に該当したら削除

Nginxの実装nginx cache managerが定期的にフルパス指定で削除

#2 Nginxによる中間キャッシュサーバ

Page 11: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

#2 Nginxによる中間キャッシュサーバ

proxy_cache_path /dev/shm/nginx-cache/test levels=1 keys_zone=test-cache:2m max_size=500m inactive=1h;

upstream api-backends { server 127.0.0.1:80;}

server { listen 192.168.50.20:80; server_name hoge.jp; access_log off; error_log /var/log/nginx/error.log; proxy_set_header Host $host; location /service-api/ { proxy_cache test-cache; proxy_cache_valid 200 4h; proxy_cache_valid any 1m; proxy_pass http://api-backends; }}

Page 12: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

proxy_cache_path /dev/shm/nginx-cache/test levels=1 keys_zone=test-cache:2m max_size=500m inactive=1h;

upstream api-backends { server 127.0.0.1:80;}

server { listen 192.168.50.20:80; server_name hoge.jp; access_log off; error_log /var/log/nginx/error.log; proxy_set_header Host $host; location /service-api/ { proxy_cache test-cache; proxy_cache_valid 200 4h; proxy_cache_valid any 1m; proxy_pass http://api-backends; }}

Page 13: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

proxy_cache_path /dev/shm/nginx-cache/test levels=1 keys_zone=test-cache:2m max_size=500m inactive=1h;

upstream api-backends { server 127.0.0.1:80;}

server { listen 192.168.50.20:80; server_name hoge.jp; access_log off; error_log /var/log/nginx/error.log; proxy_set_header Host $host; location /service-api/ { proxy_cache test-cache; proxy_cache_valid 200 4h; proxy_cache_valid any 1m; proxy_pass http://api-backends; }}

Page 15: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

無視できる範囲のiowait

Page 16: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

# strace -p 10088

Process 10088 attached - interrupt to quit

epoll_wait(19, {}, 512, 2909) = 0

unlink("/dev/shm/nginx-cache/foo-api/e/69/844b59da41ddaa0d9dd66147e2a0769e") = 0

unlink("/dev/shm/nginx-cache/foo-api/e/ca/219b1560899d1d33c5ab30b21420acae") = 0

nanosleep({0, 200000000}, NULL) = 0

unlink("/data/nginx/cache/foo-image/7/56/a0f7597a0916c5e03422f8f1168ab567") = 0

unlink("/data/nginx/cache/foo-image/2/ae/f9d0d8722d114b7f57748ec28aaa0ae2") = 0

epoll_wait(19, {}, 512, 10000) = 0

nginx cache managerの動き

Page 17: Nginxのお話 画像配信・APIキャッシュ利用事例 2011/11/11 Webサーバ勉強会

Nginxイイね!