นี่เป็นเรื่องเกี่ยวกับ HTTP keep-alive ซึ่งอนุญาตให้มีการร้องขอทรัพยากรหลายครั้งผ่านเซสชัน TCP เดียว (และด้วย SSL, เซสชัน SSL เดียว) สิ่งนี้มีความสำคัญอย่างยิ่งต่อประสิทธิภาพของไซต์ SSL เนื่องจากไม่มีการใช้งานแบบ handshake SSL จึงจำเป็นสำหรับแต่ละทรัพยากรที่ร้องขอ
ดังนั้นความกังวลที่นี่คือหนึ่งเซสชันการรักษาใหญ่จากไคลเอนต์ไปจนถึงเซิร์ฟเวอร์ส่วนหลัง มันเป็นสิ่งสำคัญสำหรับการทำงานและเป็นเรื่องของเซิร์ฟเวอร์ HTTP ที่ทันสมัย แต่แพตช์นี้บอกว่ามันไม่รองรับ มาดูกันว่าทำไม ..
เซสชัน keep-alive เป็นเพียงการร้องขออีกครั้งหนึ่งหลังจากที่เซิร์ฟเวอร์เสร็จสิ้นการตอบสนองต่อการร้องขอหนึ่งเซิร์ฟเวอร์ไม่ได้ส่งFIN
แพ็คเก็ตที่จะจบเซสชัน TCP; ลูกค้าสามารถส่งส่วนหัวอีกชุดหนึ่งได้
เพื่อให้เข้าใจว่าแพทช์นั้นกำลังทำอะไรต่อไปนี้เป็นตัวอย่างของการสนทนาแบบต่อเนื่อง:
ลูกค้า:
GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...
เซิร์ฟเวอร์:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>
นี่คือจุดที่การเชื่อมต่อที่ไม่หยุดทำงานจะหยุดลง แต่ยังมีชีวิตอยู่ช่วยให้ลูกค้าเพียงแค่ยิงออกไปอีก:
GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...
สำหรับรหัสลูกค้าในการมอบฉันทะพร็อกซี่ย้อนกลับบางอย่างสามารถเพิ่มในX-Forwarded-For
ส่วนหัวในแต่ละคำขอของลูกค้า ที่บอกเซิร์ฟเวอร์ upstream ว่าคำขอมาจากไหน (แทนทุกคำขอที่เริ่มต้นจาก IP พร็อกซีย้อนกลับ) เพื่อความมีสติในการบันทึกและความต้องการใช้งานอื่น ๆ
X-Forwarded-For
ส่วนหัวจะต้องมีการฉีดเข้าไปในแต่ละคนและทุกคำขอทรัพยากรลูกค้าส่งผ่านการเชื่อมต่อแบบ keep-มีชีวิตอยู่ในขณะที่ส่วนหัวแบบเต็มจะถูกส่งไปในแต่ละครั้ง; การจัดการX-Forwarded-For
ส่วนหัวและการแปลเป็นคำขอ IP "ของจริง" จะดำเนินการตามคำขอต่อไม่ใช่พื้นฐานต่อ TCP-keep-alive-session และเดี๋ยวก่อนอาจมีซอฟต์แวร์ reverse proxy ที่ยอดเยี่ยมที่ใช้เซสชันแบบ keep-alive หนึ่งครั้งเพื่อรับบริการจากลูกค้าหลาย ๆ คน
นี่คือที่แพทช์นี้ล้มเหลว
โปรแกรมแก้ไขที่ไซต์นั้นเฝ้าดูบัฟเฟอร์ของเซสชัน TCP สำหรับการสิ้นสุดของส่วนหัว HTTP ชุดแรกในสตรีมและฉีดส่วนหัวใหม่ลงในสตรีมหลังจากสิ้นสุดส่วนหัวชุดแรกนั้น หลังจากเสร็จสิ้นแล้วจะพิจารณาX-Forwarded-For
งานที่ทำเสร็จและหยุดสแกนเพื่อสิ้นสุดส่วนหัวชุดใหม่ วิธีนี้ไม่มีการรับรู้ถึงส่วนหัวในอนาคตทั้งหมดที่เข้ามาทางคำขอที่ตามมา
โทษพวกเขาไม่ได้จริงๆ stunnel ไม่ได้ถูกสร้างขึ้นเพื่อทำการจัดการและแปลเนื้อหาของสตรีม
ผลกระทบที่จะเกิดขึ้นกับระบบของคุณคือคำขอแรกของสตรีมแบบ keep-alive จะได้รับการX-Forwarded-For
ฉีดส่วนหัวอย่างถูกต้องและคำขอต่อมาทั้งหมดจะทำงานได้ดี - แต่จะไม่มีส่วนหัว
เว้นแต่จะมีแพทช์การฉีดเฮดเดอร์อื่นที่สามารถจัดการคำขอของลูกค้าได้หลายรายการต่อการเชื่อมต่อ (หรือรับอันนี้ tweaked ด้วยความช่วยเหลือของเพื่อนของเราที่ Stack Overflow) คุณอาจต้องดูตัวเลือกอื่น ๆ สำหรับการยกเลิก SSL