对于那些你在运行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更受欢迎,并能够做更多)。
如果你阅读它的documentation(HTML version),HAProxy很容易配置。我的整个haproxy.cfg文件为我的Go项目之一,如果你需要一个开始pont。
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已经证明是非常稳定的这个东西。