戈兰生产网络应用配置

对于那些在生产环境中运行 Go 后端的人:

运行 Go Web 应用程序的堆栈/配置是什么?

除了人们使用标准库 net/http 包来保持服务器运行之外,我没有看到太多关于这个主题的内容。我使用 Nginx 将请求传递给 Go 服务器-nginx with Go

我觉得这个有点脆弱。例如,如果重新启动计算机(没有额外的配置脚本) ,服务器将不会自动重新启动。

是否有一个更可靠的生产设备?

关于我的意图的一个旁白-我正在为我的下一个项目计划一个 Go 驱动的 REST 后端服务器,并希望确保 Go 是可行的启动该项目的生活之前,我投入了太多。

35201 次浏览

Go 程序可以侦听端口80并直接服务 HTTP 请求。相反,您可能希望在 Go 程序前面使用一个反向代理,以便它在端口80上侦听,并在端口4000上连接到您的程序。采用后者的原因有很多: 不必以 root 用户身份运行 Go 程序,在同一主机上为其他网站/服务提供服务,SSL 终止,负载平衡,日志记录等等。

我在前面使用 HAProxy。任何反向代理都可以。Nginx 也是一个很好的选择(比 HAProxy 流行得多,并且能够做得更多)。

HAProxy is very easy to configure if you read its documentation (HTML 版本). My whole haproxy.cfg file for one of my Go projects follows, in case you need a starting 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

另一个方面是部署。一种选择是通过发送程序的二进制文件和必要的资产进行部署。这是一个非常好的解决方案。我使用了另一个选项: 在服务器上进行编译。(在设置所谓的“持续集成/部署”系统时,我将切换到使用二进制文件进行部署。)

I have a small shell script on the server that pulls code for my project from a remote Git repository, builds it with Go, copies the binaries and other assets to ~/myapp/, and restarts the service.

总的来说,整个过程与其他服务器设置没有太大的不同: 您必须有一种方法来运行代码并让它服务 HTTP 请求。在实践中,围棋已经证明是非常稳定的这种东西。

Nginx 用于:

  • 反向 HTTP 代理到 Go 应用程序
  • 静态文件处理
  • SSL 终止
  • HTTP 头(Cache-Control 等)
  • 访问日志(因此利用系统日志轮换)
  • 重写(裸体到 www,http://到 https://等)

Nginx 使这变得非常简单,虽然你可以直接从 Go 服务感谢 net/http,有很多“重新发明的轮子”和东西像全局 HTTP 头涉及一些样板,你可能会避免。

用于管理 Go 二进制文件的 monitor ord 。Ubuntu 的 Upstart (正如 Mostafa 所提到的)也不错,但我喜欢督导软件,因为它相对不涉及发行版本,而且有很好的文档记录。

主管,找我:

  • 根据需要运行 Go 二进制文件
  • 车祸之后提起的
  • 将我的环境变量(会话认证密钥等)作为单个配置的一部分。
  • Runs my DB (to make sure my Go binary isn't running without it)

可以使用 setcap将二进制文件绑定到一个套接字到 Internet 域特权端口(端口号小于1024)

setcap 'cap_net_bind_service=+ep' /path/to/binary

  1. 此命令需要升级
  2. 程序的每个新版本都会产生一个新的二进制文件,需要 setcap重新授权

setcap文档

cap_net_bind_service文档

For those who want simple go app running as a daemon, use 系统 (Supported by many linux distros) instead of Upstart.

创建一个服务文件

touch /etc/systemd/system/my-go-daemon.service

进来

[Unit]
Description=My Go App


[Service]
Type=simple
WorkingDirectory=/my/go/app/directory
ExecStart=/usr/lib/go run main.go


[Install]
WantedBy=multi-user.target

然后启用并启动服务

systemctl enable my-go-daemon
systemctl start my-go-daemon
systemctl status my-go-daemon

Systemd 有一个单独的日志记录系统,可以跟踪日志以便于排除故障。