Nginx ควรอยู่ด้านหน้า HAProxy หรือตรงข้ามหรือไม่?


11

ฉันมีประสบการณ์น้อยในการออกแบบสถาปัตยกรรมโครงสร้างพื้นฐานของเว็บไซต์ ฉันรู้ว่ามันอาจจะเป็นสถานการณ์ที่เฉพาะเจาะจง เว็บไซต์ควรจะ:

1) ต้องการการสนับสนุน HTTPS สำหรับบางหน้า (เช่นหน้าเข้าสู่ระบบ) ในขณะที่หน้าอื่น ๆ เป็นเพียงหน้า HTTP

2) ต้องการเว็บเซิร์ฟเวอร์หลายเครื่องเพื่อให้โหลดบาลานซ์บางตัวจำเป็นต้องมี

3) ต้องการแคชและการบีบอัด HTTP เพื่อเพิ่มประสิทธิภาพ

4) คำขอบางอย่าง (เช่นการอัปโหลดรูปภาพ) ควรกำหนดเส้นทางไปยังเซิร์ฟเวอร์เบื้องหลังเฉพาะ ดังนั้นจำเป็นต้องมีการปรับสมดุลตาม URL

ฉันรู้ว่า NginX และ HAProxy มีทั้ง Reverse Proxy และ / หรือ Load Balancer ที่ดี เนื่องจาก HAProxy ไม่รองรับ SSL ในขณะที่ Nginx load balancing นั้นไม่ดีเท่า HAProxy ฉันจะรับทั้งสองอย่าง

ดังนั้นฉันควรใส่ Nginx (เป็น reverse proxy) ที่ด้านหน้า HAProxy (เป็น load balancer) หรือตรงกันข้าม?

ขอบคุณ

คำตอบ:


7

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

แนวคิดของการใช้ LVS ตามที่wombleกล่าวถึงคือมันค่อนข้างรบกวนน้อยเนื่องจากไม่ได้มีการเชื่อมต่อระหว่างเว็บเซิร์ฟเวอร์ของคุณและไคลเอนต์ที่เข้าถึงเว็บไซต์ ในทางกลับกัน LVS จะให้การโหลดบาลานซ์อย่างง่ายแก่คุณเท่านั้นและจะไม่อนุญาตให้คุณส่งต่อคำขอตามนามสกุลไฟล์ URL ที่ร้องขอส่วนหัวและอื่น ๆ นั่นคือเหตุผลที่ HAProxy ถูกใช้ในหลาย ๆ สถานการณ์

หากคุณต้องการ SSL ในเซิร์ฟเวอร์เดียว (ไม่สมดุลภาระ) คุณจะปลอดภัยที่จะใช้ HAProxy สำหรับทุกสิ่งโดยไม่ใช้ Nginx ในอีกทางหนึ่งคุณจะมีปัญหาหนึ่งที่ไม่สามารถเห็นที่อยู่ IP ของลูกค้าในบันทึก HTTPS ของเว็บเซิร์ฟเวอร์ (เนื่องจาก HAProxy เขียนที่อยู่นั้นใหม่) IP จะอยู่ในบันทึก HAProxy หากคุณเปิดใช้งานแม้ว่า;)


ขอบคุณ ตั้งแต่ "คำขอบางอย่าง (เช่นการอัปโหลดภาพ) ควรส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์โดยเฉพาะดังนั้นจำเป็นต้องมีการปรับสมดุลตาม URL" (ตามที่ฉันอัปเดตคำถาม) LVS อาจไม่ตอบสนองความต้องการของฉัน
Morgan Cheng

BTW การซ่อนที่อยู่ IP โดย HAProxy นั้นใช้สำหรับ HTTPS หรือสำหรับ HTTP เช่นกัน?
Morgan Cheng

@ มอร์แกนการซ่อน IP เป็นเพียง HTTPS

มันใช้สำหรับแบ็กเอนด์โหมด TCP เท่านั้นดังนั้นสิ่งที่ไม่ใช่ HTTP จะไม่เห็นที่อยู่ IP เนื่องจากถูกส่งเป็นส่วนหัว HTTP (X-Forwarded-For)

ไม่แน่นอน Haproxy อาจเชื่อมต่อกับเซิร์ฟเวอร์โดยใช้ที่อยู่ IP ของลูกค้า แต่ต้องใช้ความร่วมมือเคอร์เนล (เช่น: คุณสมบัติ TPROXY) สิ่งนี้ควรหลีกเลี่ยงเมื่อเป็นไปได้
Willy Tarreau


1

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


2
ได้มีการกล่าวว่าการทำโหลดบาลานซ์ NginX นั้นง่ายเพียงแค่เข้าใกล้โรบิน นั่นคือเหตุผลที่ฉันพิจารณา HAProxy
Morgan Cheng

1
ว่ากันว่าถูกต้อง ฉันพูดเอง นั่นเป็นเหตุผลที่ฉันไม่แนะนำให้ใช้ nginx เป็น load balancer และคุณจะไม่พบการพูดถึงการใช้ nginx เป็น load balancer ในคำตอบของฉัน (หรืออื่น ๆ )
womble

นั่นเป็นเพียงถ้าคุณกลัวที่จะใช้คอมไพล์ของคุณเองจากแหล่งที่มา (หรือพอร์ตบน FreeBSD) มีโมดูลบุคคลที่สามหลายรายการที่ปรับปรุงการทำโหลดบาลานซ์: wiki.nginx.org/3rdPartyModules
Martin Fjordvald

2
ปรับปรุงใช่ ทำให้เพียงพอไม่ ความคิดของฉันเกี่ยวกับเรื่องนี้สามารถพบได้ในhezmatt.org/~mpalmer/blog/2011/07/24/… (ค้นหา "not pretty")
womble
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.