在静态内容、灵 active 和安全性方面,处理生产环境中的 Go 网络应用程序服务的最佳方式是什么?
我应该从像 nginx 这样的完全缓冲的反向代理后面为 Go 服务吗?如果是这样,我应该让 nginx 处理静态内容吗?
我是否应该使用 ServeMux 和 FileServer 从 Go 应用程序提供静态内容,就像这里建议的那样 Serve homepage and static content from root ?
我的生产应用是否需要使用 NaCL 或 AppArmor 等沙盒?
最佳答案
您的问题很好地概述了您的权衡。不过,我不能肯定地告诉您应该选择哪个,因为这会根据您的应用程序而有很大差异,但这里有一些关于每个应用程序的要点。
您提出了两点关于安全性的问题:
如果您正在运行一个敏感的应用程序(财务数据等),终止与 nginx(或 apache)的 SSL 连接对您来说将是一件大事,因为它们将使用 OpenSSL,OpenSSL 已经过众多安全专家。 Go 加密库非常好,由在该领域备受尊敬的人编写,但尚未受到同样的审查。
我无法告诉您什么最适合您的应用程序,但我还没有看到很多关于沙盒化本土 Go 应用程序在生产中使用它们的讨论。一个与此相关的令人兴奋的新项目是 docker.io ,它甚至可以在您的 Go 应用程序之外为您提供多个级别的沙箱。在我看来,只要你跟踪 Go 的最新版本并且避免做不安全的事情(比如导入“不安全”和使用 cgo),使用 NaCl 或 AppArmor 可能会比它值得的麻烦更多。也就是说,如果您正在做类似 Go Playground 的事情,几乎肯定需要对 不受信任 的 Go 程序进行沙盒处理。 .
你真的可以随心所欲地做到这一点。我会选择对你来说最简单的那个。 Go 应用程序可以轻松地同时提供自己的静态内容和动态内容,所以我认为将其分离出来通常是一种过早的优化,直到您的基准测试和监控告诉您它无法处理负载。
我认为很难对将所有内容保存在一个二进制文件中的灵 active 提出异议。这使得部署非常容易,它减少了您需要做的配置和监控等工作。现在的静态文件以后可以是动态的;如果事实证明您需要内存缓存或共享内存缓存,则可以将其添加到那里。通常很难确切地知道您以后需要什么,因此在制作原型(prototype)和部署的初始阶段保持尽可能多的灵 active 可能会带来巨大的好处。
这里的奖励也可以追溯到前面的两个问题,如果您的应用程序/网站变得非常成功,您可能最终会在 CDN 后面提供服务(例如 CloudFlare ,它恰好使用 Go 来处理一些关键部分他们的基础设施)将同时处理静态内容的缓存和 SSL 连接的终止。这可能是保持事情简单并最大限度地减少前期工程成本的理由,因为您可以在以后需要时使用现有解决方案。
关于nginx - 在生产环境中提供 Go Webapps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370779/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(
从一开始,我就是一个Windows高手。我从MS-DOS开始。我安装了Windows2.1以及此后的所有Windows。现在,我家里有10台不同的Windows机器在运行,从Windows7Ultimate到各种版本的WindowsServer。我还没有完成Windows8,也不想去那里。我在服务器和各种软件方面都有UNIX经验,但它并不是我的首选环境。但是,我想我正在转换。我试图假装使用Cygwin和MSYS在Windows下运行UNIX。我的目的是搭建一个开发环境。两者都让我失望了。我花了比开发更多的时间来解决一系列技术问题。这是NotAcceptable。到目前为止,我的Ruby
为了在我的mac上为一个rails项目安装mysql,我遵循了安装Homebrew软件和删除mac端口的在线建议。这是问题开始的地方。rails项目不会构建,我得到这个:[rake--prereqs]rakeaborted!dlopen(/Users/Parker/.rvm/gems/ruby-1.9.3-p448/gems/nokogiri-1.6.0/lib/nokogiri/nokogiri.bundle,9):Librarynotloaded:/opt/local/lib/libiconv.2.dylibReferencedfrom:/Users/Parker/.rvm/gem
我有一个Rails2.3.5应用程序,其中包含我希望保护的API。没有用户-它是一个应用到应用风格的网络服务(更像是亚马逊服务而不是facebook),所以我想使用两条腿的OAuth方法来实现它。我一直在尝试使用oauth-plugin服务器实现作为开始:http://github.com/pelle/oauth-plugin...但它的构建需要三足(网络重定向流)oauth。在我深入研究对其进行更改以支持两条腿之前,我想看看是否有更简单的方法,或者是否有人有更好的方法让Rails应用程序实现成为两条腿的OAuth提供程序。 最佳答案
如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback