Проблемы с кешированием

Алферов Василий vasilii.alferov на gmail.com
Пт Апр 2 14:34:09 MSD 2010


Добрый день!

Используем nginx 0.7.65 для нашего проекта. (~100к pageviews/сутки, до
150 мб/сек отдача файлов)
Поскольку одно из направление - файлообменник, изображения в
оформлении сайта хранятся в нами же разработанном кластерном бекэнде.
Он позволяет отдавать много больших файлов на хорошей скорости, но к
сожалению пока не удалось полностью победить некоторые задержки при
отдаче файлов.
Поэтому решили использовать nginx для кеширования картинок на веб-страничках.
Одновременно работает 2 nginxа и 6 бекэндов на разных машинах
При запросе картинок, которые нужно кешировать nginx добавляет
заголовок. Бекэнд, увидев этот заголовок возвращает либо картинку,
если она у него есть, либо x-accel-redirect на другой бекэнд, где
должна лежать эта картинка.

Все работает, но есть один неприятный баг:
периодически (примерно 1 раз в сутки) в кеш попадает вместо нужной
картинки другая.
При сверке акссесс-логов найти виновника не удалось.
Может ли это происходить из-за nginx, или может посоветуете, как лучше
отладить запросы между nginx и бекэндом?

Вот конфиг: example.com
server {
        listen   80;
        server_name  d1.example.com d2.example.com  d3.example.com;

        access_log  /var/log/nginx/d1-3.access.log main;

        location ~ ^/([^.]+\.example.com)/files/(\d+) {
                proxy_pass http://$1:80;
                proxy_redirect off;

                proxy_cache img;
                proxy_cache_key "$3";
                proxy_cache_valid 200 60m;
                proxy_cache_valid 404 301 302 1m;

                proxy_buffering on;
                proxy_buffers 4 8k;

                expires      30d;

                internal;
        }

        location ~ /files/(\d+) {
                proxy_pass http://backends/files/$1;
                proxy_set_header X-CacheRequest yes;

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

                proxy_cache img;
                proxy_cache_key "$1";
                proxy_cache_valid 200 60m;
                proxy_cache_valid 404 301 302 1m;

                proxy_buffering on;
                proxy_buffers 32 1m;
        }


        location / {
                proxy_pass      http://apache;
                proxy_set_header        Host $http_host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For
$proxy_add_x_forwarded_for;
                proxy_redirect          off

                set $m "";
                set $i "";

                if ( -f /etc/nginx/offline ) {
                    set $m T;
                }

                if ($remote_addr = 'ХХ.ХХ.ХХ.ХХ') {
                    set $i "${m}";
                }

                # allow from our ip address
                if ($i) { break; }

                # return 503 to others
                if ($m) {
                    return 503;
                }

                if ($http_user_agent ~* 'MSIE') {
                        expires             -1;
                        add_header          Cache-Control no-cache;
                        add_header          Pragma no-cache;
                }
        }

        location ~* robots.txt$ {
                return 404;
        }

        # 404, 50x
        include /etc/nginx/conf.d/common/404.conf;
        include /etc/nginx/conf.d/common/50x.conf;
}


Подробная информация о списке рассылки nginx-ru