โปรแกรม Go สามารถฟังบนพอร์ต 80 และตอบสนองคำขอ HTTP ได้โดยตรง คุณอาจต้องการใช้ reverse proxy หน้าโปรแกรม Go ของคุณแทนเพื่อให้มันฟังพอร์ต 80 และเชื่อมต่อกับโปรแกรมของคุณบนพอร์ตกล่าวว่า 4000 มีหลายเหตุผลในการดำเนินการอย่างหลัง: ไม่ต้องรัน โปรแกรม Go ของคุณเป็นรูทให้บริการเว็บไซต์ / บริการอื่น ๆ บนโฮสต์เดียวกันการยุติ SSL การโหลดบาลานซ์การบันทึก ฯลฯ
ฉันใช้HAProxyอยู่ข้างหน้า พร็อกซีย้อนกลับใด ๆ สามารถทำงานได้ Nginx เป็นตัวเลือกที่ยอดเยี่ยมเช่นกัน (เป็นที่นิยมมากกว่า HAProxy และสามารถทำอะไรได้มากกว่านี้)
HAProxy นั้นง่ายมากในการกำหนดค่าหากคุณอ่านเอกสารประกอบ ( เวอร์ชัน HTML ) haproxy.cfg
ไฟล์ทั้งหมดของฉันสำหรับหนึ่งในโปรเจ็กต์ Go ของฉันมีดังต่อไปนี้ในกรณีที่คุณต้องการเริ่มต้น
global
log 127.0.0.1 local0
maxconn 10000
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http
bind :80
acl is_stats hdr(host) -i hastats.myapp.com
use_backend stats if is_stats
default_backend myapp
capture request header Host len 20
capture request header Referer len 50
backend myapp
server main 127.0.0.1:4000
backend stats
mode http
stats enable
stats scope http
stats scope myapp
stats realm Haproxy\ Statistics
stats uri /
stats auth username:password
Nginx ง่ายยิ่งขึ้น
เกี่ยวกับการควบคุมบริการฉันเรียกใช้โปรแกรม Go เป็นบริการระบบ ฉันคิดว่าทุกคนทำอย่างนั้น เซิร์ฟเวอร์ของฉันใช้ Ubuntu ดังนั้นจึงใช้ Upstart ฉันได้ใส่สิ่งนี้ไว้/etc/init/myapp.conf
สำหรับ Upstart เพื่อควบคุมโปรแกรมของฉัน:
start on runlevel [2345]
stop on runlevel [!2345]
chdir /home/myapp/myapp
setgid myapp
setuid myapp
exec ./myapp start 1>>_logs/stdout.log 2>>_logs/stderr.log
อีกประการหนึ่งคือการปรับใช้ ทางเลือกหนึ่งคือการปรับใช้โดยเพียงแค่ส่งไฟล์ไบนารีของโปรแกรมและทรัพย์สินที่จำเป็น นี่เป็นทางออกที่ยอดเยี่ยมมาก IMO ฉันใช้ตัวเลือกอื่น: คอมไพล์บนเซิร์ฟเวอร์ (ฉันจะเปลี่ยนไปใช้การปรับใช้กับไฟล์ไบนารีเมื่อฉันตั้งค่าระบบ“ การรวม / การปรับใช้อย่างต่อเนื่อง”)
ฉันมีเชลล์สคริปต์ขนาดเล็กบนเซิร์ฟเวอร์ที่ดึงโค้ดสำหรับโปรเจ็กต์ของฉันจากที่เก็บ Git ระยะไกลสร้างด้วย Go คัดลอกไบนารีและเนื้อหาอื่น ๆ ไปยัง~/myapp/
และเริ่มบริการใหม่
โดยรวมแล้วสิ่งทั้งหมดไม่แตกต่างจากการตั้งค่าเซิร์ฟเวอร์อื่น ๆ มากนัก: คุณต้องมีวิธีเรียกใช้รหัสของคุณและให้มันตอบสนองคำขอ HTTP ในทางปฏิบัติ Go ได้พิสูจน์แล้วว่ามีความเสถียรมากสำหรับสิ่งนี้