Webエンジニアがアフィリエイトで稼ぐ

プログラミングやSEOなどWebエンジニアのノウハウを活かしてWebサービスを運営しています。

nginx+memcachedで画像キャッシュ

ピーク時に画像の表示が遅延することが多々あったので、4月からnginx+memcachedの構成で画像をキャッシュするように変更してみました。

nginx

nginx+memcachedの設定サンプル。

upstream img1_memcaches {  
    server xxx.xxx.xxx.xxx:11211;  
}  
upstream img2_memcaches {  
    server xxx.xxx.xxx.xxx:11211;  
}  
upstream img_servers {  
    server xxx.xxx.xxx.xxx;  
}  
server {  
    listen       80;  

    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://img_servers;
    }

    location ~ ^/img1/ {
        set $memcached_key "$uri";
        memcached_pass img1_memcaches;
        error_page 404 = @imgserver;
    }

    location ~ ^/img2/ {
        set $memcached_key "$uri";
        memcached_pass img2_memcaches;
        error_page 404 = @imgserver;
    }

    location @imgserver {
        proxy_pass http://img.example.com;
    }
}

/img1、/img2配下のファイルをmemcachedでキャッシュ。

サーバ負荷

サーバ構成変更前はiowaitが10〜30%になっていたのが、変更後は0〜1%程度に減少し、I/O待ちはほとんど無くなりました。

さいごに

今のところ22〜24時のピーク時にも画像表示が遅延することはなくなりました。
画像の表示遅延がなくなったことで、ピーク時のPV数が約1.5倍になりました。性能改善でここまでアクセスが上がるならもっと早く対応すれば良かった。
nginxのリバースプロキシ1台、memcachedサーバ2台の計3台追加したことで、サーバ費用は月3〜4万増えました。