การทำความเข้าใจกับคำสั่ง nginx proxy_cache_path


30

สมมติว่าฉันมีไฟล์ config nginx นี้

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
  • อะไรkeys_zone=myCache:8mหมายถึง? มีไม่มากที่พูดถึงในเอกสาร:

นอกจากนี้คีย์ที่ใช้งานและข้อมูลเกี่ยวกับข้อมูลทั้งหมดจะถูกเก็บไว้ในโซนหน่วยความจำที่ใช้ร่วมกันซึ่งมีชื่อและขนาดที่กำหนดค่าโดยพารามิเตอร์ keys_zone

  • เกิดอะไรขึ้นถ้าproxy_cache_valid( 12h) สูงกว่าที่ระบุinactiveค่า ( 1h) ในproxy_cache_path? กฎใดที่จะเป็นไปตาม เช่น

    proxy_cache_valid 200 302 12h;
    proxy_cache_valid 404 302 1h;
    

ขอบคุณ!

คำตอบ:


39

keys_zone = myCache: 8m หมายถึงอะไร

ตามที่เอกสารระบุไว้ nginx จะเก็บคีย์ที่ใช้งานและข้อมูลเกี่ยวกับข้อมูลทั้งหมดไว้ในโซนหน่วยความจำที่ใช้ร่วมกันซึ่งnameและsizeกำหนดค่าโดยพารามิเตอร์ keys_zone เป็นเรื่องของความสมบูรณ์ให้แบ่งลงต่อส่วน

  • /var/cache/nginxเป็นที่สำหรับเก็บแคชจริง ข้างในโฟลเดอร์ไฟล์แคชเป็นไฟล์ไบนารี่ แต่คุณสามารถมองเห็นแท็ก html ได้อย่างง่ายดาย
  • levels=1:2 คือระดับพารามิเตอร์ตั้งค่าจำนวนระดับไดเรกทอรีย่อยในแคช
  • keys_zone=myCache:8mกำลังกำหนดเขตหน่วยความจำที่แชร์ที่ชื่อว่า myCache ด้วยขนาดสูงสุด 8 MB มันถือคีย์ที่ใช้งานและเมตาดาต้าของแคชทั้งหมด ดังนั้นเมื่อใดก็ตามที่ nginx ตรวจสอบว่าหน้าถูกแคชหรือไม่มันจะพิจารณาโซนหน่วยความจำที่ใช้ร่วมกันก่อนจากนั้นจึงค้นหาตำแหน่งของแคชจริงใน/var/cache/nginxถ้ามีอยู่แคช
  • max_size มีขนาดแคชสูงสุดเช่นขนาดไฟล์ที่เปิด /var/cache/nginxเปิด
  • inactive=1hระบุแคชเวลาที่ไม่ใช้งานสูงสุดสามารถจัดเก็บได้ ข้อมูลแคชที่ไม่ได้เข้าถึงในช่วงเวลาที่ระบุโดยinactiveพารามิเตอร์จะถูกลบออกจากแคชโดยไม่คำนึงถึงความสดใหม่

การตรวจสอบและการลบแคชทำงานอย่างไร

นำมาจากรายการส่งจดหมายของ nginx

  • Directive proxy_cache_validระบุว่าการตอบสนองนั้นจะใช้เวลานานเท่าไร (และจะถูกส่งคืนโดยไม่มีการร้องขอให้แบ็กเอนด์) หลังจากเวลานี้การตอบกลับจะถูกพิจารณาว่า "เก่า" และจะไม่ถูกส่งคืนหรือจะขึ้นอยู่กับการตั้งค่าproxy_cache_use_stale

  • อาร์กิวเมนต์ที่ไม่แอ็คทีฟของproxy_cache_pathระบุระยะเวลาที่การตอบสนองจะถูกเก็บไว้ในแคชหลังจากใช้งานครั้งสุดท้าย โปรดทราบว่าแม้การตอบกลับค้างจะได้รับการพิจารณาเมื่อเร็ว ๆ นี้หากมีการร้องขอไปยังพวกเขา

อย่างที่ฉันเข้าใจนี่คือรหัสเทียมว่า nginx ทำงานอย่างไร

เมื่อมีคำขอมา

if cache.exist AND (now() - cache.first_retrieved) < proxy_cache_valid:
    use it
else:
    retrieve from backend
    replace the old ones

ในกระบวนการอื่น ๆ ตัวจัดการแคชดำเนินการกับตรรกะนี้

if (now() - cache.last_used) > inactive:
    del cache

if all-cache.size > max-size:
    del *the most inactive cache* until size < max-size

เกิดอะไรขึ้นถ้า proxy_cache_valid (12h) สูงกว่าค่า inactive ที่ระบุ (1h) ใน proxy_cache_path

ตราบใดที่คำขอและเข้าถึงแคชเฉพาะวัตถุแคชนั้นจะยังคงใช้งานได้จนถึง 12 ชั่วโมงหลังจากที่วัตถุนั้นใส่แคช หลังจากนั้นแคชก็ถือว่าไม่ถูกต้องดังนั้น nginx จะดึงข้อมูลจากแบ็กเอนด์และรีเซ็ตตัวจับเวลาที่ถูกต้อง แต่ถ้าวัตถุไม่ได้ใช้งาน (ไม่ได้เข้าถึง) มากกว่าหนึ่งชั่วโมง - แม้ในช่วงเวลาที่ถูกต้องแคช 12 ชั่วโมง -, nginx จะลบเพราะinactiveพารามิเตอร์


"หลังจากนั้นแคชก็ถือว่าไม่ถูกต้องดังนั้น nginx จะดึงข้อมูลจากแบ็กเอนด์และรีเซ็ตตัวจับเวลาที่ถูกต้อง" - นั่นดูน่าสนใจ. ดังนั้น nginx ดึงคำขอแม้ว่าไม่มีผู้ใช้ดึงข้อมูลหรือไม่ ตัวอย่างเช่นหากไม่ได้ใช้งาน365dและถูกต้อง1dแล้ว nginx จะดึงคำขอในแคชในแต่ละวันเป็นเวลาหนึ่งปีแม้ว่าจะไม่มีใครทำคำขอนั้นหรือไม่
Martin Thoma

1
คำตอบที่ดี แต่ฉันไม่สามารถหาเอกสารใด ๆ ในหน่วยวัดที่เราใช้กับพารามิเตอร์เหล่านี้ ตัวอย่างเช่นinactiveparams ใช้ค่าเวลา แต่ฉันไม่เห็นค่าใดที่ฉันสามารถใช้นอกเหนือจากh(ประมาณ 1 เดือนหรือ 1 วันหรือไม่ ฯลฯ ) แล้วเราควรระบุmax_sizeอะไร? ไบต์? ฉันสามารถใช้ 1M สำหรับ 1 เมกะไบต์ได้หรือไม่
Sunil D.

4
@SunilD - ไปเลย: nginx.org/en/docs/syntax.html
adamczi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.