在静态内容、灵活性和安全性方面,在生产中处理Go web应用程序的最佳方法是什么?
我应该从一个像nginx这样的完全缓冲的反向代理后面提供服务吗?如果是这样,我应该让nginx处理静态内容吗?
我是否应该使用ServeMux
和FileServer
为Go应用程序提供静态内容,如这里所建议的Serve homepage and static content from root
在生产中,我是否需要在我的应用程序中使用像NaCL或AppArmor这样的沙箱?
发布于 2014-01-26 19:43:25
你的问题很好地概括了你的权衡。但是,我不能确切地告诉您应该选择哪一个,因为这将根据您的应用程序的不同而有很大的差异,但以下是每个应用程序的一些要点。
安全性
你提出了两点关于安全的问题:
如果您正在运行一个敏感的应用程序(财务数据等),终止与nginx (或apache)的SSL连接对您来说将是一件大事,因为它们将使用OpenSSL,它已经经过了许多安全专家的审查和审查。围棋密码库是非常好的,是由一个人谁很受尊敬的领域,但它还没有受到同样的审查。
我不能告诉你什么是对你的应用程序最好的,但我还没见过很多关于沙箱本土Go应用的讨论,当我使用这些应用在生产中时。与此相关的一个令人兴奋的新项目是docker.io,它可以使您在许多级别上进行沙箱操作,甚至在Go应用程序之外也是如此。在我看来,只要跟踪Go的最新版本,避免做不安全的事情(比如导入“不安全”和使用cgo),使用NaCl或AppArmor可能会带来比它更大的麻烦。也就是说,如果您正在执行类似于Go Playground的操作,那么几乎肯定需要对不受信任的Go程序进行沙箱处理。
静态含量
你真的可以做任何你想做的事。我会选对你来说最容易的。Go应用程序可以很容易地同时为它们自己的静态内容和它们的动态内容提供服务,所以我想说,在基准测试和监视告诉您它无法处理负载之前,分离它通常是一个过早的优化。
灵活性
我认为很难与将所有事物保持在一个二进制中的灵活性相争。这使得部署变得非常容易,它减少了您需要做的配置和监视的数量,等等。静态文件现在可以是动态的;如果发现您需要内存中的缓存或共享的memcache,则可以将其添加到其中。通常很难准确地知道将来需要什么,所以在原型开发和部署的初期阶段尽可能保持灵活性是一个巨大的好处。
另外,如果您的应用程序/网站非常成功,您可能会使用CDN (比如CloudFlare,它恰好用于一些关键的基础设施)来处理静态内容的缓存和SSL连接的终止。这可能是一个论点,以保持简单和尽量减少前期工程成本,因为你可以在以后使用现有的解决方案,如果需要。
https://stackoverflow.com/questions/21370779
复制