1. หนึ่งในแคชดั้งเดิม (404)
วิธีนี้คือการนำข้อผิดพลาด 404 ของ nginx ไปยังแบ็กเอนด์ จากนั้นใช้ proxy_store เพื่อบันทึกเพจที่ส่งคืนโดยแบ็กเอนด์
การกำหนดค่า:
ที่ตั้ง/{
root /home/html/;#Home ไดเร็กทอรี
หมดอายุ 1d;#เวลาหมดอายุของหน้าเว็บ
error_page 404 =200 /fetch$request_uri;#404 นำไปยังไดเร็กทอรี /fetch
-
location /fetch/ {#404ตรงมาที่นี่
ภายใน;#บ่งชี้ว่าไดเร็กทอรีนี้ไม่สามารถเข้าถึงภายนอกได้โดยตรง
หมดอายุ 1d;#เวลาหมดอายุของหน้าเว็บ
alias /home/html/;#The ที่อยู่ระบบไฟล์ไดเรกทอรีเสมือนจะต้องสอดคล้องกับตำแหน่ง /, proxy_store จะบันทึกไฟล์ลงในไดเรกทอรีนี้
proxy_pass http://www.sudone.com/;#ที่อยู่อัปสตรีมของแบ็กเอนด์ /fetch ก็เป็นพร็อกซีเช่นกัน
proxy_set_header ยอมรับการเข้ารหัส '';# ปล่อยให้แบ็กเอนด์ไม่ส่งคืนเนื้อหาที่ถูกบีบอัด ( gzip หรือ deflate) การบันทึกเนื้อหาที่บีบอัดจะทำให้เกิดปัญหา
proxy_store on;#Specify nginx เพื่อบันทึกไฟล์ที่ส่งคืนโดยพรอกซี
proxy_temp_path /home/tmp;#Temporary directory ไดเร็กทอรีนี้จะต้องอยู่ในพาร์ติชันฮาร์ดดิสก์เดียวกันกับ /home/html
-
เมื่อใช้งาน โปรดทราบว่า nginx ต้องมีสิทธิ์ในการเขียนไฟล์ไปที่ /home/tmp และ /home/html ภายใต้ Linux โดยทั่วไป nginx จะได้รับการกำหนดค่าให้ทำงานในฐานะผู้ใช้ none ดังนั้น ทั้งสองไดเร็กทอรีนี้จะต้องไม่ถูกตั้งค่าไว้ เพื่อเป็นเอกสิทธิ์ของผู้ใช้ที่ไม่มีใครใช้ แน่นอนว่าคุณสามารถใช้ chmod 777 ได้เช่นกัน แต่ผู้ดูแลระบบที่มีประสบการณ์ทุกคนจะแนะนำว่าอย่าใช้ 777 แบบไม่ได้ตั้งใจ
2. แคชดั้งเดิม 2 (!-e)
หลักการพื้นฐานเหมือนกับการกระโดด 404 แต่กระชับกว่า:
ที่ตั้ง/{
รูท /home/html/;
proxy_store บน;
proxy_set_header ยอมรับการเข้ารหัส '';
proxy_temp_path /home/tmp;
ถ้า ( !-f $request_filename )
-
proxy_pass http://www.sudone.com/;
-
-
คุณจะเห็นว่าการกำหนดค่านี้บันทึกโค้ดได้จำนวนมากเมื่อเทียบกับ 404 โดยจะใช้ !-f เพื่อตรวจสอบว่าไฟล์ที่ร้องขอมีอยู่ในระบบไฟล์หรือไม่ หากไม่มีอยู่ proxy_pass ไปยังแบ็กเอนด์ และการส่งคืนจะถูกบันทึกโดยใช้ด้วย proxy_store.
แคชแบบดั้งเดิมทั้งสองมีข้อดีและข้อเสียเหมือนกันโดยพื้นฐาน:
ข้อเสีย 1: ไม่รองรับลิงก์ไดนามิกที่มีพารามิเตอร์ เช่น read.php?id=1 เนื่องจาก nginx บันทึกเฉพาะชื่อไฟล์ ลิงก์นี้จึงถูกบันทึกเป็น read.php ในระบบไฟล์เท่านั้น เพื่อให้ผู้ใช้เข้าถึงการอ่าน php?id= 2 จะส่งกลับผลลัพธ์ที่ไม่ถูกต้อง ในขณะเดียวกันก็ไม่รองรับโฮมเพจในรูปแบบ http://www.sudone.com/ และไดเร็กทอรีรอง http://www.sudone.com/download/ เพราะ nginx ซื่อสัตย์มากและจะเขียน คำขอดังกล่าวลงในไฟล์ตามลิงก์ของระบบ และลิงก์นี้เป็นไดเร็กทอรีอย่างชัดเจน ดังนั้นการบันทึกจึงล้มเหลว ในกรณีเหล่านี้ จำเป็นต้องเขียนใหม่เพื่อบันทึกอย่างถูกต้อง
ข้อเสีย 2: ไม่มีกลไกในการหมดอายุของแคชและการล้างข้อมูลภายใน nginx ไฟล์แคชเหล่านี้จะถูกเก็บไว้อย่างถาวรในเครื่อง หากมีสิ่งต่างๆ มากมายที่ต้องแคช ไฟล์นั้นจะเต็มพื้นที่ฮาร์ดดิสก์ทั้งหมด เพื่อจุดประสงค์นี้ คุณสามารถใช้เชลล์สคริปต์เพื่อทำความสะอาดเป็นประจำ และคุณสามารถเขียนโปรแกรมไดนามิก เช่น php เพื่อทำการอัพเดตแบบเรียลไทม์ได้
ข้อเสีย 3: สามารถแคชรหัสสถานะได้เพียง 200 รหัสเท่านั้น ดังนั้นรหัสสถานะเช่น 301/302/404 ที่ส่งคืนโดยแบ็กเอนด์จะไม่ถูกแคช หากลิงก์หลอกแบบคงที่ที่มีการเข้าชมจำนวนมากถูกลบ ลิงก์นั้นจะดำเนินต่อไป ทะลุเข้าไปทำให้ท้ายรถรับแรงกดดันได้มาก
ข้อเสียที่ 4: nginx จะไม่เลือกหน่วยความจำหรือฮาร์ดดิสก์เป็นสื่อบันทึกข้อมูลโดยอัตโนมัติ ทุกอย่างถูกกำหนดโดยการกำหนดค่า แน่นอนว่าในระบบปฏิบัติการปัจจุบันจะมีกลไกการแคชไฟล์ระดับระบบปฏิบัติการดังนั้นจึงไม่จำเป็นต้องทำ กังวลมากเกินไปเกี่ยวกับการอ่านพร้อมกันจำนวนมากหากถูกจัดเก็บไว้ในฮาร์ดดิสก์ io เกิดปัญหาด้านประสิทธิภาพ
ข้อบกพร่องของแคชแบบเดิมของ nginx ก็คือคุณสมบัติที่แตกต่างจากซอฟต์แวร์แคชเช่น Squid ดังนั้นจึงถือได้ว่าเป็นข้อได้เปรียบเช่นกัน ในแอปพลิเคชันที่ใช้งานจริง มักใช้เป็นพันธมิตรกับ Squid มักจะไม่สามารถบล็อกลิงก์ด้วย ? ได้ แต่ nginx สามารถบล็อกการเข้าถึงได้ เช่น: http://sudone.com/? com / จะถือเป็นสองลิงก์บน Squid ดังนั้นมันจะทำให้เกิดการเจาะสองครั้ง ในขณะที่ nginx จะบันทึกเพียงครั้งเดียว ไม่ว่าลิงก์จะกลายเป็น http://sudone.com/?1 หรือ http://sudone.com/ ?123 ไม่สามารถแคชโดย nginx ได้ จึงปกป้องโฮสต์แบ็กเอนด์ได้อย่างมีประสิทธิภาพ
nginx จะบันทึกแบบฟอร์มลิงก์ไปยังระบบไฟล์อย่างซื่อสัตย์ ดังนั้นคุณสามารถตรวจสอบสถานะแคชและเนื้อหาบนเครื่องแคชได้อย่างง่ายดาย และคุณยังสามารถร่วมมือกับตัวจัดการไฟล์อื่น ๆ เช่น rsync ได้อย่างง่ายดาย เป็นโครงสร้างระบบไฟล์โดยสมบูรณ์
แคชดั้งเดิมทั้งสองนี้สามารถบันทึกไฟล์ไปที่ /dev/shm ภายใต้ Linux ได้ เพื่อให้หน่วยความจำระบบสามารถใช้สำหรับการแคชได้ หากใช้หน่วยความจำ เนื้อหาที่หมดอายุจะถูกล้างเร็วขึ้นมาก เมื่อใช้ /dev/shm/ นอกเหนือจากการชี้ไดเร็กทอรี tmp ไปยังพาร์ติชัน /dev/shm แล้ว หากมีไฟล์และไดเร็กทอรีขนาดเล็กจำนวนมาก คุณยังต้องแก้ไขจำนวน inodes และความจุสูงสุดของหน่วยความจำนี้ด้วย พาร์ติชัน:
mount -o size=2500M -o nr_inodes=480000 -o noatime, nodiratime -o remount /dev/shm
คำสั่งข้างต้นใช้กับเครื่องที่มีหน่วยความจำ 3G เนื่องจากหน่วยความจำสูงสุดเริ่มต้นคือครึ่งหนึ่งของหน่วยความจำระบบ ซึ่งก็คือ 1500M คำสั่งนี้จะเพิ่มเป็น 2500M ในเวลาเดียวกัน จำนวน shm inodes ของระบบอาจไม่เพียงพอโดยค่าเริ่มต้น แต่สิ่งที่น่าสนใจคือสามารถปรับได้ตามต้องการ การปรับที่นี่คือ 480000 ซึ่งค่อนข้างอนุรักษ์นิยม แต่โดยพื้นฐานแล้วก็เพียงพอแล้ว
3. แคชตาม แคช mem d
nginx มีการรองรับ memcached บ้าง แต่ฟังก์ชั่นไม่ได้แข็งแกร่งเป็นพิเศษ และประสิทธิภาพยังคงดีมาก
ตำแหน่ง /mem/ {
ถ้า ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
-
ตั้ง $memcached_key "$1";
memcached_pass 192.168.1.2:11211;
-
หมดอายุ 70;
-
การกำหนดค่านี้จะชี้ http://sudone.com/mem/abc ไปที่คีย์ abc ของ memcached เพื่อดึงข้อมูล
ขณะนี้ nginx ไม่มีกลไกในการเขียนไปยัง memcached ดังนั้นการเขียนข้อมูลไปยัง memcached จะต้องดำเนินการโดยใช้ภาษาไดนามิกในเบื้องหลัง คุณสามารถใช้ 404 เพื่อนำทางไปยังแบ็กเอนด์เพื่อเขียนข้อมูลได้
4. อิงตาม ncache ปลั๊กอินของบริษัทอื่น
ncache เป็นโปรเจ็กต์ที่ดีที่พัฒนาโดย Sina Brothers มันใช้ nginx และ memcached เพื่อใช้ฟังก์ชันบางอย่างที่คล้ายกับ Squid caching
http://code.google.com/p/ncache/
5. ฟังก์ชั่น proxy_cache ที่พัฒนาขึ้นใหม่ของ nginx
เริ่มต้นจากเวอร์ชัน nginx-0.7.44 nginx รองรับฟังก์ชันแคชที่เป็นทางการมากขึ้นซึ่งคล้ายกับ Squid แคชนี้ยังอยู่ในขั้นตอนการพัฒนาและการสนับสนุนค่อนข้างจำกัด แคชนี้จะบันทึกลิงก์หลังจากแฮชด้วยการเข้ารหัส md5 ดังนั้นจึงสามารถรองรับได้ ลิงก์ใดก็ได้ ขณะเดียวกัน ยังรองรับสถานะที่ไม่ใช่ 200 เช่น 404/301/302 อีกด้วย
การกำหนดค่า:
ขั้นแรกให้กำหนดค่าพื้นที่แคช:
proxy_cache_path /path/to/cache ระดับ = 1:2keys_zone=NAME:10m ไม่ใช้งาน=5m max_size=2m clean_time=1m;
โปรดทราบว่าการกำหนดค่านี้อยู่นอกแท็กเซิร์ฟเวอร์ ระดับระบุว่าพื้นที่แคชมีไดเร็กทอรีแฮชสองระดับ ไดเร็กทอรีระดับแรกคือ 1 ตัวอักษร และระดับที่สองคือ 2 ตัวอักษร ชื่อไฟล์ที่บันทึกไว้จะคล้ายกับ /path/ to/cache /c/29/b7f54b2df7773722d382f4809d65029c;keys_zone ให้ชื่อพื้นที่นี้ 10m หมายถึงขนาดพื้นที่ที่ไม่ใช้งานคือ 5m หมายถึงเวลาแคชเริ่มต้นคือ 5 นาที หมายความว่าไฟล์เดียวที่เกิน 2m จะไม่ถูกแคช clean_time ระบุหนึ่งนาทีล้างแคชหนึ่งครั้ง
ที่ตั้ง/{
proxy_pass http://www.sudone.com/;
proxy_cache NAME;#ใช้ NAME Keys_zone
proxy_cache_valid 200 302 1h;#200 และ 302 รหัสสถานะจะถูกบันทึกไว้เป็นเวลา 1 ชั่วโมง
proxy_cache_valid 301 1d;รหัสสถานะ #301 ถูกบันทึกไว้เป็นเวลาหนึ่งวัน
proxy_cache_valid ใด ๆ 1m;#Others จะถูกบันทึกไว้เป็นเวลาหนึ่งนาที
-