ประโยชน์ของการใช้ Nginx หน้าเว็บเซิร์ฟเวอร์สำหรับ Go คืออะไร? [ปิด]


86

ฉันกำลังเขียนบริการเว็บเซิร์ฟเวอร์ที่ส่งคืนข้อมูล JSON ซึ่งมีผู้ใช้จำนวนมาก

ประโยชน์ของการใช้ Nginx ต่อหน้าเซิร์ฟเวอร์ของฉันเมื่อเทียบกับการใช้ go http server คืออะไร?


fyi มีข้อผิดพลาด tcp มากมายเช่นการรีเซ็ตการเชื่อมต่อโดยเพียร์และการหมดเวลาของ i / o โดยใช้เซิร์ฟเวอร์ Go http สำหรับบริการจัดการคำขอ POST ขนาดใหญ่ 100 รายการต่อนาที วาง nginx ไว้ข้างหน้า - ไม่มีปัญหาอีกต่อไป
Peter Kelly

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

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

คำตอบ:


136

มันขึ้นอยู่กับ.

นอกกรอบการวาง nginx ไว้ด้านหน้าเป็น reverse proxy จะให้คุณ:

  • บันทึกการเข้าถึง
  • บันทึกข้อผิดพลาด
  • การสิ้นสุด SSL อย่างง่ายดาย
  • รองรับ SPDY
  • รองรับ gzip
  • วิธีง่ายๆในการตั้งค่าส่วนหัว HTTP สำหรับเส้นทางบางเส้นทางในสองสามบรรทัด
  • การแสดงผลเนื้อหาแบบคงที่ที่รวดเร็วมาก (หากคุณให้บริการจาก S3 / ฯลฯ สิ่งนี้ไม่เกี่ยวข้อง)

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

ฉันพบว่าการวาง nginx ไว้ข้างหน้านั้นง่ายกว่าเสมอซึ่งเป็นสิ่งที่ดีและปล่อยให้มันทำหน้าที่ "เว็บเซิร์ฟเวอร์" แอปพลิเคชัน My Go ทำสิ่งต่างๆของแอปพลิเคชันและมีเพียงส่วนหัว / ฯลฯ ขั้นต่ำเท่านั้น ที่ต้องการ อย่ามองว่าการวาง nginx ไว้ข้างหน้าเป็นสิ่งที่ "ไม่ดี"


ขอบคุณสำหรับการตอบกลับของคุณ! - 1) Go HTTP สร้างบันทึกบางประเภทหรือไม่ - 2) nginx ลดปริมาณการร้องขอ / การตอบกลับหรือไม่?
Daniele B

3
@DanieleB เซิร์ฟเวอร์ Go HTTP จะสร้างเฉพาะบันทึกที่คุณต้องการเท่านั้น (เช่นการใช้logแพ็คเกจ) หากคุณต้องการบันทึกที่อยู่ IP การเข้าถึงทรัพยากร ฯลฯ คุณจะต้องเขียนสิ่งนั้น เช่นเดียวกันกับการตั้งค่าส่วนหัวนอกเหนือจากพื้นฐาน แม้ว่าฉันจะไม่มีข้อมูลที่เป็นรูปธรรม แต่ nginx ที่อยู่หน้า Go ก็ไม่ควรช้ากว่า Go จริง ๆ แล้วมันอาจเร็วกว่าด้วย gzip และการเพิ่มประสิทธิภาพของมันเอง "ต้นทุน" จะเป็นการใช้หน่วยความจำ / CPU มากขึ้น แต่ nginx ก็มีประสิทธิภาพมากเช่นกัน
elithrar

16
อีกหนึ่งคุณสมบัติที่ยิ่งใหญ่: คุณจะอัปเกรด / บำรุงรักษาแอปของคุณอย่างไร (โดยไม่ทิ้งแพ็กเก็ตในขณะที่แอปหยุดทำงาน) Nginx จะช่วยให้คุณควบคุมปริมาณการใช้งานโดยไม่สูญเสียแพ็กเก็ต
BraveNewCurrency

+1, Nginx อยู่ในสถานที่ของตัวเอง
Anatoly

