Nginx缓存目录为空

Nginx cache directory is empty

我在 Ubuntu 16.04 (xenial) 上使用 Nginx v1.17.6 作为 缓存反向代理 侦听 443 并将请求代理到 backend 上游。其他 example_ip 使用与此服务器相同的配置。 backend 服务器在端口 888 上相互通信,该端口用于通过 负载平衡器 (LB) 在它们之间交换缓存。 (LB 也用于对文件服务器的代理请求)。 这是我的 nginx.conf :

user www-data www-data;
worker_processes 8;
pid /run/nginx.pid;
worker_rlimit_nofile 3000;
thread_pool one threads=16 max_queue=1000;

http {

        ##
        # Basic Settings
        ##
        map_hash_bucket_size 128;
        sendfile on;
        tcp_nopush off;
        tcp_nodelay on;
        keepalive_timeout 5;
        server_tokens off;

        add_header X-Content-Type-Options nosniff;
        client_body_buffer_size 0;
        client_max_body_size 1;
        client_header_buffer_size 1k;
        large_client_header_buffers 2 1k;

        include /etc/nginx/mime.types;

        proxy_cache_path /mnt/sdc keys_zone=hard_cache:2048m levels=1:2 inactive=12h
                                        max_size=100G use_temp_path=off;
        proxy_cache_path /mnt/sdb keys_zone=ssd_cache:2048m levels=1:2 inactive=12h
                                        max_size=150G use_temp_path=off;
        map $request_uri $cache {
                ~^\/v4\/4a35e4a4o\/avatar\/.*$ ssd_cache;
                ~^\/v4\/82ca5e4ai\/succh\/.*$ ssd_cache;
                ~^\/v4\/115a5e4ac\/sucrt1\/.*$ ssd_cache;
                ~^\/v4\/8766e82ca5e4v\/mc\/.*$ ssd_cache;
                ~^\/v4\/66e82ca5e4n\/luctw\/.*$ ssd_cache;
                ~^\/v4\/23e82ca5e4d\/luc1tq\/.*$ hard_cache;
                ~^\/v4\/9266e82ca5e4s\/lcuq\/.*$ hard_cache;
                ~^\/v4\/32e82ca5e4l\/euid\/.*$ hard_cache;
                ~^\/v4\/4466e82ca5e4b\/edjp\/.*$ hard_cache;
        }

        upstream backend {
           hash $request_uri consistent;
           server example_ip1:888 max_fails=50;
           server example_ip2:888 max_fails=50;
           server example_ip3:888 max_fails=50;
           server example_ip4:888 max_fails=50;
        }

        server {
                listen     *:443 ssl backlog=2048 reuseport ;
                ssl_trusted_certificate ....;
                ssl_certificate    .....;
                ssl_certificate_key ....;

                location / {
                        proxy_pass http://backend;
                        proxy_next_upstream      error  timeout  invalid_header  http_500;
                        proxy_connect_timeout  3;
                        proxy_buffering on;
                }
       }

       server {
                listen   *:888 backlog=4096 reuseport;

                location / {
                        proxy_set_header Host $host;
                        proxy_set_header User-Agent $http_user_agent;
                        proxy_set_header X-Forwarded-Proto https;
                        proxy_set_header X-Forwarded-Port 443;
                        proxy_buffering on;
                        proxy_buffer_size 1024k;
                        proxy_buffers   4 8m;
                        proxy_cache $cache;
                        aio threads=one;
                        directio 2m;
                        aio_write on;
                        proxy_pass http://LB-ip-address;
                        proxy_max_temp_file_size 0;
                        proxy_cache_valid 200 10d;
                        proxy_cache_valid 500 501 502 503 504 505 1s;
                        proxy_cache_valid 401 402 403 404 1s;
                        proxy_connect_timeout 15;
                        proxy_cache_min_uses 1;
                }
        }

        log_format default_format'$remote_addr - $remote_user [$time_local] '
                             '"$request" $status $body_bytes_sent '
                             '"$http_referer" "$http_user_agent" '
                             'rt=$request_time ucs="$upstream_cache_status" '
        access_log /var/log/nginx/access.log default_format;
        error_log /var/log/nginx/error.log;
}

我已经在 /mnt/sdb/mnt/sdc 上安装了一个磁盘,它被 proxy_cache_path 指令用于缓存存储。

查看 access.log 文件时,upstream_cache_status"-"-"-"-"-"-"-"-54= 或 "MISS" 但没有任何东西获得 "HIT" 状态。

proxy_buffering 指令也是 on 基于 this 答案。

此外,我已经将chown -R www-data:www-datachmod -R 776设置为/mnt/sdb/mnt/sdc,但这些目录中没有任何内容(列出[=的内容25=] 例如):

root@cdn:/etc/nginx# ls -lart /mnt/sdb
total 24
drwxr-xr-x 9 root     root      4096 Dec  5 02:52 ..
drwxrw-rw- 2 www-data www-data 16384 Dec  7 05:35 lost+found
drwxrw-rw- 3 www-data www-data  4096 Dec  7 05:35 .

此配置适用于 v1.14.0 并进行缓存! This是两个相同配置的版本差异。

总结: ssl 卸载正确,后端服务器(文件服务器)的响应正确返回给用户,但缓存没有发生!!

谢谢! :)

问题是因为 Set-Cookie header。添加这些指令以忽略 Set-Cookie header 后,缓存成功运行:

proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";

在nginx v.1.14.0中,没有Set-Cookie header,但它有效,这很奇怪!