当前位置: 首页 > 知识库问答 >
问题:

Golang production web应用程序配置

裴存
2023-03-14

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

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

除了人们使用标准库NET/HTTP包来保持服务器的运行之外,我还没有看到关于这个主题的很多东西。我读过使用Nginx向Go服务器传递请求-Nginx with Go

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

是否有更坚实的生产设置?

关于我的意图--我正在为我的下一个项目规划一个支持Go的REST后端服务器,并且希望确保Go在我投入太多之前能够启动该项目。

共有2个答案

籍光熙
2023-03-14

nginx用于:

  • 将HTTP代理反向到my Go应用程序
  • 静态文件处理
  • SSL终止
  • HTTP头(缓存控制等)
  • 访问日志(从而利用系统日志循环)
  • 重写(裸到www,http://到https://等)

nginx使此操作变得非常容易,尽管您可以通过net/HTTP直接从Go开始提供服务,但仍有许多“重新发明轮子”的操作,例如全局HTTP标头涉及一些您可能可以避免的样板。

supervisord用于管理我的Go二进制文件。Ubuntu的新贵(正如Mostafa所提到的)也不错,但我喜欢supervisord,因为它相对不知道发行版,并且有很好的文档记录。

主管,对我来说:

  • 根据需要运行Go二进制文件
  • 在崩溃后启动
  • 将我的环境变量(会话身份验证密钥等)作为单个配置的一部分。
  • 运行我的DB(以确保我的Go二进制文件在没有它的情况下不运行)
柳鸿信
2023-03-14

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

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

如果您阅读了它的文档(HTML版本),HAProxy非常容易配置。下面是我的一个Go项目的整个haproxy.cfg文件,以备您需要一个启动pont。

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.conf中,以便Upstart控制我的程序:

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

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

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

总体而言,整个过程与任何其他服务器设置没有太大区别:您必须有一种方法来运行您的代码并使其为HTTP请求服务。在实践中,围棋已经证明对这玩意儿是非常稳定的。

 类似资料:
  • 我尝试了一个显示其他响应的测试用例,我将一步一步地解释它: > 我在我的设备上安装了MDM配置文件,这提示我安装了一个应用程序,并且我成功地安装了它。应用程序已进入“应用程序中的配置文件”部分。 然后我手动删除了应用程序。

  • 问题内容: 好的,所以我不想在这里展开一场圣战,但是我们正在努力巩固处理应用程序配置文件的方式,我们正在努力决定采用哪种最佳方法。目前,我们分发的每个应用程序都在使用其自己的临时配置文件,无论是属性文件(ini样式),XML还是JSON(目前仅在内部使用!)。 目前,我们的大多数代码是Java,因此我们一直在研究Apache Commons Config ,但是我们发现它非常冗长。我们还研究了XM

  • Name: 名字. 可以在工具栏运行应用程序配置的下拉列表中看到。 General: 在这里配置安装、启动、部署应用程序选项 Module: 列表中列出了当前项目中的所有模块,我们可以指定相应的模块来运行. Installation Options: 安装选项 1.Deploy:下拉列表中列出了应用程序运行时的部署模式 有三个选项: Default APK: 部署默认的APK, 运行时会先打包安装

  • 你可以查看或更改 Navicat Monitor 的应用程序设置,例如端口、网站网址和 IP 地址。若要配置应用程序设置,请前往“配置”->“应用程序设置”。 这里列出了 Navicat Monitor 的应用程序设置。你可以编辑以下设置: 端口 Navicat Monitor 将侦听的端口号。 网站网址 将用于警报电子邮件内的 Navicat Monitor 网站网址。 IP 地址 如果机器已被

  • 如果我们在这里配置了签名,相应的在module app的build.gradle文件中会自动添加下面的配置: // 签名配置 signingConfigs { MySigning { keyAlias 'myandroid' keyPassword '123456' storeFile file('/Users/quanke/myandroid.jks') storePassw

  • Compile Sdk Version: 指定Android的编译版本. 对应build.gradle文件中的参数是: compileSdkVersion 23 Build Tools Version: 指定构建工具的版本. 对应build.gradle文件中的参数是: buildToolsVersion "23.0.2" SDK编译版本和构建工具的版本都是我们已经下载到本地的,如果本地没有就