Назад | Перейти на главную страницу

Не удается заставить кеширование nginx работать через обратный прокси https

Как заголовок, я не могу заставить кеширование nginx работать на моем обратном прокси. Вот конфигурация моего серверного блока nginx:

proxy_cache_path /opt/cache/nginx/cache2.xxx.net levels=1:2 keys_zone=test_zone:10m;

server {
    server_name cache2.xxx.net;
    listen 443 ssl http2; #listen for https connections, http2 enabled
    listen 80; # listen for http connections too

    # certificate's stuff
    ssl_certificate /etc/letsencrypt/live/xxx.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxx.net/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;

    # main test location
    location  / {
        # Passed headers
        proxy_set_header  X-Forwarded-For $remote_addr;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_set_header  User-Agent $http_user_agent;
        proxy_set_header  Host $host;
        proxy_set_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,X-Ajax-Referer';

        # Timeouts
        proxy_connect_timeout       20;
        proxy_send_timeout          20;
        proxy_read_timeout          20;
        send_timeout                20;                 

        # Caching directives
        proxy_cache test_zone;
        proxy_cache_background_update off;
        proxy_cache_convert_head on;
        proxy_cache_key "$host$request_uri$request_method";
        proxy_cache_lock off;
        proxy_cache_lock_age 5s;
        proxy_cache_lock_timeout 5s;
        proxy_cache_methods GET HEAD;
        proxy_cache_min_uses 1;
        proxy_cache_use_stale off;
        proxy_cache_valid 200 302 10m;


        if ($scheme = https) {
            add_header "Content-Security-Policy" "upgrade-insecure-requests";
        }

        proxy_pass http://XXX.XXX.XXX.XXX; # remote server, over http
        add_header Caching $upstream_cache_status; # Add an header to show the caching status
   }
}

Кажется, с такой конфигурацией все в порядке. Затем я провел некоторый тест: похоже, кеширование работает с HTTP-трафиком:

curl -D - -o /dev/null -k -s http://cache2.xxx.net/login

Дала мне вот такой результат:

HTTP/1.1 200 OK
Server: xxx-nginx
Date: Fri, 03 Aug 2018 21:54:16 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Caching: HIT

Затем я провел еще один тест, но на этот раз по HTTPS (версия http2, но это не имеет никакого значения, я тоже пробовал без этого), и вот результат:

curl -D - -o /dev/null -k -s https://cache2.xxx.net/login

HTTP/2 200
server: nginx
date: Fri, 03 Aug 2018 21:55:42 GMT
content-type: text/html; charset=UTF-8
content-security-policy: upgrade-insecure-requests

На этот раз заголовок Cacheing полностью отсутствует, потому что переменная $ upstream_cache_status имеет нулевое значение. Но почему?

Еще одна странная вещь, которую я заметил, это то, что HTTP-запрос имеет другой "серверный" заголовок, чем HTTPS.