3
ใน Raspberry Pi ของฉันการวาง Nginx ไว้ด้านหน้า Go ช่วยเพิ่มความเร็วในการโหลดหน้าเว็บอย่างมาก
425nesp

17

เซิร์ฟเวอร์ http มาตรฐานของ Go ใช้ได้ดี หากแอปพลิเคชันของคุณส่วนใหญ่ / เฉพาะเป็นคำขอ / การตอบกลับแบบ "ไดนามิก" นั่นเป็นวิธีที่ดีที่สุดจริงๆ

คุณสามารถใช้ nginx เพื่อแสดงเนื้อหาแบบคงที่ แต่ส่วนใหญ่แล้ว Go one มาตรฐานก็ใช้ได้เช่นกัน หากคุณต้องการประสิทธิภาพที่สูงขึ้นคุณควรใช้ CDN หรือแคชให้มากที่สุดเท่าที่จะทำได้กับวานิช (ตัวอย่าง)

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


ใช่ฉันใช้เพื่อให้บริการข้อมูลแบบไดนามิกเท่านั้น ดังนั้นฉันเดาว่าฉันไม่ต้องการ NGINX แล้ว! ขอบคุณสำหรับการตอบกลับ
Daniele B

ไม่จำเป็นต้องเคลือบเงา / HAProxy Nginx มีชุดเครื่องมือที่คล้ายกันสำหรับการแคชและการโหลดบาลานซ์
Anatoly

@mikhailov ไม่ใช่อย่างที่พูดเหรอ? nginx ทำงานได้ดีสำหรับมัน แม้ว่าโดยส่วนตัวแล้วฉันมักจะชอบเคลือบเงาหรือ HAproxy ฉันพบว่าพวกเขากำหนดค่าและใช้งานได้ง่ายกว่า
ถามBjørn Hansen

5

เว็บเครื่องมือกอริลลาช่วยให้คุณ:

  • การกำหนดเส้นทางขั้นสูง (การ จำกัด โดเมน / โดเมนย่อยการจับคู่เส้นทาง regex)
  • รองรับ gzip (ผ่านตัวจัดการมิดเดิลแวร์ )
  • การบันทึกตัวจัดการมิดเดิลแวร์ที่แสดงผลในรูปแบบบันทึกทั่วไปของ Apache
  • คุกกี้เข้ารหัสที่ปลอดภัย
  • เซสชัน
  • schema แพคเกจแปลงค่าฟอร์มเป็นโครงสร้าง

สิ่งนี้เติมเต็มช่องว่างระหว่าง Go's net/httpเซิร์ฟเวอร์และ HTTP เช่น NGINX

โดยส่วนตัวฉันจะหลีกเลี่ยงการติดตั้งและกำหนดค่าเซิร์ฟเวอร์ HTTP อื่นนอกเหนือจากnet/httpถ้าฉันรู้ว่าสามารถเสียบ CDN แทนได้

ฉันคิดว่าnet/httpมีเซิร์ฟเวอร์ HTTP ที่ทรงพลังที่สุดในไลบรารีมาตรฐานใด ๆ


2

จากhttps://blog.gopheracademy.com/caddy-a-look-inside/ดูเหมือนว่า Go สามารถจัดการ gzip, ข้อผิดพลาด, ไฟล์คงที่, การกำหนดเส้นทางและส่วนหัว http โดยใช้มิดเดิลแวร์ บรรทัดด้านล่างจากบล็อกแสดงให้เห็นว่าคุณจะจัดการกับคำขอดังกล่าวอย่างไร

logHandler(gzipHandler(fileServer))

พวกเขาจัดการข้อผิดพลาดในการบันทึกด้วยวิธีที่น่าสนใจจริงๆ ตราบเท่าที่มิดเดิลแวร์ของคุณส่งคืนรหัสข้อผิดพลาด (int) มิดเดิลแวร์จัดการข้อผิดพลาดจะจัดการโดยอัตโนมัติ พวกเขาไปไกลถึงการกำหนดค่าทั้งไซต์ใน Go เช่นเดียวกับ Nginx "ไฟล์ nginx.conf สำหรับเว็บไซต์ Gopher Academy ทั้งหมดมีความยาวมากกว่า 115 บรรทัด Caddyfile ที่เท่ากันคือ 50 บรรทัดเท่านั้น"

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