回答

收藏

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

技术问答 技术问答 470 人阅读 | 0 人回复 | 2023-09-12

对于那些在生产行 Go 后端人:
- W0 l2 c. Q% v/ s) N0 g7 ~运行 Go Web 应用程序的堆栈/配置是什么?3 g) \) u' W$ q5 u
除了人们使用标准库 net/http 除了保持服务器运行,我还没有看到太多关于这个主题的内容。我用 阅读Nginx 将请求传递给 Go 服务器 - nginx with Go
0 r/ K. `* N. l; z这对我来说似乎有点脆弱。例如,如果机器重启(没有额外的配置脚本),服务器将不会自动重启。: B: V% _( F9 s  Z8 u# g0 H' R+ ~
是否有更可靠的生产设置?
0 j1 w  p  q0 H1 N撇开我的意图不谈 - 我正在为我的下一个项目计划 Go 驱动的 REST 后端服务器希望在我投资太多之前确保 Go 项目可实时启动。
0 G5 t( ?2 t+ |) o$ R$ h$ R                                                               
  t/ S; d: z' O' N; q    解决方案:                                                                2 q  N- R% H- B
                                                                Go 程序可以直接监控 80 端口HTTP 请求提供服务。相反,你可能想要 Go 程序前使用反向代理,使其侦听端口 80 ,并将您的程序连接到端口(如 4000)。执行后者的原因有很多:不用操作你的 Go 程序作为 root,为同一主机上的其他网站/服务提供服务SSL 终止、负载平衡、日志记录等。& [; d2 _' @' O) @* Y9 M
我用在前面HAProxy。任何反向代理都可以工作。Nginx 也是不错的选择(比  HAProxy 更受欢迎,能做更多的事情)。6 y& y; n) O. D% c! i5 ]  ^
若您阅读其文档(HTML 版),则 HAProxy 很容易配置haproxy.cfg的一个 Go 项目的整个文件如下,以防您需要一个起点。* g% c. ~6 G8 i0 a/ H+ d  V
    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
    % ~* c" i' v% O( }
Nginx 更简单。, a& k7 g. {2 `
关于服务控制,我会 Go 程序作为系统服务运行。我想每个人都这么做。我的服务器运行 Ubuntu,所以用 Upstart。我已经把这个放在//etc/init/myapp.confUpstart控制我的程序:
; i1 P- Z+ U; e+ f0 D, u
    start on runlevel [2345]stop on runlevel [!2345]chdir /home/myapp/myappsetgid myappsetuid myappexec ./myapp start 1>>_logs/stdout.log 2>>_logs/stderr.log
    - W, t2 M" k% A
另一方面是部署。一种选择是只发送程序和必要资产的二进制文件。这是一个很好的解决方案 IMO。我使用另一个选项:在服务器上编译。(当我设置所谓的连续集成/部署系统时,我将切换到使用二进制文件部署。+ c) D; r  g- `
我在服务器上有一个小 shell 脚本,它从远程 Git 在仓库中为我的项目提取代码,使用 Go 构建它,复制二进制文件和其他资产~/myapp然后重新启动服务。" R6 ~" j4 X" V( }
一般来说,整个事情与任何其他服务器设置都没有太大区别:你必须有一种方法来操作你的代码并让它为 HTTP 要求提供服务。在实践中,Go 已被证明对这些东西非常稳定。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则