【问题标题】:Go(lang) app: nginx reverse proxy VS nginx hostGolang) 应用程序:nginx 反向代理 VS nginx 主机
【发布时间】:2016-01-12 15:04:38
【问题描述】:

我已经阅读了一些关于 gonginxquestions,但我没有找到任何答案。

我认为(我不是专家)在net/http go 服务器前使用 nginx 作为反向代理与直接使用 nginx 托管你的 go 应用程序不同。
如果我错了就骂我好吗?

我遇到了这个问题,因为我需要开发一个应用程序(可能使用 go,只是为了学习新东西)并完全控制网络服务器,尤其是它用来回答请求的工作人员数量。

那么,问题来了:

  1. 是否可以直接在nginx上托管一个go app,还是nginx只提供静态文件(如果答案是“NO”,那么第二个问题没有多大意义)?

  2. 上述两种方法之间的主要区别是什么,确切地说,不同的方法是否会以某种方式影响配置?

  3. 我害怕告诉 nginx:“好吧,请使用 8 个工作人员”,然后什么都不告诉 go 的内部网络服务器......会发生什么?

非常感谢您

【问题讨论】:

  • 没有“直接用 nginx 托管 go 应用”这样的东西。
  • 我不确定您所说的“在 nginx 上托管一个 go 应用程序”是什么意思。 nginx 是一个网络服务器,而您的应用程序(根据定义)是一个应用程序。常见的做法是让您的应用在本地端口(比如 4040)上进行侦听,并在其前面设置 nginx 以从远程端口 80 反向代理到本地端口 4040,以便您的应用处理请求。
  • 类似地告诉 nginx 使用 8 个工作线程意味着有 8 个工作线程可用于处理反向代理请求。如果您一次收到很多请求,这可能会有所帮助,但是由于 nginx 只是在这里(双关语)作为路标服务,因此可能没有必要。 Golang 的工作人员与 nginx 的工作人员完全分开。

标签: nginx go


【解决方案1】:

Herbert Fischer 写了一个comprehensive benchmark of Nginx with Go,包括 NGinx 配置文件和 Go 代码。

他检查了以下设置:

  • 独立使用 HTTP(作为对照组)
  • Nginx 代理到 Go HTTP
  • Nginx fastcgi 到 Go TCP FastCGI
  • Nginx fastcgi to Go Unix Socket FastCGI

到目前为止,Go HTTP 的 Nginx 代理是最快的。自 1.2 以来的 Go 版本中的结果几乎相同。

【讨论】:

    【解决方案2】:

    是否可以直接在 nginx 上托管一个 go 应用

    Nginx 可以通过各种不同的机制与其后端(您的应用程序)进行通信。其中一些是:

    • 通过 CGI/FastCGI(进程多路复用)
    • 通过 HTTP(反向代理)
    • 提供您的应用生成的静态文件

    不同的方法是否会以某种方式影响配置?

    是的,每种情况都非常不同。

    好的,请使用 8 个工人

    这建议使用 FastCGI,我相信这就是您所说的“直接在 nginx 上托管应用程序”的意思。

    什么都不告诉去的内部网络服务器...会发生什么?

    每个 Go FastCGI 进程都会产生大量的 goroutine,这些 goroutine 被多路复用到软件线程,硬件线程被多路复用到 CPU 内核。

    Go 的net/http 服务器对于生产环境来说已经足够好了,除非你想使用一些 nginx 特定的功能,否则你不一定需要 nginx。只有这么多的用例可以使用 FastCGI 设置。基本上,你只是增加了开销。

    【讨论】:

    • 另请注意,FastCGI 是 http/1.1 之前的遗物。 Go 的 http/1.1 服务器比 fcgi 实现更快、更高效。
    • 完美。我想我误解了关系网络/应用程序服务器。第一个项目符号列表以某种方式清除了我的思绪。您能否改写“那会建议 FastCGI,我相信……”?你的意思是“那会影响……”吗?谢谢
    • 我认为 nginx 工作人员(独立于您使用的任何后端)和 FastCGI 工作人员之间存在一些混淆,它们不相关。您在 nginx 中设置的工作人员数量完全取决于您的硬件和性能要求,但是让多个 nginx 工作人员代理到一个 Go 后端不是问题(它“正常工作”)。
    • 我的考虑是另一个。我会尝试更好地解释:假设您有 nginx 和 nodejs 后端。 Node 是单线程的,一次使用一个线程来处理请求。现在,如果我告诉 nginx“使用 8 个工人”,我认为这不是什么大问题。我将需要生成 8 个后端并使用 nginx 对它们进行负载平衡,以实现我告诉 nginx“使用 8 个工作人员”的意思。是不是更清楚了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2019-09-04
    • 1970-01-01
    • 2014-09-06
    • 2018-12-14
    • 2021-01-03
    • 2019-08-09
    相关资源
    最近更新 更多