2012-04-05 31 views
23

我找不到用于部署Go Web应用程序的mod_go。使用Apache Web服务器(甚至是IIS)可以在Go中运行Web应用程序吗?使用Apache部署Go Web应用程序

更新:现在做了全职近一年后;这样做(Go with Apache)正在取消Go的目的(性能是高度并发的)。而且我使用nginx作为http/https的反向代理,并将Go后端很好地放在后面。尽管在使用Go时,您必须稍微改变一下webapps的思维模式。

+0

有兴趣,这也可以看出[类似的问题(http://stackoverflow.com/q/17440415/165293)。 – Mostafa 2013-09-09 04:49:32

回答

22

没有mod_go。 (至少我还没有听说过这样的事情。)

一个去网页应用程序本身是一个功能强大的网络服务器。您可以在您的应用程序中收听端口80,然后直接在您的服务器上运行它。相信我:它确实有效!

但是,如果您没有这样做(由于在同一台机器上具有其他虚拟服务器,负载平衡等原因),您可以使用HTTP服务器(例如nginx或Apache)作为HTTP代理你的Go应用程序。我使用nginx,它很棒。 Here's an outdated but still very useful指导如何用nginx做到这一点。我没有使用Apache,但this应该有所帮助。

我推荐你自己的Go Web应用程序或者nginx作为HTTP代理。

+0

我发现这个mod_go的github回购,它可能是有趣的检查:https://github.com/idaunis/mod_go – 2015-07-22 12:56:41

8

虽然不是很理想,但您可以通过将Go程序放置在cgi-bin目录中,将它们作为CGI脚本运行。你可以调用它们像任何其他页面通过server.com/cgi-bin/myapp?foo=bar

一个例子程序是这样的:

package main 

import (
    "fmt" 
    "net/http" 
    "net/http/cgi" 
) 

func hello(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello from Go!") 
} 

func main() { 
    http.HandleFunc("/", hello) 
    cgi.Serve(nil) 
} 

的原因,这是不是运行程序为自己的服务器是最佳的,是用CGI方法,程序会针对每一个请求进行调用。所以它内部的任何状态都不会持续。

为了清楚起见,您应该将已编译的二进制文件放在cgi-bin目录中。不是程序源。

22

除了其他选项,还有net/http/fcgi包。这与CGI选项类似,但它使用FastCGI,如果需要,您的应用程序可以保持状态。

下面是jimt示例的FastCGI版本。请注意,只有两条线是不同的。根据你如何配置Apache,你可能不得不将第一个参数改变为不同的东西,但是零是常见的情况。

package main 

import (
    "fmt" 
    "net/http" 
    "net/http/fcgi" 
) 

func hello(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello from Go!") 
} 

func main() { 
    http.HandleFunc("/", hello) 
    fcgi.Serve(nil, nil) 
} 
+0

你知道任何使用net/http/fcgi的例子吗? – BurntSushi5 2012-04-06 22:32:47

+0

@ BurntSushi5编辑添加示例 – 2012-04-07 08:22:43

+0

但是,这里有一个限制,这对某个人可能很重要。引用软件包文档:“目前只支持响应者角色”。这意味着这种方式无法通过Go代码来处理http认证。 – abbot 2012-04-09 04:49:45

2

我只是使用Web服务器的代理功能,并在服务器上将我的应用程序作为常规守护程序(使用daemonize)运行。在Apache将是ProxyPass + ProxyPreserveHost

+0

你有什么例子吗? – slier 2017-12-06 07:42:40