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:
- Using nginx as a reverse proxy
- 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连接的终止。这可以成为保持简单和最小化前期工程成本的理由,因为如果需要,可以稍后使用现有解决方案。