当前位置: 首页 > 面试题库 >

Golang生产Web应用程序配置

孟茂
2023-03-14
问题内容

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

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

除了人们使用标准库net / http包来保持服务器运行之外,在该主题上我还没有看到太多内容。我阅读了使用Nginx将请求传递到Go服务器的信息-
使用Go的 Nginx

在我看来,这有点脆弱。例如,如果重新启动计算机(没有其他配置脚本),服务器将不会自动重新启动。

是否有更可靠的生产设置?

除了我的意图外,我正在为我的下一个项目计划一个由Go驱动的REST后端服务器,并希望在我投入过多资金之前确保Go在启动项目时是可行的。


问题答案:

Go程序可以侦听端口80并直接处理HTTP请求。相反,您可能想在Go程序前使用反向代理,以便它侦听端口80并在端口上连接您的程序(例如4000)。这样做的原因很多:不必运行您的Go程序以root身份在同一主机上提供其他网站/服务,SSL终止,负载平衡,日志记录等。

我在前面使用HAProxy。任何反向代理都可以工作。Nginx也是一个不错的选择(比HAProxy受欢迎得多,并且能够执行更多操作)。

如果您阅读HAProxy的文档(HTML版本),则它很容易配置。haproxy.cfg接下来是我的其中一个Go项目的整个文件,以备不时之需。

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.confUpstart上来控制我的程序:

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

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

我在服务器上有一个小的Shell脚本,可以从远程Git存储库中提取项目代码,使用Go构建它,将二进制文件和其他资产复制到~/myapp/,然后重新启动服务。

总体而言,整个过程与其他任何服务器设置都没有太大不同:您必须有一种方法来运行代码并使其能够处理HTTP请求。在实践中,事实证明,Go对于这种东西非常稳定。



 类似资料:
  • 对于那些在生产中运行Go后端的人: 运行Go web应用程序的堆栈/配置是什么? 除了人们使用标准库NET/HTTP包来保持服务器的运行之外,我还没有看到关于这个主题的很多东西。我读过使用Nginx向Go服务器传递请求-Nginx with Go 这在我看来有点脆弱。例如,如果计算机重新启动(没有附加配置脚本),服务器将不会自动重新启动。 是否有更坚实的生产设置? 关于我的意图--我正在为我的下一

  • 问题内容: 是否有任何模式或最佳实践可用于简化跨多个环境的Java Web应用程序的配置文件更改。例如JDBC URL,SOAP端点等。 为了帮助澄清我的问题,我使用了一些大型Java Web应用程序作为背景知识,这些Web应用程序在任何给定的发行周期内都会在6种不同的环境中移动。开发,集成,质量保证,性能,并最终部署到多个生产服务器。在每种环境中,配置都需要更改。目前,每个部署的大多数配置更改都

  • 问题内容: 我将使用keycloak保护我的golang应用程序,但keycloak本身不支持go语言。 github中有一些go适配器作为一个开放项目,已经将openId connect协议实现为提供程序服务,但是它们没有提供有关如何将库与应用程序集成的示例或文档。 如何使用Golang与Keycloak互动? 问题答案: 如您所指出的,没有用于golang的官方keycloak适配器。但是实现

  • 我需要为我完整的多路由、有状态 Web 应用进行负载测试。有流星下降和流星负载测试等选项,但它们没有测试确切的用户行为,其中包括从服务器代码到客户端代码的所有内容。 或者我应该只测试服务器端代码,因为这将在服务器上运行,而其他所有代码都将在客户端上运行?如何在Meteor应用程序中测试其他路由或只测试根路径就足够了。我还需要测试不同参数的基准测试。 我还能不能使用其他压力测试工具,比如Jmeter

  • 提交给Yarn的单个配置单元查询是否会创建多个作业(即多个Yarn应用程序)?在这里,我把工作和应用放在纱线的语境中思考是一样的。 根据我的理解--Yarn为“Application”创建一个应用程序主程序(AM)。因此在这里可以将单个配置单元查询视为“应用程序”。因此,资源管理器将在某个节点上创建容器,并在该容器中启动AM。该容器反过来可以创建多个“任务”(而不是应用程序),即为该AM保留的其他

  • 本章将教您如何使用Maven管理基于Web的项目。 在这里,您将学习如何创建/构建/部署和运行Web应用程序。 创建Web应用程序 要创建一个简单的Java Web应用程序,我们将使用maven-archetype-webapp插件。 所以,让我们打开命令控制台,转到C:\MVN目录并执行以下mvn命令。 C:\MVN>mvn archetype:generate -DgroupId = com