在生产环境中提供Go Web应用程序

3
什么是在生产环境中处理Go Web应用程序的最佳方法,涉及静态内容、灵活性和安全性?
我应该从一个完全缓冲的反向代理(如nginx)后面提供Go服务吗?如果是这样,我应该让nginx处理静态内容吗?
我应该使用类似于此处建议的ServeMuxFileServer来从Go应用程序提供静态内容吗:Serve homepage and static content from root
我需要在生产中使用像NaCL或AppArmor这样的沙盒技术来保护我的应用程序吗?
1个回答

6
Your question has clearly outlined the tradeoffs. However, I cannot determine which option to choose, as it depends on your specific application. Here are some points to consider for each option.

Security

You have mentioned two security-related points:

  1. Using nginx as a reverse proxy
  2. Sandboxing

If you are running a sensitive application (such as financial data), terminating SSL connections with nginx (or apache) is crucial because they use OpenSSL, which has been reviewed by many security experts. Although the Go crypto library is excellent and authored by a well-respected individual in the field, it has not undergone the same level of scrutiny.

我不能告诉你什么对你的应用最好,但在生产中使用自己编写的Go应用程序时,我还没有看到太多关于沙箱化的讨论。一个非常令人兴奋的新项目是docker.io,它可以在许多层面上为您提供沙箱功能,甚至超出了您的Go应用程序。在我看来,只要您跟踪Go的最新版本并避免做不安全的事情(比如导入"unsafe"和使用cgo),使用NaCl或AppArmor可能会比它的价值更麻烦。话虽如此,如果您正在做类似Go Playground的事情,几乎肯定需要对不受信任的Go程序进行沙箱处理。

静态内容

您可以按照自己的意愿进行操作。我会选择最简单的方式。Go应用程序可以轻松地同时提供其自身的静态内容和动态内容,因此我认为,在基准测试和监控告诉您无法处理负载之前,将其分离出来通常是过早的优化。

灵活性

我认为,将所有内容保存在单个二进制文件中的灵活性是不可争议的。这使得部署变得非常容易,减少了需要进行的配置和监控数量等。现在的静态文件可以在以后变成动态文件;如果你发现需要内存缓存或共享memcache,可以在那里添加它们。通常很难知道未来需要什么,因此在原型设计和初始部署阶段尽可能保持灵活性可能会带来巨大的好处。
作为一个额外的奖励,也回到了前面两个问题,如果你的应用程序/网站变得非常成功,你可能会在CDN(如CloudFlare,他们的基础设施的一些关键部分使用Go)之后提供服务,这将处理静态内容的缓存和SSL连接的终止。这可以成为保持简单和最小化前期工程成本的理由,因为如果需要,可以稍后使用现有解决方案。

3
非常好的回答!我还想补充一点,在Linux上进行沙盒化,Docker可以非常有效地实现(http://docker.io)。它也是用Go语言编写的! - Intermernet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接