服务Go Webapps在生产中

wma*_*but 3 nginx go

在静态内容,灵活性和安全性方面,处理生产中的Go Web应用程序的最佳方法是什么?

我应该从像nginx这样的全缓冲反向代理服务后面吗?如果是这样,我应该让nginx处理静态内容吗?

我是否应该使用ServeMuxFileServer此处建议的服务主页和来自root的静态内容一起提供来自Go应用程序的静态内容

我是否需要在我的应用程序中使用NaCL或AppArmor沙盒?

Kyl*_*ons 6

你的问题很好地概括了你的权衡.我不能告诉你某些你应该选择的东西,因为根据你的应用程序会有很大不同,但每个都有一些要点.

安全

你提出了两点关于安全性的观点:

  1. 在nginx后面反向代理
  2. 沙箱

如果您正在运行一个敏感的应用程序(财务数据等),那么终止与nginx(或apache)的SSL连接对您来说将是一件大事,因为他们将使用OpenSSL,OpenSSL已经过许多安全专家的审查和审查.Go加密库非常好,由在该领域备受推崇的人撰写,但尚未受到同样的审查.

我不能告诉你什么对你的应用程序有什么好处,但我还没有看到很多关于使用它们在生产中服务的沙盒本土Go应用程序的讨论.与此相关的一个令人兴奋的新项目是docker.io,它甚至可以在Go应用程序之外的多个级别为您提供沙盒.在我看来,只要你追踪围棋的最新版本和你避免做不安全的事情(如进口"不安全",用CGO),采用NaCl或AppArmor的很可能将是更多的麻烦比它的价值.也就是说,如果你正在做Go Playground之类的东西,那么几乎肯定需要沙盒不受信任的 Go程序.

静态内容

你可以随心所欲地做到这一点.我会选择最适合你的方式.Go应用程序可以轻松地将自己的静态内容与动态内容一起提供,因此我认为将其分离出来通常是不成熟的优化,直到您的基准测试和监视告诉您它无法处理负载.

灵活性

我认为很难与将所有内容保存在一个二进制文件中的灵活性争论.这使得它非常容易部署,它减少了您需要执行的配置和监视的数量等.现在,什么是静态文件可以是动态的; 如果事实证明你需要内存缓存或共享内存缓存,你可以在那里添加它.通常很难确切地知道您将需要什么,所以在您进行原型设计和部署的初始阶段时尽可能保持灵活性可以带来巨大的好处.

这里作为奖金也可以追溯到两者的前面的问题,如果您的应用程序/网站变得非常成功,你可能清盘服务后面的CDN(如CloudFlare的,这恰好使用Go他们的基础设施的一些关键部分),将两者都处理静态内容的缓存和SSL连接的终止.这可以成为保持简单和最小化前期工程成本的理由,因为您可以在以后根据需要使用现有解决方案.

  • 非常好的答案!我还补充说,对于Linux上的沙盒,Docker可以很好地工作(http://docker.io).它也写在Go! (3认同)