ฉันกำลังเขียนบริการเว็บเซิร์ฟเวอร์ที่ส่งคืนข้อมูล JSON ซึ่งมีผู้ใช้จำนวนมาก
ประโยชน์ของการใช้ Nginx ต่อหน้าเซิร์ฟเวอร์ของฉันเมื่อเทียบกับการใช้ go http server คืออะไร?
ฉันกำลังเขียนบริการเว็บเซิร์ฟเวอร์ที่ส่งคืนข้อมูล JSON ซึ่งมีผู้ใช้จำนวนมาก
ประโยชน์ของการใช้ Nginx ต่อหน้าเซิร์ฟเวอร์ของฉันเมื่อเทียบกับการใช้ go http server คืออะไร?
คำตอบ:
มันขึ้นอยู่กับ.
นอกกรอบการวาง nginx ไว้ด้านหน้าเป็น reverse proxy จะให้คุณ:
เซิร์ฟเวอร์ Go HTTP นั้นดีมาก แต่คุณจะต้องสร้างวงล้อขึ้นมาใหม่เพื่อทำสิ่งเหล่านี้ (ซึ่งเป็นเรื่องปกติ: ไม่ใช่ทุกอย่างสำหรับทุกคน)
ฉันพบว่าการวาง nginx ไว้ข้างหน้านั้นง่ายกว่าเสมอซึ่งเป็นสิ่งที่ดีและปล่อยให้มันทำหน้าที่ "เว็บเซิร์ฟเวอร์" แอปพลิเคชัน My Go ทำสิ่งต่างๆของแอปพลิเคชันและมีเพียงส่วนหัว / ฯลฯ ขั้นต่ำเท่านั้น ที่ต้องการ อย่ามองว่าการวาง nginx ไว้ข้างหน้าเป็นสิ่งที่ "ไม่ดี"
log
แพ็คเกจ) หากคุณต้องการบันทึกที่อยู่ IP การเข้าถึงทรัพยากร ฯลฯ คุณจะต้องเขียนสิ่งนั้น เช่นเดียวกันกับการตั้งค่าส่วนหัวนอกเหนือจากพื้นฐาน แม้ว่าฉันจะไม่มีข้อมูลที่เป็นรูปธรรม แต่ nginx ที่อยู่หน้า Go ก็ไม่ควรช้ากว่า Go จริง ๆ แล้วมันอาจเร็วกว่าด้วย gzip และการเพิ่มประสิทธิภาพของมันเอง "ต้นทุน" จะเป็นการใช้หน่วยความจำ / CPU มากขึ้น แต่ nginx ก็มีประสิทธิภาพมากเช่นกัน
เซิร์ฟเวอร์ http มาตรฐานของ Go ใช้ได้ดี หากแอปพลิเคชันของคุณส่วนใหญ่ / เฉพาะเป็นคำขอ / การตอบกลับแบบ "ไดนามิก" นั่นเป็นวิธีที่ดีที่สุดจริงๆ
คุณสามารถใช้ nginx เพื่อแสดงเนื้อหาแบบคงที่ แต่ส่วนใหญ่แล้ว Go one มาตรฐานก็ใช้ได้เช่นกัน หากคุณต้องการประสิทธิภาพที่สูงขึ้นคุณควรใช้ CDN หรือแคชให้มากที่สุดเท่าที่จะทำได้กับวานิช (ตัวอย่าง)
หากคุณต้องการให้บริการแอปพลิเคชันที่แตกต่างกันจากที่อยู่ IP เดียวกัน nginx เป็นตัวเลือกที่ดีสำหรับพร็อกซีในการกระจายคำขอระหว่างแอปพลิเคชัน แม้ว่าฉันมักจะเอาวานิชหรือ HAProxy ออกจากกล่องเครื่องมือสำหรับสิ่งนั้น
เว็บเครื่องมือกอริลลาช่วยให้คุณ:
schema
แพคเกจแปลงค่าฟอร์มเป็นโครงสร้างสิ่งนี้เติมเต็มช่องว่างระหว่าง Go's net/http
เซิร์ฟเวอร์และ HTTP เช่น NGINX
โดยส่วนตัวฉันจะหลีกเลี่ยงการติดตั้งและกำหนดค่าเซิร์ฟเวอร์ HTTP อื่นนอกเหนือจากnet/http
ถ้าฉันรู้ว่าสามารถเสียบ CDN แทนได้
ฉันคิดว่าnet/http
มีเซิร์ฟเวอร์ HTTP ที่ทรงพลังที่สุดในไลบรารีมาตรฐานใด ๆ
จากhttps://blog.gopheracademy.com/caddy-a-look-inside/ดูเหมือนว่า Go สามารถจัดการ gzip, ข้อผิดพลาด, ไฟล์คงที่, การกำหนดเส้นทางและส่วนหัว http โดยใช้มิดเดิลแวร์ บรรทัดด้านล่างจากบล็อกแสดงให้เห็นว่าคุณจะจัดการกับคำขอดังกล่าวอย่างไร
logHandler(gzipHandler(fileServer))
พวกเขาจัดการข้อผิดพลาดในการบันทึกด้วยวิธีที่น่าสนใจจริงๆ ตราบเท่าที่มิดเดิลแวร์ของคุณส่งคืนรหัสข้อผิดพลาด (int) มิดเดิลแวร์จัดการข้อผิดพลาดจะจัดการโดยอัตโนมัติ พวกเขาไปไกลถึงการกำหนดค่าทั้งไซต์ใน Go เช่นเดียวกับ Nginx "ไฟล์ nginx.conf สำหรับเว็บไซต์ Gopher Academy ทั้งหมดมีความยาวมากกว่า 115 บรรทัด Caddyfile ที่เท่ากันคือ 50 บรรทัดเท่านั้น"