【问题标题】:What are the benefits of using Nginx in front of a webserver for Go?在 Go 的网络服务器前使用 Nginx 有什么好处?
【发布时间】:2013-07-21 20:29:21
【问题描述】:

我正在编写一些返回 JSON 数据的 Web 服务,这些服务有很多用户。

与只使用 go http 服务器相比,在我的服务器前端使用 Nginx 有什么好处?

【问题讨论】:

  • fyi,有很多 tcp 错误,例如对等方重置连接,以及使用 Go http 服务器处理每分钟 100 多个大型 POST 请求的服务的 i/o 超时。把 nginx 放在它前面 - 没有更多的问题。
  • 最终我决定使用 Go http 服务器,没有 NGINX,而且效果很好。我没有遇到任何问题。但我的服务没有像你的情况那样运行大型 POST 请求。
  • 这不一定基于意见。如此结束它表明严重缺乏对此类问题的答案可以填写和提供的考虑因素和警告的理解。选定的答案就是一个很好的例子。事实上,我在所有提供的答案中都看到了相关的新考虑因素。
  • 是的,这不是基于意见的。

标签: web-services http nginx webserver go


【解决方案1】:

视情况而定。

开箱即用,将 nginx 作为反向代理放在前面会给你:

  • 访问日志
  • 错误日志
  • 轻松终止 SSL
  • SPDY 支持
  • gzip 支持
  • 在几行中为某些路由设置 HTTP 标头的简单方法
  • 非常快速的静态资产服务(如果您在 S3/etc 上提供服务,那么这无关紧要)

Go HTTP 服务器非常好,但您需要重新发明轮子来做这些事情(这很好:它并不意味着对所有人都适用)。

我总是发现将 nginx 放在前面更容易——这是它擅长的——让它做“网络服务器”的事情。我的 Go 应用程序执行应用程序的内容,并且只有极少的标头/等。它需要。不要把 nginx 放在前面是一件“坏”的事情。

【讨论】:

  • 感谢您的回复! - 1) Go HTTP 会产生某种日志吗? - 2) nginx 是否会以某种方式降低请求/响应吞吐量?
  • @DanieleB Go HTTP 服务器只生成您想要的日志(即使用log 包)。如果你想记录 IP 地址、资源访问等,你需要写出来。除了基础知识之外,设置标题也是如此。虽然我没有任何具体的数据,但 Go 前面的 nginx 确实应该不会比 Go 慢:事实上,由于 gzip 及其自身的优化,它可能会更快。 “成本”将是更多的内存/CPU 利用率,但 nginx 在这方面也非常有效。
  • 另一个重要功能:您将如何升级/维护您的应用程序(当它关闭时不会丢包)? Nginx 将让您在不丢失数据包的情况下控制流量。
  • 在我的树莓派上,将 Nginx 放在 Go 前面显着提高了页面加载速度。
  • 你可以使用 nginx 进行负载平衡 - 你不能使用 Go 内置。因此我推荐在前面使用 nginx
【解决方案2】:

Go 的标准 http 服务器很好。如果您的应用程序主要/仅是“动态”请求/响应,那么这确实是最好的方法。

您可以使用 nginx 来提供静态资产,但很可能标准的 Go 也可以。如果您需要更高的性能,您应该尽可能多地使用 CDN 或缓存(例如)。

如果您需要通过相同的 IP 地址为不同的应用程序提供服务,那么 nginx 是代理在不同应用程序之间分发请求的最佳选择;虽然我更经常将 Varnish 或 HAProxy 从工具箱中取出来处理这类事情。

【讨论】:

  • 是的,我实际上只是将它用于提供动态数据。所以,我想我那时不需要 NGINX!感谢您的回复
  • 不需要清漆/HAProxy,Nginx 有类似的缓存和负载均衡工具集。
  • @mikhailov 不是我说的吗? nginx 很适合它;虽然我个人经常更喜欢 Varnish 或 HAproxy。我发现它们更易于配置和操作。
【解决方案3】:

Gorilla web toolkit 给你:

  • 高级路由(域/子域限制、正则表达式路径匹配)。
  • gzip 支持(通过middleware handlers.)
  • 以 Apache 通用日志格式输出的日志中间件处理程序。
  • 安全的加密 cookie。
  • 会话。
  • schema 包将表单值转换为结构。

这填补了 Go 的 net/http 和 NGINX 等 HTTP 服务器之间的许多空白。

就我个人而言,如果我知道可以插入 CDN,我会避免在 net/http 之上安装和配置另一个 HTTP 服务器。

我认为net/http 拥有所有标准库中最强大的 HTTP 服务器。

【讨论】:

    【解决方案4】:

    https://blog.gopheracademy.com/caddy-a-look-inside/ 看来,Go 可以使用中间件处理 gzip、错误、静态文件、路由和 http 标头。 下面一行来自博客,展示了您将如何处理此类请求。

    logHandler(gzipHandler(fileServer))
    

    他们以一种非常有趣的方式处理错误记录。只要您的中间件返回错误代码 (int),错误处理中间件就会自动处理它。他们甚至已经像 Nginx 一样在 Go 中配置整个站点。 “所有 Gopher Academy 网站的 nginx.conf 文件都超过 115 行。等效的 Caddyfile 只有 50 行。”

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 1970-01-01
      • 2017-07-25
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多