SlideShare une entreprise Scribd logo
1  sur  17
Télécharger pour lire hors ligne
Nginxのお話
Kentaro Yoshida at Webサーバ勉強会 on 2011/11/11
本日の流れ

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

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


こんなケースに最適

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

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

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

 ApacheのVirtualHost設定ファイルと重複する内容は書きたくない
#1 ApacheとNginxの連携で高速画像配信

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

メリット
 別ポートを使うため、Apacheと共存可能で設定変更も不要
 ApacheとNginxの良いところ取りが出来る
#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;
     }
 }
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 / {
        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;
    }
}
#2 Nginxによる中間キャッシュサーバ



こんなケースに最適

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

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

 n時間に1回リフレッシュしたいAPIリクエストのキャッシュ
#2 Nginxによる中間キャッシュサーバ

構成
 ロードバランサ配下にWebサーバがある構成
 Nginxが待ち受け、キャッシュが無ければApacheへ受け流す
メリット
 tmpfsにキャッシュを書き込む事で読み書きの圧倒的高速化
 設定がシンプルで簡単に利用できる
 定期的なキャッシュ削除が軽い
#2 Nginxによる中間キャッシュサーバ

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

Nginxの実装
 nginx cache managerが定期的にフルパス指定で削除
#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;
  }
}
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/ {
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;
  }
}
http://twitter.com/yoshi_ken/status/41522958027460608
無視できる範囲のiowait
nginx cache managerの動き

# 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イイね!

Contenu connexe

Plus de Kentaro Yoshida

Hivemallで始める不動産価格推定サービス
Hivemallで始める不動産価格推定サービスHivemallで始める不動産価格推定サービス
Hivemallで始める不動産価格推定サービスKentaro Yoshida
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話Kentaro Yoshida
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンKentaro Yoshida
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"Kentaro Yoshida
 
MySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchMySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchKentaro Yoshida
 
Fluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasual
Fluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasualFluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasual
Fluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasualKentaro Yoshida
 
MySQL 5.6への完全移行を実現したTritonnからMroongaへの移行体験記
MySQL 5.6への完全移行を実現したTritonnからMroongaへの移行体験記MySQL 5.6への完全移行を実現したTritonnからMroongaへの移行体験記
MySQL 5.6への完全移行を実現したTritonnからMroongaへの移行体験記Kentaro Yoshida
 
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウKentaro Yoshida
 
Tritonn (MySQL5.0.87+Senna)からの mroonga (MySQL5.6) 移行体験記
Tritonn (MySQL5.0.87+Senna)からの mroonga (MySQL5.6) 移行体験記Tritonn (MySQL5.0.87+Senna)からの mroonga (MySQL5.6) 移行体験記
Tritonn (MySQL5.0.87+Senna)からの mroonga (MySQL5.6) 移行体験記Kentaro Yoshida
 
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」Kentaro Yoshida
 

Plus de Kentaro Yoshida (10)

Hivemallで始める不動産価格推定サービス
Hivemallで始める不動産価格推定サービスHivemallで始める不動産価格推定サービス
Hivemallで始める不動産価格推定サービス
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
 
MySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchMySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearch
 
Fluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasual
Fluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasualFluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasual
Fluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasual
 
MySQL 5.6への完全移行を実現したTritonnからMroongaへの移行体験記
MySQL 5.6への完全移行を実現したTritonnからMroongaへの移行体験記MySQL 5.6への完全移行を実現したTritonnからMroongaへの移行体験記
MySQL 5.6への完全移行を実現したTritonnからMroongaへの移行体験記
 
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
 
Tritonn (MySQL5.0.87+Senna)からの mroonga (MySQL5.6) 移行体験記
Tritonn (MySQL5.0.87+Senna)からの mroonga (MySQL5.6) 移行体験記Tritonn (MySQL5.0.87+Senna)からの mroonga (MySQL5.6) 移行体験記
Tritonn (MySQL5.0.87+Senna)からの mroonga (MySQL5.6) 移行体験記
 
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
 

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