Nginx ไม่ได้แคชข้อมูล


15

ฉันมี REST API อยู่หลังพร็อกซี nginx การมอบฉันทะได้ผลดี แต่ฉันไม่สามารถแคชคำตอบใด ๆ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก:

กำหนดค่า 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;
        }
    }
}

ไม่ว่าฉันจะลองอะไร Proxy-Cache จะกลับมาเป็น MISS:

ส่วนหัวของคำขอคือ:

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

ส่วนหัวของ Reponse คือ:

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

ความสงสัยของฉันคือมันเป็นสิ่งที่มีส่วนหัวของลูกค้า แต่แม้ว่าฉันจะออกสายผ่านทางขดและตรวจสอบส่วนหัวไม่มีการตอบสนอง

ขอบคุณล่วงหน้า


1
ในส่วนหัวคำขอ: Cache-Control:max-age=0... ที่มีความหมายว่า "อย่าแคชคำขอนี้"
นาธาน C

1
มีวิธีที่ฉันจะไม่สนใจในส่วนหัวของลูกค้าหรือไม่? นี้ไม่ได้อธิบายว่าทำไมมันไม่ทำงานผ่านขดทั้ง ....
2630270

@ user2630270 URL & วิธีการร้องขอเริ่มต้นคืออะไร? การตอบสนองระดับกลางคืออะไร?
Xavier Lucas

@XavierLucas วิธีการสำหรับส่วนหัวด้านบนคือ GET เนื่องจากตอนนี้ฉันกำลังแก้ไขปัญหา Chrome คำขอเป็นบางสิ่งบางอย่างตามสายของnginxserver: พอร์ต / solr / asd / select? q = *: * ฉันไม่รู้วิธีจับภาพการตอบกลับระดับกลาง ฉันจะหาคำแนะนำเกี่ยวกับเรื่องนี้ได้ที่ไหน
user2630270

ถ้าฉันตีแอปพลิเคชันโดยตรงโดยไม่ต้องผ่าน nginx ด้วยการค้นหาเดียวกันฉันได้รับส่วนหัวการตอบสนองต่อไปนี้: ประเภทเนื้อหา: ข้อความ / ธรรมดา; charset = การเข้ารหัสการถ่ายโอน UTF-8: chunked
user2630270

คำตอบ:


44

คุณไม่ได้บอก nginx ว่าต้องใช้เวลานานเท่าไรในการตอบสนองที่ถูกต้องและต้องแสดงจากแคช

สิ่งนี้จะต้องระบุด้วยproxy_cache_validคำสั่ง

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

แต่สิ่งนี้จะไม่ทำงานสำหรับคำขอ POST เนื่องจากคุณไม่มีรหัสแคชที่แตกต่างจากคำขอ POST ไปยังอีกรายการหนึ่งใน URL เดียวกันหากไม่มีเนื้อหาเดียวกัน

$host$request_uri|$request_bodyดังนั้นคุณจะต้องปรับคีย์แคช คุณจะต้องตรวจสอบขนาดแคช ( proxy_cache_pathพารามิเตอร์max_size) และบัฟเฟอร์การตอบสนองของพร็อกซีproxy_buffer_sizeเพื่อให้เหมาะกับความต้องการของคุณ


นีซขอบคุณชาย! มันได้ผล หวังว่ามันจะถูกบันทึกไว้ที่ไหนสักแห่งที่ชัดเจนขึ้น
2630270

หากคำสั่งนี้ไม่ได้ตั้งค่าการตอบสนองใด ๆ จะถูกแคช แต่อันนี้ถูกแทนที่ด้วยส่วนหัว X-Accel-Expire, Cache-Control หรือ Expire ของแอพ อย่างน้อย Set-Cookie และ Vary สามารถหลีกเลี่ยงแคชได้ ข้อเท็จจริงเหล่านี้ถูกเปิดเผยในเอกสาร ฉันสร้างสคริปต์ง่าย ๆ เพื่อทดสอบเนื่องจากกรอบงานของฉัน Laravel ส่งส่วนหัวด้านบนเสมอ
Victor Aguilar

16

จาก: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

ไวยากรณ์: เวลา proxy_cache_valid [รหัส ... ];

...

พารามิเตอร์ของการแคชยังสามารถตั้งค่าโดยตรงในส่วนหัวการตอบสนอง สิ่งนี้มีลำดับความสำคัญสูงกว่าการตั้งค่าเวลาแคชโดยใช้คำสั่ง

  • ฟิลด์ส่วนหัว“ X-Accel-Expires” ตั้งค่าเวลาแคชของการตอบสนองเป็นวินาที ค่าศูนย์ปิดใช้งานการแคชสำหรับการตอบสนอง หากค่าเริ่มต้นด้วยคำนำหน้า @ มันจะตั้งค่าเวลาสัมบูรณ์เป็นวินาทีตั้งแต่ Epoch จนถึงการตอบสนองอาจถูกแคช
  • หากส่วนหัวไม่มีฟิลด์“ X-Accel-Expires” พารามิเตอร์ของการแคชอาจถูกตั้งค่าในฟิลด์ส่วนหัว“ Expires” หรือ
    “ Cache-Control”
  • หากส่วนหัวมีฟิลด์“ Set-Cookie”การตอบสนองดังกล่าวจะไม่ถูกแคช
  • หากส่วนหัวมีฟิลด์“ แตกต่างกัน” ที่มีค่าพิเศษ“ *” การตอบสนองดังกล่าวจะไม่ถูกแคช (1.7.7) หากส่วนหัวมี
    ฟิลด์“ แตกต่างกัน” ที่มีค่าอื่นการตอบสนองดังกล่าวจะถูกแคช
    โดยคำนึงถึงฟิลด์ส่วนหัวคำขอที่เกี่ยวข้อง (1.7.7)

การประมวลผลฟิลด์ส่วนหัวการตอบกลับอย่างน้อยหนึ่งฟิลด์สามารถปิดใช้งานได้โดยใช้คำสั่งproxy_ignore_headers

เว็บแอปส่วนใหญ่ตั้งค่าSet-Cookieหัวข้อดังนั้นการตอบกลับจะไม่ถูกแคช หากต้องการแก้ไขให้ใช้คำสั่งนี้:

proxy_ignore_headers Set-Cookie;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.