Go程序可以偵聽端口80並直接提供HTTP請求。相反,您可能希望在Go程序前面使用反向代理,以便在端口80上偵聽,並在端口4000上連接到您的程序。執行後者的原因很多:無需運行您的Go程序作爲root用戶,在同一主機上提供其他網站/服務,SSL終止,負載平衡,日誌記錄等。
我在前面使用HAProxy。任何反向代理都可以工作。 Nginx也是一個不錯的選擇(比HAProxy更受歡迎,能夠做更多)。
如果您閱讀其documentation(HTML version),HAProxy配置非常簡單。我的一個Go項目的整個haproxy.cfg
文件如下,以防您需要一個開始蓬。
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
的新貴來控制我的程序:
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解決方案。我使用其他選項:在服務器上編譯。 (當我建立所謂的「持續集成/部署」系統時,我將切換到使用二進制文件進行部署。)
我在服務器上有一個小型shell腳本,它從遠程Git使用Go進行構建,將二進制文件和其他資產複製到~/myapp/
,然後重新啓動服務。總的來說,整個事情與任何其他服務器設置並沒有太大的不同:你必須有一種方法來運行你的代碼,並讓它服務於HTTP請求。在實踐中,Go被證明對這個東西非常穩定。
「如果機器重新啓動(不需要額外的配置腳本),服務器不會自動重啓。」我不認爲這可以做到。理想情況下,您已經爲該服務創建了init/systemd/upstart腳本。這是任何unix守護進程被控制的推薦方式。 – Intermernet
你是對的。我想我的意思是與apache等服務器相反,它會在安裝時自動設置這些功能。 – Chaseph