Не работает map c переменными $status и $upstream status

YuriV nginx-forum на forum.nginx.org
Вт Авг 2 17:08:13 UTC 2016


Доброго времени суток.
Возникла тут задачка кэшировать на nginx ТОЛЬКО 200-е ответы от апстрима, но
при условии, что поддерживаются заголовки кэширования от бэкэнда. И тут
упёрся в неразрешимую проблему - ни на одной версии nginx, начиная с 1.8.0 и
кончая 1.10.1, на которую только что обновился не работает вот эта
простейшая мапа:

    map $upstream_status $do_cache {
        200     "0";
        default "no-cache";
    }

Сам конфиг выглядит примерно так:

   upstream test {
        server 192.168.1.1;
   }

 proxy_cache_path  /var/cache/nginx/test_cache levels=1:2
keys_zone=test_cache:2048m max_size=35000m inactive=3d;

server
{

        listen 80;
        server_name testapp;

        proxy_cache test_cache;
        proxy_cache_valid 200 3d;
        proxy_cache_valid 301 5s;
        proxy_cache_valid 302 1s;
        proxy_cache_valid 500 1s;
        proxy_cache_use_stale error timeout invalid_header updating;
        #proxy_ignore_headers Expires Cache-Control Set-Cookie;
        #proxy_hide_header Set-Cookie;
        proxy_hide_header Pragma;
        proxy_hide_header X-Powered-By;
        proxy_hide_header X-AspNetMvc-Version;
        proxy_headers_hash_max_size 2048;
        proxy_headers_hash_bucket_size 1024;
        proxy_http_version 1.1;

        proxy_connect_timeout           10;
        proxy_send_timeout              180;
        proxy_read_timeout              60;
        proxy_buffers                   8 16k;
        proxy_buffer_size               32k;
        proxy_busy_buffers_size         64k;
        proxy_temp_file_write_size      64k;
        proxy_cache_key "$host$request_uri$http_origin";
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Connection "";

        access_log /var/log/nginx/test.log cust;

        location / {
                proxy_cache_bypass $do_cache;
                proxy_set_header Host   testapp;
                proxy_pass http://test;
        }

}


Сделал вывод в кустомный лог переменной $do_cache - независимо от статуса,
который приходит с апстрима, она всегда равна дефолту мапы...

10.2.14.219 - - [02/Aug/2016:12:45:52 -0400] "GET /WebForm1.aspx?code=200
HTTP/1.1" 200 594 "-" "no-cache"
10.2.14.219 - - [02/Aug/2016:12:45:52 -0400] "GET /WebForm1.aspx?code=200
HTTP/1.1" 200 585 "-" "no-cache"
10.2.14.219 - - [02/Aug/2016:12:45:52 -0400] "GET /WebForm1.aspx?code=200
HTTP/1.1" 200 591 "-" "no-cache"
10.2.14.219 - - [02/Aug/2016:12:45:56 -0400] "GET /WebForm1.aspx?code=500
HTTP/1.1" 500 674 "-" "no-cache"
10.2.14.219 - - [02/Aug/2016:12:45:58 -0400] "GET /WebForm1.aspx?code=500
HTTP/1.1" 500 674 "-" "no-cache"
10.2.14.219 - - [02/Aug/2016:12:45:58 -0400] "GET /WebForm1.aspx?code=500
HTTP/1.1" 500 674 "-" "no-cache"

Posted at Nginx Forum: https://forum.nginx.org/read.php?21,268695,268695#msg-268695



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