วิธีการตั้งค่า Nginx เป็น reverse proxy แคชหรือไม่


143

ฉันได้ยินเมื่อเร็ว ๆ นี้ว่า Nginx ได้เพิ่มการแคชลงในคุณลักษณะพร็อกซีย้อนกลับ ฉันมองไปรอบ ๆ แต่ไม่พบข้อมูลมากนัก

ฉันต้องการตั้งค่า Nginx เป็น reverse proxy แคชหน้า Apache / Django: เพื่อให้คำขอพร็อกซี Nginx สำหรับหน้าแบบไดนามิกบางส่วน (แต่ไม่ใช่ทั้งหมด) ไปยัง Apache จากนั้นแคชหน้าที่สร้างขึ้นและให้บริการการร้องขอหน้าถัดไปจากแคชเหล่านั้น

เป็นการดีที่ฉันต้องการทำให้แคชใช้ไม่ได้ใน 2 วิธี:

  1. ตั้งวันที่หมดอายุในรายการที่แคช
  2. เพื่อทำให้รายการที่แคชไว้ใช้ไม่ได้อย่างชัดเจน เช่นถ้าแบ็คเอนด์ Django ของฉันมีการอัพเดทข้อมูลบางอย่างฉันต้องการบอก Nginx ให้ทำการแคชของหน้าเว็บที่ได้รับผลกระทบ

เป็นไปได้ไหมที่จะตั้งให้ Nginx ทำเช่นนั้น? อย่างไร?


ไม่ได้ทดสอบ แต่มาจากgumroad.com/l/ngx_purge : "ngx_purge เป็นโมดูล Lua แท้สำหรับ Nginx ที่อนุญาตให้ผู้ใช้ล้างวัตถุออกจากแคช nginx"
Jaime Hablutzel

คำตอบ:


97

ฉันไม่คิดว่าจะมีวิธีในการทำให้รายการที่แคชไว้ใช้ไม่ได้อย่างชัดเจน แต่นี่เป็นตัวอย่างของวิธีการที่เหลือ อัปเดต:ตามที่ Piotr พูดถึงในคำตอบอื่นมีโมดูลล้างแคชที่คุณสามารถใช้ได้ นอกจากนี้คุณยังสามารถบังคับให้รีเฟรชรายการแคชโดยใช้ nginx's proxy_cache_bypass - ดูคำตอบของ Cherianสำหรับข้อมูลเพิ่มเติม

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

ส่วนหัวควบคุมแคชและหมดอายุ HTTP ของคุณจะได้รับเกียรติดังนั้นหากคุณต้องการกำหนดวันหมดอายุอย่างชัดเจนคุณสามารถทำได้โดยการตั้งค่าส่วนหัวที่ถูกต้องในทุกสิ่งที่คุณต้องการ

มีพารามิเตอร์มากมายที่คุณสามารถปรับได้ - ดูเอกสารประกอบโมดูล nginx Proxy สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้รวมถึงรายละเอียดเกี่ยวกับความหมายของการตั้งค่า / พารามิเตอร์ต่าง ๆ : http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

7
นี่เป็นขั้นตอนแรกที่สมเหตุสมผลสำหรับแอพใหม่ที่ไม่มี 20k / req / s

5
@ ถืออะไรจะเป็นก้าวที่สอง?
Jürgen Paul

42
@Legit - ไม่รู้สิ แต่ตามธรรมเนียมแล้วขั้นตอนสุดท้ายคือ "Profit" :-)
Stephen C

น่าเศร้าที่มันใช้ไม่ได้กับ nginx 1.11 เนื่องจากการอัปเดตครั้งล่าสุดเมื่อประมาณ 3 ปีที่ผ่านมาดูเหมือนว่านี่จะไม่ใช่วิธีแก้ปัญหาอีกต่อไป
izogfif

