การตอบกลับอัปสตรีมจะถูกบัฟเฟอร์ในไฟล์ชั่วคราว


61

ฉันมี (ข้อมูลที่ซับซ้อนที่ซับซ้อนส่วนหน้า) ค่อนข้างใหญ่และช้าโปรแกรมประยุกต์บนเว็บในการสร้างRoRและให้บริการโดยPumaมีnginxพร็อกซี่เป็นแบบย้อนกลับ เมื่อดูที่nginxบันทึกข้อผิดพลาดฉันเห็นรายการบางอย่างเช่น:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

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

ฉันรู้proxy_max_temp_file_sizeและตั้งค่าเป็น 0 แต่ดูเหมือนว่าฉันจะอึดอัดเล็กน้อย (พร็อกซีของฉันพยายามที่จะบัฟเฟอร์ แต่ไม่มีไฟล์ที่จะบัฟเฟอร์ไปที่ ... วิธีที่จะเร็วขึ้น?)

คำถามของฉันคือ:

  1. ฉันจะลบ [เตือน] และหลีกเลี่ยงการตอบกลับบัฟเฟอร์ได้อย่างไร จะดีกว่าถ้าปิดproxy_bufferingหรือตั้งค่าproxy_max_temp_file_sizeเป็น 0 ทำไม?

  2. หากnginxบัฟเฟอร์การตอบสนอง: มันจะให้บริการการตอบสนองบัฟเฟอร์ใครและทำไม?

  3. ทำไมถึงnginxเปิดproxy_bufferingโดยค่าเริ่มต้นแล้ว [เตือน] คุณถ้ามันบัฟเฟอร์การตอบสนองจริง

  4. การตอบสนองจะทริกเกอร์ตัวเลือกนั้นเมื่อใด เมื่อใดที่ใช้เวลา> บางวินาที (เท่าไหร่?) ในการตอบสนอง สามารถกำหนดค่านี้ได้หรือไม่

TIA, ngw


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

คำตอบ:


75

1) ฉันจะลบ [เตือน] และหลีกเลี่ยงการตอบกลับบัฟเฟอร์ได้อย่างไร ควรปิด proxy_buffering หรือตั้ง proxy_max_temp_file_size เป็น 0 ดีกว่าหรือไม่ ทำไม?

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

2) ถ้า nginx บัฟเฟอร์การตอบสนองเมื่อใดมันจะให้บริการการตอบกลับบัฟเฟอร์ใครและทำไม

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

ดูเพิ่มเติมที่: http://aosabook.org/en/nginx.html

3) ทำไม nginx เปิด proxy_buffering โดยค่าเริ่มต้นแล้ว [เตือน] คุณถ้ามันบัฟเฟอร์การตอบสนองจริง?

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

Nginx จะเตือนคุณเมื่อการตอบสนองไม่พอดีกับบัฟเฟอร์หน่วยความจำที่ตั้งค่าไว้เท่านั้น คุณอาจเพิกเฉยต่อคำเตือนหากว่ามันใช้ได้สำหรับคุณ

4) การตอบสนองจะกระตุ้นตัวเลือกนั้นเมื่อใด? เมื่อใช้เวลา> กว่าบางวินาที (เท่าไหร่?) ในการตอบสนอง สามารถกำหนดค่านี้ได้หรือไม่

มันก่อให้เกิดเมื่อบัฟเฟอร์หน่วยความจำเต็ม โปรดดูที่เอกสารอธิบายกลไกทั้งหมด: http://nginx.org/r/proxy_max_temp_file_size

คุณอาจต้องการเพิ่มบัฟเฟอร์หน่วยความจำ


5
สำหรับ # 1 การลบขีด จำกัด ขนาดของไฟล์ชั่วคราวจะป้องกันการเตือนบัฟเฟอร์อย่างไร ฉันไม่คิดว่ามันถูกต้องเพราะฉันมีชุดคำสั่งนี้เป็น 0 และยังคงได้รับคำเตือน
Phil

คำตอบนี้ไม่ชัดเจนพอที่จะดีกว่าเพื่อให้ได้ประสิทธิภาพการตั้งค่าproxy_max_temp_file_sizeการ0หรือนี้เป็นเพียงวิธีการที่จะนำคำเตือนว่า?
Offir Pe'er

12

การกำหนดค่าต่อไปนี้ทำงานได้ดีบนเซิร์ฟเวอร์ของฉัน

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

2
คำสั่งที่สองซ้ำซ้อนคือ16kในบรรทัดแรกทำเหมือนกันกับบรรทัดที่สองหรือไม่
EoghanM

1
@EoghanM ตามเอกสารไม่มี Proxy_Buffer_size (บัฟเฟอร์ไม่พหูพจน์) นำไปใช้กับส่วนแรกของการตอบสนองพร็อกซีเซิร์ฟเวอร์ (aka Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response headerส่วนหัว) Proxy_buffers สำหรับการตอบกลับที่เหลือ
CDE

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