对于那些在生产行 Go 后端人:$ o5 ^" L6 t' X C
运行 Go Web 应用程序的堆栈/配置是什么?# l/ ]* R7 H* ?. R( ]4 M
除了人们使用标准库 net/http 除了保持服务器运行,我还没有看到太多关于这个主题的内容。我用 阅读Nginx 将请求传递给 Go 服务器 - nginx with Go 6 n/ Q3 z- A8 k9 }; A这对我来说似乎有点脆弱。例如,如果机器重启(没有额外的配置脚本),服务器将不会自动重启。 R/ P% X* d1 y9 [4 a+ y% Z/ D是否有更可靠的生产设置?) d1 r* ]: B5 |8 p9 I& W
撇开我的意图不谈 - 我正在为我的下一个项目计划 Go 驱动的 REST 后端服务器希望在我投资太多之前确保 Go 项目可实时启动。& o# P0 |% Y6 |: f) ^
5 T, U' M3 k$ V4 ^0 |- r解决方案: ! y9 C' }6 x, x
Go 程序可以直接监控 80 端口HTTP 请求提供服务。相反,你可能想要 Go 程序前使用反向代理,使其侦听端口 80 ,并将您的程序连接到端口(如 4000)。执行后者的原因有很多:不用操作你的 Go 程序作为 root,为同一主机上的其他网站/服务提供服务SSL 终止、负载平衡、日志记录等。 , H# M) e8 H j$ p& W8 }3 g3 z9 J7 n我用在前面HAProxy。任何反向代理都可以工作。Nginx 也是不错的选择(比 HAProxy 更受欢迎,能做更多的事情)。; c, W8 ?& `* N, `
若您阅读其文档(HTML 版),则 HAProxy 很容易配置haproxy.cfg的一个 Go 项目的整个文件如下,以防您需要一个起点。 3 N6 S- I8 h3 F0 \
global log 127.0.0. local maxconn 1000 user haproxy group haproxy daemondefaults log global mode http option httplog option dontlognull retries 3 timeout connect 500 timeout client 5000 timeout server 50000frontend http bind :8 acl is_stats hdr(host) -i hastats.myapp.com use_backend stats if is_stats default_backend myapp capture request header Host len 2 capture request header Referer len 50backend myapp server main 127.0.0.1:4000backend stats mode http stats enable stats scope http stats scope myapp stats realm Haproxy\ Statistics stats uri stats auth username:password 2 C7 F, v5 M) W9 V1 h6 c9 A
Nginx 更简单。* j ^9 W( n ~
关于服务控制,我会 Go 程序作为系统服务运行。我想每个人都这么做。我的服务器运行 Ubuntu,所以用 Upstart。我已经把这个放在//etc/init/myapp.confUpstart控制我的程序: & r' k& i/ Y `4 R# y/ _6 i9 q
start on runlevel [2345]stop on runlevel [!2345]chdir /home/myapp/myappsetgid myappsetuid myappexec ./myapp start 1>>_logs/stdout.log 2>>_logs/stderr.log . N! k, l( o E ?7 a8 M