Go(golang)webservices的Webserver:使用NGINX还是不?

我正在写一些webservices返回JSON数据,有很多的用户。

你会推荐使用NGINX作为networking服务器还是使用Go的标准HTTP服务器?

这取决于。

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

  • 访问日志
  • 错误日志
  • 简单的SSL终止
  • SPDY支持
  • gzip支持
  • 简单的方法可以在几行中为特定的路由设置HTTP标头
  • 非常快速的静态资产服务(如果你服务于S3 / etc,但这不是相关的)

Go HTTP服务器是非常好的,但是你需要重新发明这些东西(这很好:它不是为了所有人)。

我总是发现把nginx放在前面更容易 – 这是它擅长的 – 并让它做“web服务器”的东西。 我去应用程序做的应用程序的东西,只有最低限度的头/等。 它需要。 不要把nginx作为一个“坏”的东西放在前面。

Go的标准http服务器没问题。 如果你的应用程序大部分/只是“dynamic的”请求/响应,那么它确实是最好的方法。

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

如果您需要使用相同的IP地址提供不同的应用程序,nginx是代理在不同应用程序之间分配请求的不错select; 尽pipe我更经常从工具箱中获得清漆或HAProxy。

大猩猩networking工具包给你:

  • 高级路由(域/子域限制,正则expression式path匹配)。
  • gzip支持(通过中间件处理程序 )
  • logging以Apache公共日志格式输出的中间件处理程序。
  • 保护encryption的cookie。
  • 会话。
  • schema包将表单值转换为结构体。

这填补了Go的net/http和HTTP服务器(如NGINX)之间的很大差距。

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

我认为net/http是任何标准库中function最强大的HTTP服务器。

https://blog.gopheracademy.com/caddy-a-look-inside/它看起来像Go可以使用中间件来处理gzip,错误,静态文件,路由和http头。; 从博客下面的行显示你将如何处理这样的请求。

 logHandler(gzipHandler(fileServer)) 

他们以一种非常有趣的方式处理错误日志。 只要中间件返回一个错误代码(int),error handling中间件就会自动处理它。 他们甚至像Nginx一样去configuration整个网站。 “所有Gopher学院网站的nginx.conf文件长度超过115行,等效的Caddyfile只有50行。”