回答

收藏

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

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

对于那些在生产行 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
另一方面是部署。一种选择是只发送程序和必要资产的二进制文件。这是一个很好的解决方案 IMO。我使用另一个选项:在服务器上编译。(当我设置所谓的连续集成/部署系统时,我将切换到使用二进制文件部署。, {+ ^. h+ [3 l( h0 \
我在服务器上有一个小 shell 脚本,它从远程 Git 在仓库中为我的项目提取代码,使用 Go 构建它,复制二进制文件和其他资产~/myapp然后重新启动服务。
1 b% d- _6 G7 G一般来说,整个事情与任何其他服务器设置都没有太大区别:你必须有一种方法来操作你的代码并让它为 HTTP 要求提供服务。在实践中,Go 已被证明对这些东西非常稳定。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则