Nginx不将缓存的404保存到磁盘

时间:2020-02-07 03:21:30

标签: nginx caching

这是我的nginx配置(使用nginx 1.16.1):

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  100000;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format upstream_time '$remote_addr - $remote_user [$time_local] '
                             '"$request" $status $body_bytes_sent '
                             '"$http_referer" "$http_user_agent"'
                             'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';

    ##
    # Logging Settings
    ##

    error_log /var/log/nginx/error.log warn;
    access_log /var/log/nginx/access.log upstream_time;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;

    #Nginx cache
    proxy_cache_path /nginx_cache/product levels=1:2 keys_zone=product_cache:100m max_size=20g inactive=2d use_temp_path=off;

    #Serve HTML, JS, CSS & Go requests
    server {
        client_max_body_size 102M;

        listen 443 ssl http2;

        server_name example.com;

        root /html;
        index /;

        error_page 404 /404.html;
        error_page 500 /500.html;
        error_page 502 =503 /maintenance.html;

        location = /404.html {
            add_header x-nginx-cache-status $upstream_cache_status always;
        }

        location ~^/([a-zA-Z0-9/]+)$ {
            set $product_id $1;
            rewrite ^ /product?id=$product_id break;
            proxy_cache product_cache;
            proxy_http_version 1.1;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            proxy_cache_background_update on;
            proxy_cache_lock on;
            proxy_cache_key product-$product_id;
            add_header x-nginx-cache-key product-$product_id always;
            add_header x-nginx-cache-status $upstream_cache_status always;
            proxy_cache_valid 200 404 1d;
            proxy_cache_bypass $nocache;
            proxy_ignore_headers Cache-Control; #force cache
            proxy_ignore_headers Set-Cookie; 
            proxy_intercept_errors on;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
            proxy_set_header REQUEST_URI $request_uri;
            proxy_pass http://go:2053;
            proxy_buffer_size 128k;
            proxy_buffers 4 256k;
            proxy_busy_buffers_size 256k;
            error_log /var/log/nginx/error.log;
            access_log /var/log/nginx/access.log;
        }
    }
}

使用此配置,我可以看到404s实际上是第一个请求后的缓存HIT,但是它并未按设置保存在nginx_cache文件夹中。

作为200个响应的其他请求被适当地缓存并按预期方式保存到磁盘。

我也尝试将相同的缓存配置添加到location = /404.html块中,但这对文件是否保存到磁盘没有任何影响。

我猜想这与使用proxy_intercept_errorserror_page覆盖错误页面有关,因此nginx不再使用我设置的参数对其进行缓存。

有没有办法做到这一点?

0 个答案:

没有答案