对于那些在生产中运行 Go 后端的人:
运行 Go Web 应用程序的堆栈/配置是什么?
除了人们使用标准库 net/http 包来保持服务器运行之外,我还没有看到太多关于这个主题的内容。我阅读使用 Nginx 将请求传递到 Go 服务器 - nginx with Go
这对我来说似乎有点脆弱。例如,如果机器重新启动(没有额外的配置脚本),服务器不会自动重新启动。
是否有更可靠的生产设置?
撇开我的意图不谈 - 我正在为我的下一个项目计划一个 Go 驱动的 REST 后端服务器,并希望在我对它进行过多投资之前确保 Go 能够实时启动该项目。
Go 程序可以监听 80 端口并直接为 HTTP 请求提供服务。相反,您可能希望在 Go 程序前使用反向代理,以便它侦听端口 80 并在端口(例如 4000)上连接到您的程序。执行后者的原因有很多:不必运行您的 Go 程序作为 root,在同一主机上为其他网站/服务提供服务、SSL 终止、负载平衡、日志记录等。
我在前面使用HAProxy。任何反向代理都可以工作。Nginx 也是一个不错的选择(比 HAProxy 更受欢迎并且能够做更多的事情)。
如果您阅读其文档(HTML 版本),则 HAProxy 非常容易配置。我haproxy.cfg的一个 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.confUpstart 来控制我的程序:
/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/,然后重新启动服务。
~/myapp/
总的来说,整个事情与任何其他服务器设置没有太大区别:您必须有一种方法来运行您的代码并让它为 HTTP 请求提供服务。在实践中,Go 已被证明对这些东西非常稳定。