Проблемы с кешированием
Алферов Василий
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