Go 程序可以监听 80 端口并直接服务 HTTP 请求。相反,您可能希望在 Go 程序前面使用反向代理,以便它侦听端口 80 并连接到端口上的程序,例如 4000。这样做有很多原因:不必运行您的 Go 程序以 root 身份,为同一主机上的其他网站/服务提供服务、SSL 终止、负载平衡、日志记录等。
我在前面使用HAProxy 。任何反向代理都可以工作。Nginx 也是一个不错的选择(比 HAProxy 更受欢迎并且能够做更多事情)。
如果您阅读它的文档(HTML 版本),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
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。我使用另一个选项:在服务器上编译。(当我设置所谓的“持续集成/部署”系统时,我将切换到使用二进制文件进行部署。)
我在服务器上有一个小的 shell 脚本,它从远程 Git 存储库中为我的项目提取代码,使用 Go 构建它,将二进制文件和其他资产复制到~/myapp/
,然后重新启动服务。
总的来说,整个事情与任何其他服务器设置没有太大区别:您必须有一种方法来运行您的代码并让它服务于 HTTP 请求。在实践中,Go 被证明对于这些东西非常稳定。