回答

收藏

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

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

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

本版积分规则