Nginx не сохраняет кэшированные 404 на диск - PullRequest
1 голос
/ 07 февраля 2020

Вот моя конфигурация 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 block, но это никак не повлияло на то, был ли файл сохранен на диск.

Я предполагаю, что это связано с переопределением страницы ошибки с использованием proxy_intercept_errors и error_page, поэтому nginx больше не кэширует его, используя параметры, которые я установил.

Есть ли способ добиться этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...