การแคชเบราว์เซอร์ Nginx การแคชด้วย Nginx การแคช Nginx

16.12.2021

Nginx สามารถแคชคำขอได้ด้วยตัวเอง ข้อดีของการใช้แคช Nginx คือความเรียบง่ายเมื่อเทียบกับวานิช

จะแคชอะไร?

จุดสำคัญของการแคชเซิร์ฟเวอร์คือการหลีกเลี่ยงการสร้างสคริปต์เดิมอย่างต่อเนื่อง (เช่น ฟีดโพสต์ Wordpress) ซึ่งบางครั้งอาจใช้เวลาทั้งวินาที แอปพลิเคชันจะสร้างเพจขึ้นมาหนึ่งครั้งและผลลัพธ์จะถูกเก็บไว้ในหน่วยความจำแทน เมื่อผู้เยี่ยมชมร้องขอเพจเดิมเป็นครั้งที่สอง จะไม่มีการสร้างอีกต่อไป และไคลเอนต์จะได้รับเวอร์ชันที่เก็บไว้ในหน่วยความจำ นานๆ ครั้ง (เรียกว่า ttl) เวอร์ชันที่บันทึกไว้นี้จะถูกลบและสร้างเวอร์ชันใหม่เพื่อให้ข้อมูลอัปเดตอยู่เสมอ

เกือบทุกไซต์สามารถแคชเพจสำหรับผู้ใช้ที่ไม่ได้รับอนุญาตได้ เหมาะอย่างยิ่งสำหรับไซต์ที่มีเนื้อหาที่เปิดเผยต่อสาธารณะ

การเปิดใช้งานแคชใน Nginx

ก่อนอื่นคุณต้องกำหนดขนาดแคชสูงสุด (ขนาดรวมของเพจทั้งหมดในแคชจะไม่เกินขนาดนี้) ซึ่งทำได้ในไฟล์การตั้งค่าหลัก (nginx.conf) ในส่วน http:

Http ( ... proxy_cache_path /var/cache/nginx ระดับ=1:2keys_zone=all:32m max_size=1g ; ... )

# ตั้งค่าขนาดแคชเป็น 1G เราจะบันทึกไว้ในโฟลเดอร์ /var/cache/nginx

อย่าลืมสร้างโฟลเดอร์แคช mkdir /var/cache/nginx.mkdir

การตั้งค่าโฮสต์

เพื่อให้แคชทำงานได้ เราต้องสร้างโฮสต์ใหม่ที่จะรับฟังบนพอร์ต 80 และย้ายโฮสต์หลักไปยังพอร์ตอื่น (เช่น 81) โฮสต์แคชจะส่งคำขอไปยังโฮสต์หลักหรือให้บริการข้อมูลจากแคช