: inactive=600mหมายความว่าอย่างไร ไม่inactiveควรที่จะมีเวลา? `[inactive=time]
NeverEndingQueue

47

คุณสามารถทำให้หน้าแคชใช้งานไม่ได้โดยเฉพาะ

proxy_cache_bypass       

สมมติว่าคุณต้องการแคชหน้าตั้งค่าแคชด้วยวิธีนี้

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

ตอนนี้เมื่อคุณต้องการทำให้หน้านั้นและแคชอีกครั้งใช้ไม่ได้

ทำการเรียก curl ลับกับส่วนหัว

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

มันจะทำให้ใช้งานไม่ได้และแคช

ทำงานได้จาก nginx 0.7

เป็นโบนัสเพิ่มadd_header X-Cache-Statusสามารถใช้ในการตรวจสอบว่าหน้านั้นมาจากแคชหรือไม่


การดำเนินการนี้สามารถอัปเดตหน้าแคชได้เมื่อหน้าใหม่นั้นสามารถแคชได้เช่นกัน หากคุณลบหน้า (404 หรือข้อผิดพลาดอื่น ๆ ให้บริการโดยส่วนหลัง) ตอนนี้หน้าจะส่ง Set-Cookie หรือส่วนหัว "การควบคุมเนื้อหา: ส่วนตัว" เนื้อหาที่แคชจะไม่ถูก "ทำให้ถูกต้อง"
rbu

36

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

สำหรับคำขอที่สองของคุณการทำให้เป็นโมฆะอย่างชัดเจน คำแนะนำที่รัดกุมของฉันคือการเปลี่ยนชื่อของ url ของทรัพยากรที่คุณต้องการทำให้เป็นโมฆะไม่ว่าจะโดยการเปลี่ยนชื่อไฟล์หรือใช้คิวสตริงบัสเตอร์แคชแบบสอบถาม Varnish มีการPURGEดำเนินการที่จะลบทรัพยากรออกจากแคชของ Varnish แต่จะไม่ให้คุณควบคุมแคชอื่น ๆ ระหว่างคุณและผู้ใช้ ดังที่คุณได้กล่าวไปแล้วว่าคุณต้องการกำจัดทรัพยากรอย่างชัดเจนจากนั้นส่วนหัวควบคุม http มาตรฐานจะไม่ช่วยคุณ ในกรณีที่วิธีที่ผิดพลาดที่สุดในการเอาชนะการแคชของทรัพยากรคือการเปลี่ยนชื่อ


คุณช่วยอธิบายสิ่งที่คุณหมายถึงโดย "เปลี่ยนชื่อไฟล์หรือใช้รูปแบบของแบบสอบถามสตริงมือปราบแคช" ฉันไม่แน่ใจว่าฉันเข้าใจว่าเหตุใดจึงไม่ควรใช้การดำเนินการเช่น PURGE
ต่อเนื่อง

5
+1 สำหรับเคลือบเงา มันดีกว่าเสมอที่จะใช้เครื่องมือที่เหมาะสมสำหรับงาน
Tom O'Connor

4
@ ด้านล่าง: แทบไม่มีความหวังในการสัมผัสวานิชในแง่ของประสิทธิภาพและความสามารถรอบด้าน นี่คือการสนับสนุนจากหนึ่งในผู้นำนักพัฒนาเคอร์เนล FreeBSD และทีมงานเฉพาะในยุโรป วานิชอยู่ในการผลิตที่ twitter, heroku และอื่น ๆ อีกมากมาย

2
ตัวอย่างที่ง่ายที่สุดของแคชบัสเตอร์คือการผนวกหมายเลขรุ่นในสตริงการสืบค้นไปยังทรัพยากรแบบคงที่ดังนั้น style.css จึงกลายเป็น style.css? 123 เมื่อคุณต้องการส่งไฟล์เวอร์ชั่นใหม่ให้คุณเปลี่ยน url ของทรัพยากรเป็น style.css? 124 และตอนนี้แคชจะเก็บเป็นเนื้อหาใหม่ทั้งหมดเพื่อแยกแคช Apache จะให้บริการไฟล์ style.css ด้วยสตริงการสืบค้นใด ๆ ต่อท้ายดังนั้นจึงไม่จำเป็นต้องเปลี่ยนแปลงไฟล์จริง
chmac

3
หากเป็นไปได้ควรวางแคชบัสเตอร์ไว้ในชื่อไฟล์ด้วยตนเองเช่นstyle.v123.cssเนื่องจากแคชบางตัวจะไม่มีการร้องขอแคชที่มีสตริงข้อความค้นหา
Noah McIlraith

8

สำหรับการทำให้เพจที่เลือกไม่ถูกต้องคุณสามารถใช้แพทช์ "cache_purge" สำหรับ nginx-0.8.x ซึ่งทำสิ่งที่คุณต้องการได้)

มีให้ที่นี่แล้ว


8

เครื่องมือแคชส่วนใหญ่ (Citrix) อนุญาตให้ใช้แรงรีเฟรช (Ctrl + r) เพื่อจัดทำหน้าแคชใหม่

นี่เป็นเคล็ดลับที่ฉันพบว่าทำสิ่งที่คล้ายกันใน nginx

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

สิ่งนี้จะถือว่าเมื่อคุณทำ Ctrl + r ในเบราว์เซอร์ของคุณส่วนหัวของ Cache-Control จะมี max-age = 0 ในคำขอ ฉันรู้ว่า Chrome ทำสิ่งนี้ แต่ฉันยังไม่ได้ลองในเบราว์เซอร์อื่น การเพิ่มฟิลด์ส่วนหัวเพิ่มเติมสามารถทำได้ง่ายเพียงแค่เพิ่มคำสั่งเพิ่มเติมที่ตั้งค่า$eacตัวแปรเป็น 1


5

การแคชเป็นฟังก์ชั่นใหม่ที่สวยใน nginx (และยังไม่มีการบันทึกไว้เป็นอย่างดีในตอนนี้) แต่มีความเสถียรเพียงพอที่จะใช้ในการผลิต


4

ฉันเชื่อว่าNginxHttpProxyModuleสามารถทำการร้องขอ http ได้ มองหาคำสั่งที่ขึ้นต้นด้วย:

proxy_cache

ใช่เป็นไปได้ที่จะควบคุมพฤติกรรมแคชผ่านคำสั่งเช่น:

proxy_cache_valid

3

จากความจริงที่ว่าคุณไม่สามารถหาเอกสารได้ฉันจะต้องระมัดระวังเกี่ยวกับการใช้งานเอกสาร คุณคิดว่าวานิชไหม? มันคือ "nginx of reverse proxies" ของฉันเล็กน้ำหนักเบาทำงานหนึ่งอย่างและทำได้ดี


เอกสารอยู่ที่นี่: wiki.nginx.org/NginxHttpProxyModule#proxy_cache
rmalayter

2

หากคุณใช้ eTags ในแอปพลิเคชันของคุณและวาง nginx ไว้ด้านหน้ามันจะดูแลการหมดอายุของคุณเพราะหาก eTag เปลี่ยนไปมันจะทำให้แคชใช้ไม่ได้


จริงๆ? ดูเหมือนว่า ngnix จะตรงกับ etag และไม่เคยพูดถึงแอปพลิเคชันเพื่อดูว่ามี etag ที่อัปเดตหรือไม่
จอห์น Naegle

2

คุณสามารถควบคุมการหมดอายุแคชของ Nginx ได้ด้วยคำสั่ง / พารามิเตอร์หลายรายการ:

  • proxy_cache_valid 200 302 10m;
  • เพิ่มหนึ่งในส่วนหัว HTTP ด้านล่าง (ลำดับความสำคัญมีความสำคัญ - ลองดูโพสต์บล็อกของฉัน ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • inactiveพารามิเตอร์ในproxy_cache_pathคำสั่ง:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

ฉันแนะนำโพสต์บล็อกของฉันหากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการแคช Nginx

หัวข้อการกวาดล้างน่าสนใจจริง ๆ เนื่องจากคุณลักษณะนี้มีเฉพาะใน Nginx Plus (รุ่นโฆษณาของ Nginx) ฉันชอบคำตอบ @ randy-wallace แต่ยังมีความเป็นไปได้อื่น ๆ เช่นโมดูล ngx_cache_purge

สิ่งที่ง่ายที่สุดที่คุณสามารถทำได้คือลบไฟล์แคชด้วยตนเอง:

  • สร้างรหัสแฮชของคุณ:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • ลบไฟล์ออกจากระบบไฟล์:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    

1

สำหรับผู้เยี่ยมชมในอนาคต: ในขณะเดียวกันพร็อกซีย้อนกลับของ nginx ได้ทำการแคชรวมและมีเอกสารอยู่ที่:

ไวยากรณ์: proxy_cache zone | ปิด;

เริ่มต้น: ปิด proxy_cache;

บริบท: http, เซิร์ฟเวอร์, ตำแหน่ง

กำหนดโซนหน่วยความจำแบบแบ่งใช้ที่ใช้สำหรับการแคช โซนเดียวกันนี้สามารถใช้ได้ในหลาย ๆ ที่ ค่าพารามิเตอร์สามารถมีตัวแปร (1.7.9) พารามิเตอร์ off จะปิดใช้งานการแคชที่สืบทอดมาจากระดับการกำหนดค่าก่อนหน้า


สวัสดี Tarik คำถามนี้เจาะจงมากในสิ่งที่ต้องทำให้สำเร็จและมันค่อนข้างเกินกว่า 'เพียงแค่เปิดใช้งานแคช'
asdmin

0
fastcgi_cache_path / opt / nginx-cache levels = 2: 2 keys_zone = img: 50m;

    ที่ตั้ง / img / {
        fastcgi_pass $ แบ็กเอนด์
        รวมถึง fcgi_params;
        ปิด fastcgi_intercept_errors;   
        fastcgi_cache_key $ server_addr $ request_uri;       
        fastcgi_cache img;
        fastcgi_cache_valid 1m ใด ๆ
        fastcgi_hide_header Set-Cookie;
    }

สิ่งนี้จะสร้างแคชสำหรับ / img / location มันอยู่ใน / opt / nginx-cache วัตถุถูกแคชเป็นเวลา 1 นาที

คุณสามารถเขียนรหัสการตอบสนองที่แตกต่างกันแทนใด ๆ

ตอนนี้คุณไม่สามารถทำให้แคชสำหรับหน้าที่เลือกไม่ถูกต้อง บางทีใน 0.8.x มันจะเป็นไปได้


คำถามเดิมเกี่ยวกับการใช้ nginx ต่อหน้า Apache ไม่ใช่หน้าโปรแกรม fastcgi จัดการโดย nginx
เกรแฮม Dumpleton

0

มีปลั๊กอิน nginx ที่เรียกว่าncacheซึ่งอ้างว่าเป็น "ระบบแคชของเว็บบนเว็บเซิร์ฟเวอร์ nginx เร็วขึ้นและมีประสิทธิภาพมากกว่า squid"

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