Nginx không lưu trữ dữ liệu


15

Tôi có API REST đằng sau proxy nginx. Proxy hoạt động tốt, tuy nhiên tôi không thể lưu trữ bất kỳ phản hồi nào. Bất kì sự trợ giúp nào đều được đánh giá cao:

Cấu hình Nginx:

worker_processes  10;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
        proxy_cache_path /path/to/cache/dir keys_zone=one:60m;
        proxy_cache_methods GET HEAD POST;

     upstream backend {
        server server1 backup;
        server server2 weight=5;
    }
    access_log  logs/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       7076;
        server_name  localhost;
        #charset koi8-r;
        access_log  logs/host.access.log;

        location / {
            add_header 'Access-Control-Allow-Origin' *;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

            proxy_cache one;
            proxy_cache_key $host$uri$is_args$args;

            add_header X-Proxy-Cache $upstream_cache_status;

            proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
            proxy_ignore_headers Set-Cookie;
            proxy_ignore_headers Cache-Control;

            proxy_hide_header Cache-Control;
            proxy_hide_header Set-Cookie;
            proxy_pass http://backend;
        }
    }
}

Bất kể tôi đã cố gắng gì, Proxy-Cache luôn quay trở lại dưới dạng MISS:

Tiêu đề yêu cầu là:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:nginxserver:portnumber
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36

Tiêu đề phản hồi là:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type,Accept
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Type:text/plain;charset=UTF-8
Date:Wed, 15 Oct 2014 16:30:18 GMT
Server:nginx/1.7.4
Transfer-Encoding:chunked
X-Proxy-Cache:MISS

Sự nghi ngờ của tôi là đó là một cái gì đó với các tiêu đề khách hàng, nhưng ngay cả khi tôi thực hiện cuộc gọi qua curl và kiểm tra các tiêu đề, không có phản hồi.

Cảm ơn trước


1
Trong tiêu đề yêu cầu: Cache-Control:max-age=0... có nghĩa là "không lưu trữ yêu cầu này."
Nathan C

Có cách nào để tôi bỏ qua điều đó trong tiêu đề máy khách không? Điều này không giải thích lý do tại sao nó không hoạt động thông qua curl mặc dù ....
user2630270

@ user2630270 URL và phương thức yêu cầu ban đầu là gì? Phản ứng trung gian là gì?
Xavier Lucas

@XavierLucas các phương thức cho các tiêu đề ở trên là GET vì tôi hiện đang khắc phục sự cố Chrome. Yêu cầu là một cái gì đó dọc theo dòng nginxserver: port / solr / asd / select? Q = *: *. Tôi không biết làm thế nào để nắm bắt phản ứng trung gian. Tôi có thể tìm thấy hướng dẫn về điều này ở đâu?
dùng2630270

Nếu tôi truy cập ứng dụng trực tiếp mà không qua nginx, với cùng một truy vấn, tôi nhận được các tiêu đề phản hồi sau: Loại nội dung: text / plain; charset = UTF-8 Transfer-Encoding: chunked
user2630270 15/10/14

Câu trả lời:


44

Bạn đã không nói với nginx về thời gian phản hồi hợp lệ và phải được phục vụ từ bộ đệm.

Điều này phải được chỉ định với proxy_cache_validchỉ thị.

proxy_cache one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;

Tuy nhiên, điều này sẽ không hoạt động đối với các yêu cầu POST vì bạn không có khóa bộ đệm khác với yêu cầu POST với một yêu cầu khác trên cùng một URL nếu chúng không có cùng nội dung.

Vì vậy, bạn sẽ cần phải điều chỉnh phím bộ nhớ cache $host$request_uri|$request_body. Bạn sẽ phải theo dõi kích thước bộ đệm ( proxy_cache_paththam số max_size) và bộ đệm phản hồi proxy proxy_buffer_sizeđể phù hợp với nhu cầu của bạn.


Tốt đẹp, cảm ơn người đàn ông! Nó đã làm việc. Muốn nó được ghi lại ở đâu đó một chút rõ ràng hơn.
dùng2630270

Nếu lệnh này không được đặt thì mọi phản hồi sẽ được lưu vào bộ đệm. Nhưng cái này bị ghi đè bởi tiêu đề X-Accel-Expire, Cache-Control hoặc Expire của ứng dụng. Ít nhất, Set-Cookie và Vary có thể tránh được bộ đệm. Những sự thật được phơi bày trong tài liệu. Tôi đã tạo một tập lệnh đơn giản để kiểm tra vì khung của tôi, Laravel, luôn gửi các tiêu đề trên.
Victor Aguilar

15

Từ: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

Cú pháp: proxy_cache_valid [mã ...] thời gian;

...

Các tham số của bộ nhớ đệm cũng có thể được đặt trực tiếp trong tiêu đề phản hồi. Điều này có mức độ ưu tiên cao hơn cài đặt thời gian lưu trữ bằng cách sử dụng lệnh.

  • Trường tiêu đề của X-Accel-Hết hạn Đặt bộ thời gian lưu bộ đệm của phản hồi tính bằng giây. Giá trị 0 sẽ vô hiệu hóa bộ đệm ẩn cho một phản hồi. Nếu giá trị bắt đầu bằng tiền tố @, nó sẽ đặt thời gian tuyệt đối tính bằng giây kể từ Epoch, theo đó phản hồi có thể được lưu trong bộ nhớ cache.
  • Nếu tiêu đề không bao gồm trường X-Accel-Hết hạn, thì các tham số của bộ nhớ đệm có thể được đặt trong các trường tiêu đề
    .
  • Nếu tiêu đề bao gồm trường Nhóm Set-Cookie , thì một phản hồi như vậy sẽ không được lưu vào bộ đệm.
  • Nếu tiêu đề bao gồm trường Varyvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv Nếu tiêu đề bao gồm
    trường Vary Cảnh sát có giá trị khác, phản hồi như vậy sẽ được lưu trong bộ nhớ
    có tính đến các trường tiêu đề yêu cầu tương ứng (1.7.7).

Việc xử lý một hoặc nhiều trường tiêu đề phản hồi này có thể bị vô hiệu hóa bằng cách sử dụng lệnh proxy_ignore_headers .

Hầu hết các ứng dụng web đều đặt Set-Cookietiêu đề, vì vậy phản hồi sẽ không được lưu trong bộ nhớ cache. Để khắc phục điều đó, hãy sử dụng chỉ thị này:

proxy_ignore_headers Set-Cookie;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.