การแคชเซิร์ฟเวอร์โฮสต์ ( Listen 80; location / ( proxy_pass http://127.0.0.1:81/; proxy_cache all; proxy_cache_valid ใด ๆ 1h; ) )

# แต่ละหน้าจะถูกแคชเป็นเวลา 1 ชั่วโมง

เซิร์ฟเวอร์โฮสต์หลัก ( Listen 81; ตำแหน่ง / ( # fpm ฯลฯ ) )

# กำหนดค่าปกติเฉพาะบนพอร์ต 81

คุกกี้และการปรับเปลี่ยนในแบบของคุณ

ไซต์จำนวนมากใช้บล็อกส่วนตัวต่างๆ บนหน้าเว็บ เทคโนโลยี SSI ช่วยให้สามารถแคชขั้นสูงได้ในกรณีที่มีบล็อกส่วนตัวจำนวนมาก ในกรณีง่ายๆ เราสามารถปิดการใช้งานแคชได้หากผู้ใช้ติดตั้งคุกกี้ไว้

เซิร์ฟเวอร์ ( ฟัง 80; ตำแหน่ง / ( if ($http_cookie ~* ".+") ( set $do_not_cache 1; ) proxy_cache_bypass $do_not_cache; proxy_pass http://127.0.0.1:81/; proxy_cache all; proxy_cache_valid ใด ๆ 1h; ) )

ข้อผิดพลาด

นอกจากนี้ ยังสมเหตุสมผลที่จะเปิดใช้งานการแคชคำขอที่ล้มเหลวในช่วงเวลาสั้นๆ วิธีนี้จะหลีกเลี่ยงความพยายามซ้ำหลายครั้งในการเข้าถึงส่วนที่เสียหายของไซต์

เซิร์ฟเวอร์ ( ฟัง 80; ตำแหน่ง / ( if ($http_cookie ~* ".+") ( set $do_not_cache 1; ) proxy_cache_bypass $do_not_cache; proxy_pass http://127.0.0.1:81/; proxy_cache ทั้งหมด; proxy_cache_valid 404 502 503 1m ; proxy_cache_valid ใด ๆ 1h;

การแคช fastcgi

Nginx ช่วยให้คุณแคชการตอบสนองจาก fastcgi หากต้องการเปิดใช้งานแคชนี้ คุณต้องประกาศพารามิเตอร์ด้วย (ในส่วน http ของไฟล์ nginx.conf):

Fastcgi_cache_path /var/cache/fpm ระดับ=1:2keys_zone=fcgi:32m max_size=1g; fastcgi_cache_key "$scheme$request_method$host$request_uri";

# ตั้งค่าขนาดแคชสูงสุดเป็น 1G

อย่าลืมสร้างโฟลเดอร์ mkdir /var/cache/fpm

ในการกำหนดค่าโฮสต์หลัก ให้เพิ่มกฎการแคช:

เซิร์ฟเวอร์ ( ฟัง 80; ตำแหน่ง ~ \.php$ ( fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; รวม fastcgi_params; fastcgi_cache fcgi; fastcgi_cache_valid 200 60m; ) )

# ในกรณีนี้ เราจะแคชคำตอบด้วยรหัส 200 เป็นเวลา 60 นาที

ที่สำคัญที่สุด

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

เราทุกคนรู้ดีว่าประสิทธิภาพของแอปพลิเคชันและเว็บไซต์เป็นปัจจัยสำคัญต่อความสำเร็จ อย่างไรก็ตาม กระบวนการทำให้แอปพลิเคชันหรือเว็บไซต์ของคุณทำงานได้ดีขึ้นนั้นไม่ได้ชัดเจนเสมอไป แน่นอนว่าคุณภาพของโค้ดและโครงสร้างพื้นฐานเป็นสิ่งสำคัญ แต่ในหลายกรณี คุณสามารถปรับปรุงประสบการณ์ผู้ใช้แอปพลิเคชันของคุณได้อย่างมาก โดยมุ่งเน้นไปที่เทคนิคการส่งมอบแอปพลิเคชันพื้นฐานบางอย่าง ตัวอย่างหนึ่งคือการใช้และเพิ่มประสิทธิภาพแคชในสแต็กแอปพลิเคชันของคุณ โพสต์ในบล็อกนี้ครอบคลุมถึงเทคนิคที่สามารถช่วยให้ผู้ใช้มือใหม่และผู้ใช้ขั้นสูงเห็นประสิทธิภาพที่ดีขึ้นจากการใช้สิ่งที่รวมอยู่ใน NGINX และ NGINX Plus

ภาพรวม

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

อาจมีแคชหลายรายการระหว่างเว็บเบราว์เซอร์และแอปพลิเคชันเซิร์ฟเวอร์: แคชของเบราว์เซอร์ไคลเอ็นต์ แคชตัวกลาง เครือข่ายการจัดส่งเนื้อหา (CDN) และโหลดบาลานเซอร์หรือพร็อกซีย้อนกลับที่อยู่ด้านหน้าเซิร์ฟเวอร์แอปพลิเคชัน การแคช แม้ในระดับพร็อกซีย้อนกลับ/โหลดบาลานเซอร์ ก็สามารถปรับปรุงประสิทธิภาพได้อย่างมาก

ตัวอย่างเช่น ปีที่แล้วฉันรับหน้าที่ปรับแต่งประสิทธิภาพของเว็บไซต์ที่โหลดช้า สิ่งแรกๆ ที่ฉันสังเกตเห็นคือใช้เวลามากกว่า 1 วินาทีในการสร้างหน้าแรกหลัก หลังจากการดีบัก ฉันค้นพบว่าเนื่องจากเพจถูกทำเครื่องหมายว่าไม่สามารถแคชได้ จึงถูกสร้างขึ้นแบบไดนามิกเพื่อตอบสนองต่อคำขอแต่ละรายการ ตัวเพจไม่ได้เปลี่ยนแปลงบ่อยนักและไม่ได้ปรับให้เป็นแบบส่วนตัว ดังนั้นจึงไม่จำเป็น จากการทดลอง ฉันทำเครื่องหมายให้หน้าแรกถูกแคชไว้เป็นเวลา 5 วินาทีโดยตัวจัดสรรภาระงาน และการทำเช่นนั้นส่งผลให้มีการปรับปรุงที่เห็นได้ชัดเจน เวลาในการไบต์แรกลดลงเหลือสองสามมิลลิวินาทีและหน้าเว็บโหลดเร็วขึ้นอย่างเห็นได้ชัด

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

วิธีการตั้งค่าและกำหนดค่าการแคชพื้นฐาน

จำเป็นต้องใช้เพียงสองคำสั่งเท่านั้นในการเปิดใช้งานการแคชพื้นฐาน: proxy_cache_path และ proxy_cache คำสั่ง proxy_cache_path กำหนดเส้นทางและการกำหนดค่าของแคช และคำสั่ง proxy_cache จะเปิดใช้งาน

proxy_cache_path /path/to/cache ระดับ = 1:2keys_zone=my_cache:10m max_size=10g ไม่ใช้งาน=60m use_temp_path=off; เซิร์ฟเวอร์ ( # ... ตำแหน่ง / ( proxy_cache my_cache; proxy_pass http://my_upstream; ) )

พารามิเตอร์ของคำสั่ง proxy_cache_path กำหนดการตั้งค่าต่อไปนี้:

  • ไดเร็กทอรีดิสก์ในเครื่องสำหรับแคชเรียกว่า /path/to/cache/
  • ระดับจะตั้งค่าลำดับชั้นไดเรกทอรีสองระดับภายใต้ /path/to/cache/ การมีไฟล์จำนวนมากในไดเร็กทอรีเดียวอาจทำให้การเข้าถึงไฟล์ช้าลง ดังนั้นเราขอแนะนำลำดับชั้นไดเร็กทอรีสองระดับสำหรับการปรับใช้ส่วนใหญ่ หากไม่รวมพารามิเตอร์ระดับ NGINX จะใส่ไฟล์ทั้งหมดไว้ในไดเร็กทอรีเดียวกัน
  • Keys_zone ตั้งค่าโซนหน่วยความจำที่ใช้ร่วมกันสำหรับจัดเก็บคีย์แคชและข้อมูลเมตา เช่น ตัวจับเวลาการใช้งาน การมีสำเนาของคีย์ในหน่วยความจำทำให้ NGINX สามารถระบุได้อย่างรวดเร็วว่าคำขอนั้นเป็น HIT หรือ MISS โดยไม่ต้องไปที่ดิสก์ ทำให้การตรวจสอบเร็วขึ้นอย่างมาก โซน 1-MB สามารถจัดเก็บข้อมูลได้ประมาณ 8,000 คีย์ ดังนั้นโซน 1-MB ที่กำหนดค่าไว้ในตัวอย่างสามารถจัดเก็บข้อมูลได้ประมาณ 80,000 คีย์
  • max_size กำหนดขีดจำกัดสูงสุดของขนาดของแคช (ในตัวอย่างนี้คือ 10 กิกะไบต์) มันเป็นทางเลือก; การไม่ระบุค่าจะทำให้แคชขยายเพื่อใช้พื้นที่ดิสก์ที่มีอยู่ทั้งหมด เมื่อขนาดแคชถึงขีดจำกัด กระบวนการที่เรียกว่า ผู้จัดการแคชลบไฟล์ที่ใช้งานล่าสุดเพื่อให้ขนาดแคชกลับมาต่ำกว่าขีดจำกัด
  • inactive ระบุระยะเวลาที่รายการสามารถอยู่ในแคชโดยไม่ต้องเข้าถึง ในตัวอย่างนี้ ไฟล์ที่ไม่ได้ถูกร้องขอเป็นเวลา 60 นาทีจะถูกลบออกจากแคชโดยอัตโนมัติโดยกระบวนการตัวจัดการแคช โดยไม่คำนึงว่าจะหมดอายุหรือไม่ก็ตาม ค่าเริ่มต้นคือ 10 นาที (10 นาที) เนื้อหาที่ไม่ใช้งานแตกต่างจากเนื้อหาที่หมดอายุ NGINX จะไม่ลบเนื้อหาที่หมดอายุโดยอัตโนมัติตามที่กำหนดโดยส่วนหัวการควบคุมแคช (เช่น Cache-Control:max-age=120) เนื้อหาที่หมดอายุ (เก่า) จะถูกลบเฉพาะเมื่อไม่สามารถเข้าถึงได้ตามเวลาที่ระบุโดย inactive เมื่อมีการเข้าถึงเนื้อหาที่หมดอายุ NGINX จะรีเฟรชจากเซิร์ฟเวอร์ต้นทางและรีเซ็ตตัวจับเวลาที่ไม่ได้ใช้งาน
  • ขั้นแรก NGINX จะเขียนไฟล์ที่กำหนดไว้สำหรับแคชลงในพื้นที่จัดเก็บข้อมูลชั่วคราว และคำสั่ง use_temp_path=off จะสั่งให้ NGINX เขียนไฟล์เหล่านั้นลงในไดเร็กทอรีเดียวกันกับที่ไฟล์เหล่านั้นจะถูกแคช เราขอแนะนำให้คุณตั้งค่าพารามิเตอร์นี้เป็นปิดเพื่อหลีกเลี่ยงการคัดลอกข้อมูลที่ไม่จำเป็นระหว่างระบบไฟล์ use_temp_path เปิดตัวใน NGINX เวอร์ชัน 1.7.10 และ .

และสุดท้าย คำสั่ง proxy_cache จะเปิดใช้งานการแคชเนื้อหาทั้งหมดที่ตรงกับ URL ของบล็อกตำแหน่งหลัก (ในตัวอย่าง / ) คุณยังสามารถรวมคำสั่ง proxy_cache ในบล็อกเซิร์ฟเวอร์ได้ ใช้กับบล็อกตำแหน่งทั้งหมดสำหรับเซิร์ฟเวอร์ที่ไม่มีคำสั่ง proxy_cache ของตัวเอง

การส่งเนื้อหาแคชเมื่อแหล่งกำเนิดสินค้าหยุดทำงาน / ( # ... proxy_cache_use_stale ข้อผิดพลาดหมดเวลา http_500 http_502 http_503 http_504; )

ด้วยการกำหนดค่าตัวอย่างนี้ หาก NGINX ได้รับข้อผิดพลาด หมดเวลา หรือข้อผิดพลาด 5xx ที่ระบุจากเซิร์ฟเวอร์ต้นทาง และมีไฟล์ที่ร้องขอในเวอร์ชันเก่าในแคช จะส่งไฟล์เก่าแทนการถ่ายทอดข้อผิดพลาดไปยัง ลูกค้า.

การปรับแต่งแคชอย่างละเอียดและปรับปรุงประสิทธิภาพ

NGINX มีการตั้งค่าเสริมมากมายสำหรับปรับแต่งประสิทธิภาพของแคชอย่างละเอียด นี่คือตัวอย่างที่เปิดใช้งานบางส่วน:

Proxy_cache_path /path/to/cache ระดับ=1:2keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; เซิร์ฟเวอร์ ( # ... ตำแหน่ง / ( proxy_cache my_cache; proxy_cache_revalidate บน; proxy_cache_min_uses 3; proxy_cache_use_stale ข้อผิดพลาดหมดเวลาอัปเดต http_500 http_502 http_503 http_504; proxy_cache_พื้นหลัง_update บน; proxy_cache_lock เปิด; proxy_pass http://my_upstream; ) )

คำสั่งเหล่านี้กำหนดค่าลักษณะการทำงานต่อไปนี้:

  • proxy_cache_revalidate สั่งให้ NGINX ใช้คำขอ GET แบบมีเงื่อนไขเมื่อรีเฟรชเนื้อหาจากเซิร์ฟเวอร์ต้นทาง หากไคลเอนต์ร้องขอรายการที่ถูกแคชไว้แต่หมดอายุตามที่กำหนดโดยส่วนหัวการควบคุมแคช NGINX จะรวมฟิลด์ If-Modified-Since ไว้ในส่วนหัวของคำขอ GET ที่ส่งไปยังเซิร์ฟเวอร์ต้นทาง ซึ่งจะช่วยประหยัดแบนด์วิธ เนื่องจากเซิร์ฟเวอร์จะส่งรายการทั้งหมดเฉพาะในกรณีที่ได้รับการแก้ไขตั้งแต่เวลาที่บันทึกไว้ในส่วนหัว Last-Modified ที่แนบมากับไฟล์เมื่อ NGINX แคชไว้ในตอนแรก
  • proxy_cache_min_uses กำหนดจำนวนครั้งที่ไคลเอ็นต์จะต้องร้องขอก่อนที่ NGINX จะแคช สิ่งนี้มีประโยชน์หากแคชถูกเติมเต็มอย่างต่อเนื่อง เนื่องจากจะช่วยให้แน่ใจว่าจะมีการเพิ่มเฉพาะรายการที่เข้าถึงบ่อยที่สุดลงในแคช โดยค่าเริ่มต้น proxy_cache_min_uses จะถูกตั้งค่าเป็น 1
  • พารามิเตอร์การอัปเดตเป็นคำสั่ง proxy_cache_use_stale รวมกับการเปิดใช้งานคำสั่ง proxy_cache_พื้นหลัง_update สั่งให้ NGINX ส่งเนื้อหาเก่าเมื่อไคลเอนต์ร้องขอรายการที่หมดอายุหรืออยู่ในกระบวนการอัปเดตจากเซิร์ฟเวอร์ต้นทาง การอัปเดตทั้งหมดจะดำเนินการในเบื้องหลัง ไฟล์เก่าจะถูกส่งกลับสำหรับคำขอทั้งหมดจนกว่าไฟล์ที่อัพเดตจะถูกดาวน์โหลดอย่างสมบูรณ์
  • เมื่อเปิดใช้งาน proxy_cache_lock หากไคลเอนต์หลายตัวร้องขอไฟล์ที่ไม่ปัจจุบันในแคช (MISS) เฉพาะคำขอแรกเท่านั้นที่ได้รับอนุญาตผ่านไปยังเซิร์ฟเวอร์ต้นทาง ส่วนที่เหลือรอให้คำขอนั้นตอบสนองคำขอแล้วดึงไฟล์ออกจากแคช หากไม่เปิดใช้งาน proxy_cache_lock คำขอทั้งหมดที่ส่งผลให้แคชหายไปจะส่งตรงไปยังเซิร์ฟเวอร์ต้นทาง
การแยกแคชไปยังฮาร์ดไดรฟ์หลายตัว

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

Proxy_cache_path /path/to/hdd1 ระดับ=1:2keys_zone=my_cache_hdd1:10m max_size=10g ไม่ใช้งาน=60m use_temp_path=off; proxy_cache_path /path/to/hdd2 ระดับ = 1:2keys_zone=my_cache_hdd2:10m max_size=10g ไม่ใช้งาน=60m use_temp_path=off; split_clients $request_uri $my_cache ( 50% “my_cache_hdd1”; 50% “my_cache_hdd2”; ) เซิร์ฟเวอร์ ( # ... ตำแหน่ง / ( proxy_cache $my_cache; proxy_pass http://my_upstream; ) )

คำสั่ง proxy_cache_path สองคำสั่งกำหนดแคชสองตัว (my_cache_hdd1 และ my_cache_hdd2) บนฮาร์ดไดรฟ์สองตัวที่แตกต่างกัน บล็อกการกำหนดค่า split_clients ระบุว่าผลลัพธ์จากคำขอครึ่งหนึ่ง (50%) ถูกแคชไว้ใน my_cache_hdd1 และอีกครึ่งหนึ่งใน my_cache_hdd2 แฮชที่อิงตามตัวแปร $request_uri (URI คำขอ) จะกำหนดว่าแคชใดที่จะใช้สำหรับแต่ละคำขอ ผลลัพธ์ก็คือคำขอสำหรับ URI ที่กำหนดจะถูกแคชไว้ในแคชเดียวกันเสมอ

โปรดทราบว่าวิธีนี้ใช้แทนการตั้งค่าฮาร์ดไดรฟ์ RAID ไม่ได้ หากมีความล้มเหลวของฮาร์ดไดรฟ์ อาจนำไปสู่พฤติกรรมที่คาดเดาไม่ได้ในระบบ รวมถึงผู้ใช้ที่เห็นรหัสตอบกลับ 500 รายการสำหรับคำขอที่ส่งไปยังฮาร์ดไดรฟ์ที่ล้มเหลว การตั้งค่าฮาร์ดไดรฟ์ RAID ที่เหมาะสมสามารถรับมือกับความล้มเหลวของฮาร์ดไดรฟ์ได้

คำถามที่พบบ่อย (FAQ)

ส่วนนี้จะตอบคำถามที่พบบ่อยเกี่ยวกับการแคชเนื้อหา NGINX

แคช NGINX สามารถติดตั้งได้หรือไม่? add_header X-Cache-สถานะ $upstream_cache_status;

ตัวอย่างนี้เพิ่มส่วนหัว HTTP X-Cache-Status ในการตอบสนองต่อไคลเอ็นต์ ต่อไปนี้เป็นค่าที่เป็นไปได้สำหรับ $upstream_cache_status :

NGINX กำหนดได้อย่างไรว่าจะแคชบางอย่างหรือไม่?

ตามค่าเริ่มต้น NGINX เคารพส่วนหัว Cache-Control จากเซิร์ฟเวอร์ต้นทาง จะไม่แคชการตอบสนองโดยตั้งค่า Cache-Control เป็น Private , No-Cache หรือ No-Store หรือด้วย Set-Cookie ในส่วนหัวการตอบกลับ NGINX แคชเฉพาะคำขอไคลเอ็นต์ GET และ HEAD คุณสามารถแทนที่ค่าเริ่มต้นเหล่านี้ได้ตามที่อธิบายไว้ในคำตอบด้านล่าง

proxy_cache_methods รับ HEAD POST;

ตัวอย่างนี้เปิดใช้งานการแคชคำขอ POST

NGINX สามารถแคชเนื้อหาไดนามิกได้หรือไม่

ใช่ โดยมีเงื่อนไขว่าส่วนหัว Cache-Control อนุญาต การแคชเนื้อหาไดนามิกแม้ในช่วงเวลาสั้นๆ สามารถลดภาระบนเซิร์ฟเวอร์ต้นทางและฐานข้อมูล ซึ่งปรับปรุงเวลาเป็นไบต์แรก เนื่องจากไม่จำเป็นต้องสร้างเพจใหม่สำหรับแต่ละคำขอ

ฉันสามารถเจาะรูผ่านแคชของฉันได้หรือไม่? ตำแหน่ง / ( proxy_cache_bypass $cookie_nocache $arg_nocache; # ... )

คำสั่งนี้จะกำหนดประเภทคำขอที่ NGINX ร้องขอเนื้อหาจากเซิร์ฟเวอร์ต้นทางทันที แทนที่จะพยายามค้นหาในแคชก่อน บางครั้งเรียกว่า "การเจาะรู" ผ่านแคช ในตัวอย่างนี้ NGINX ดำเนินการตามคำขอที่มีคุกกี้หรืออาร์กิวเมนต์ nocache เช่น http://www.example.com/?nocache=true NGINX ยังสามารถแคชการตอบสนองผลลัพธ์สำหรับคำขอในอนาคตที่ไม่ถูกข้าม

NGINX ใช้คีย์แคชอะไร

รูปแบบเริ่มต้นของคีย์ที่ NGINX สร้างขึ้นจะคล้ายกับแฮช MD5 ของตัวแปร NGINX ต่อไปนี้ : $scheme$proxy_host$request_uri ; อัลกอริธึมจริงที่ใช้นั้นซับซ้อนกว่าเล็กน้อย

Proxy_cache_path /path/to/cache ระดับ=1:2keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; เซิร์ฟเวอร์ ( # ... ตำแหน่ง / ( proxy_cache my_cache; proxy_pass http://my_upstream; ) )

สำหรับการกำหนดค่าตัวอย่างนี้ คีย์แคชสำหรับ http://www.example.org/my_image.jpg จะถูกคำนวณเป็น md5(“http://my_upstream:80/my_image.jpg”)

หากต้องการเปลี่ยนตัวแปร (หรือคำศัพท์อื่น) ที่ใช้เป็นพื้นฐานสำหรับคีย์ ให้ใช้คำสั่ง proxy_cache_key (ดูคำถามต่อไปนี้ด้วย)

ฉันสามารถใช้คุกกี้เป็นส่วนหนึ่งของคีย์แคชของฉันได้หรือไม่

ใช่ คุณสามารถกำหนดค่าคีย์แคชให้เป็นค่าใดๆ ก็ได้ เช่น:

proxy_cache_key $proxy_host$request_uri$cookie_jessionid;

ตัวอย่างนี้รวมค่าของคุกกี้ JSESSIONID ไว้ในคีย์แคช รายการที่มี URI เดียวกันแต่ค่า JSESSIONID ต่างกันจะถูกแคชแยกกันเป็นรายการที่ไม่ซ้ำ

NGINX ใช้ส่วนหัว ETag หรือไม่ NGINX จัดการกับ Pragma Header อย่างไร

ไคลเอ็นต์เพิ่มส่วนหัว Pragma:no-cache เพื่อข้ามแคชตัวกลางทั้งหมดและตรงไปยังเซิร์ฟเวอร์ต้นทางเพื่อดูเนื้อหาที่ร้องขอ NGINX ไม่ให้เกียรติส่วนหัวของ Pragma ตามค่าเริ่มต้น แต่คุณสามารถกำหนดค่าคุณสมบัติด้วยคำสั่ง proxy_cache_bypass ต่อไปนี้:

ตำแหน่ง /images/ ( proxy_cache my_cache; proxy_cache_bypass $http_pragma; # ... )

NGINX รองรับส่วนขยายเก่าขณะตรวจสอบใหม่และเก่าหากเกิดข้อผิดพลาดในส่วนหัว Cache-Control หรือไม่ NGINX รองรับ Vary Header หรือไม่ อ่านเพิ่มเติม

มีหลายวิธีที่คุณสามารถปรับแต่งและปรับแต่งแคช NGINX ได้ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการแคชด้วย NGINX โปรดดูแหล่งข้อมูลต่อไปนี้:

  • เอกสารอ้างอิง ngx_http_proxy_module มีตัวเลือกการกำหนดค่าทั้งหมดสำหรับการแคชเนื้อหา
  • มีสัมมนาผ่านเว็บสองรายการตามความต้องการและศึกษาข้อมูลส่วนใหญ่ที่นำเสนอในบล็อกโพสต์นี้: และ
  • คู่มือผู้ดูแลระบบ NGINX Plus มีตัวอย่างการกำหนดค่าเพิ่มเติมและข้อมูลเกี่ยวกับการปรับแต่งแคช NGINX
  • หน้าผลิตภัณฑ์ประกอบด้วยภาพรวมเกี่ยวกับวิธีกำหนดค่าการล้างแคชด้วย NGINX Plus และแสดงตัวอย่างอื่นๆ ของการปรับแต่งแคช
  • eBook ให้ข้อมูลเจาะลึกเกี่ยวกับการแคชเนื้อหา NGINX อย่างละเอียด

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

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

รูปภาพสไตล์ CSS และ Javascript ถูกแคชไว้ การแคชเบราว์เซอร์ Nginx ถูกนำมาใช้โดยการเพิ่มส่วนหัวการควบคุมแคช

ในส่วนหัว ข้อมูลบริการจะถูกส่งจากเซิร์ฟเวอร์ไปยังเบราว์เซอร์ไคลเอ็นต์ ซึ่งเบราว์เซอร์จะเรียนรู้เมื่อจำเป็นต้องบันทึกข้อมูลบางประเภท และระยะเวลาที่จะเก็บไว้ในหน่วยความจำ

การแคชเบราว์เซอร์ Nginx

ในไฟล์การกำหนดค่า Nginx การแคช JS/CSS ถูกเปิดใช้งานดังนี้ (มีการเพิ่มส่วนขยายอื่น ๆ แล้ว - ในทางปฏิบัติ ควรแคชทั้งหมดไว้จะดีกว่า):

เซิร์ฟเวอร์ (

ตำแหน่ง ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ (
หมดอายุสูงสุด;
รูต /home/เว็บไซต์/example.com/;
}

}

หมดอายุสูงสุดหมายความว่า TTL ถูกตั้งค่าเป็นอนันต์ และหากไฟล์บนเซิร์ฟเวอร์มีการเปลี่ยนแปลง ไคลเอนต์จะไม่มีทางรู้เรื่องนี้เลย เนื่องจากจะไม่มีการส่งคำขอซ้ำ

หมดอายุ (ส่วนหัวนี้จะกล่าวถึงด้านล่าง) กำหนดว่าเบราว์เซอร์จะอัปเดตแคชเมื่อใด ค่าจะถูกตั้งเป็นวินาที

โดยปกติแล้ว ค่าสูงสุดที่หมดอายุจะถูกตั้งค่าในการกำหนดค่าเซิร์ฟเวอร์ จากนั้นในแอปพลิเคชัน เมื่อเชื่อมต่อไฟล์ css และ js เวอร์ชันจะถูกกำหนด ซึ่งควรเปลี่ยนทุกครั้งที่อัปเดตเนื้อหา

การระบุส่วนหัวแคชระดับแอปพลิเคชัน

เซิร์ฟเวอร์ในกรณีนี้จะรับรู้แต่ละเวอร์ชันใหม่เป็นไฟล์ใหม่ที่เพิ่มเข้ามา และจะแคชไฟล์นั้น

นอกเหนือจาก Cache-Control แล้ว ส่วนหัว Expires มักถูกระบุ - บังคับวันที่และเวลาที่เบราว์เซอร์จะรีเซ็ตแคชที่มีอยู่ ครั้งถัดไปที่ผู้ใช้ติดต่อ ข้อมูลที่อัปเดตจะถูกโหลดลงในแคชอีกครั้ง

ส่วนหัว HTTP Expires เพิ่มเติมระบุวันที่และเวลาที่เบราว์เซอร์ควรอัปเดตแคช (ส่วนหัวสามารถใช้ร่วมกันได้ Expires มีค่าน้อยกว่าเมื่อใช้ทั้งสองส่วนหัว):

ส่วนหัวทั้งสองสามารถตั้งค่าได้ในโค้ดระดับแอปพลิเคชัน

เปิดใช้งานการแคชใน PHP

โครงการเว็บส่วนใหญ่เขียนด้วยภาษา PHP ใน PHP ส่วนหัว Cache-control และ Expires HTTP ได้รับการตั้งค่าดังนี้: