对于那些在生产环境中运行Go后端的人:
运行Go Web应用程序的堆栈/配置是什么?
除了人们使用标准库net / http包来保持服务器运行之外,在该主题上我还没有看到太多东西。 我阅读了使用Nginx将请求传递到Go服务器的信息-使用Go的Nginx
在我看来,这有点脆弱。 例如,如果重新启动计算机(没有其他配置脚本),服务器将不会自动重新启动。
是否有更可靠的生产设置?
除了我的意图外,我正在为下一个项目计划一款采用Go技术的REST后端服务器,并希望在我投入过多资金之前,确保Go能够切实地启动该项目。
Go程序可以在端口80上侦听并直接处理HTTP请求。相反,您可能想在Go程序之前使用反向代理,以便它侦听端口80并在端口上连接您的程序(例如4000)。这样做的原因很多:不必运行您的Go程序以root身份在同一主机上提供其他网站/服务,SSL终止,负载平衡,日志记录等。
我在前面使用HAProxy。任何反向代理都可以工作。 Nginx也是一个不错的选择(比HAProxy受欢迎得多,并且能够执行更多操作)。
如果您阅读HAProxy的文档(HTML版本),则它非常易于配置。接下来是我的其中一个Go项目的整个
Nginx甚至更容易。
关于服务控制,我将Go程序作为系统服务运行。我想每个人都这样做。我的服务器运行Ubuntu,因此它使用Upstart。我将其放在
另一个方面是部署。一种选择是仅通过发送程序和必要资产的二进制文件进行部署。 IMO这是一个非常好的解决方案。我使用另一个选项:在服务器上编译。 (在设置所谓的"持续集成/部署"系统时,我将切换为使用二进制文件进行部署。)
我在服务器上有一个小的Shell脚本,可以从远程Git存储库中提取项目代码,使用Go构建它,将二进制文件和其他资产复制到
总体而言,整个过程与其他任何服务器设置都没有太大不同:您必须有一种方法来运行代码并使其能够处理HTTP请求。在实践中,事实证明,Go对于这种东西非常稳定。
nginx用于:
- 反向HTTP代理到我的Go应用程序
- 静态文件处理
- SSL终止
- HTTP标头(Cache-Control等)
- 访问日志(并因此利用系统日志循环)
- 重写(裸体到www,http://到https://等)
nginx使这个过程非常容易,尽管您可以通过
负责管理我的Go二进制文件。 Ubuntu的Upstart(如Mostafa所述)也不错,但我喜欢主管,因为它相对于发行版而言是相对不可知的,并且有据可查。
主管,对我来说:
- 根据需要运行我的Go二进制文件
- 崩溃后将其调出
- 将我的环境变量(会话身份验证密钥等)保存为单个配置的一部分。
- 运行我的数据库(确保没有它,我的Go二进制文件不会运行)
对于那些希望简单的go应用程序作为守护程序运行的用户,请使用systemd(许多linux发行版支持)而不是Upstart。
在以下位置创建服务文件
输入
然后启用并启动服务
systemd有一个单独的日记系统,可让您添加日志以方便进行故障排除。
您可以使用