在 nginx 中缓存 HTTPS 响应

在 nginx 中缓存 HTTPS 响应

我想https://example.com用 nginx 缓存来自(SSL/TLS!)的响应,因此基本上是一个缓存 10 分钟响应的正向代理。

我正在使用docker图像,因为它已经ngx_http_proxy_connect_module实现了。

目前我已经这样设置:

user www-data;
worker_processes auto;
events { }

http {
    server_names_hash_bucket_size 128;


    log_format cache_log '$remote_addr - $upstream_cache_status [$time_local]  '
                    '"$request" $status $body_bytes_sent '
                    'URI: $request_uri - duration: "$request_time';

    access_log /var/log/nginx_access.log cache_log;
    error_log /var/log/nginx_errors.log;


    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=inventory_cache:10m max_size=10g;

    server {
        listen       8888;
        server_name  xyz.com;
        proxy_connect;
        proxy_max_temp_file_size 0;
        resolver 8.8.8.8;
        location / {
           proxy_cache inventory_cache;
           add_header X-Cache-Status $upstream_cache_status;
           proxy_pass https://$http_host;
           proxy_set_header Host $http_host;
        }
    }

    # Everything else is denied
    server {
        listen       8888;
        server_name ~.+;
        return 404;
    }

}

我希望 $upstream_cache_status 显示缓存状态,但是它总是这样,-所以我猜测缓存没有发生。

这可能是由于 SSL/TLS 造成的吗?我尝试提供ssl_certificatessl_certificate_key但随后出现了错误:未知指令ssl_certificate

我更喜欢使用普通的 nginx docker-image 的解决方案,但我无法传递 https 请求。对于我现在使用的图像,https 代理可以工作,但缓存不起作用。

因此,任何缓存 HTTPS 服务器响应的解决方案都是受欢迎的。我想知道这是否不可能?

或者换句话说:如果我无法控制的 HTTPS 服务器没有启用缓存,我该如何为自己启用它?

答案1

是的,你可以在 中执行此操作nginx,但你的问题是由你使用的特定配置引起的,你必须更改配置方式SSL/TLS

user www-data;
worker_processes auto;
events { }

http {
    server_names_hash_bucket_size 128;

    log_format cache_log '$remote_addr - $upstream_cache_status [$time_local]  '
                    '"$request" $status $body_bytes_sent '
                    'URI: $request_uri - duration: "$request_time';

    access_log /var/log/nginx_access.log cache_log;
    error_log /var/log/nginx_errors.log;

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=inventory_cache:10m max_size=10g;

    server {
        listen       8888 ssl;
        server_name  xyz.com;

        ssl_certificate /path/to/your/certificate.crt;
        ssl_certificate_key /path/to/your/private.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384';
        ssl_prefer_server_ciphers on;

        location / {
           proxy_cache inventory_cache;
           add_header X-Cache-Status $upstream_cache_status;
           proxy_pass https://$http_host;
           proxy_set_header Host $http_host;
        }
    }

    # Everything else is denied
    server {
        listen       8888;
        server_name ~.+;
        return 404;
    }
}

一定要更换/path/to/your/certificate.crt/path/to/your/private.key

如果仍然不起作用,您可以在location块中添加以下内容

proxy_ignore_headers Cache-Control;
proxy_ignore_headers Set-Cookie;

相关内容