27

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

更新:现在全职做了将近一年的 Go;这样做(Go with Apache)是在否定 Go 的目的(在高度并发方面的性能)。我使用 nginx 作为 http/https 的反向代理,并且很好地支持我的 Go 后端。虽然在使用 Go 时你必须稍微改变你对 webapps 的心态。

4

6 回答 6

28

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

Go Web 应用程序本身就是一个功能强大的 Web 服务器。您可以在您的应用程序中监听端口 80,然后直接在您的服务器上运行它。相信我:它真的有效!

但是如果你不这样做(因为在同一台机器上有其他虚拟服务器、负载平衡等原因),你可以在你的 Go 应用程序前面使用 HTTP 服务器,如 nginx 或 Apache 作为 HTTP 代理。我使用 nginx,它很棒。这是一个过时但仍然非常有用的指南,介绍如何使用 nginx 做到这一点。我没有用 Apache 做过,但这应该会有所帮助。

我推荐你的 Go web 应用程序本身或 nginx 作为 HTTP 代理。

于 2012-04-05T21:53:01.710 回答
24

除了其他选项之外,还有net/http/fcgi包。这类似于 CGI 选项,但它使用 FastCGI 并且您的应用程序可以在需要时保持状态。

这是 jimt 示例的 FastCGI 版本。请注意,只有两行不同。根据您配置 Apache 的方式,您可能必须将第一个参数更改为不同的参数,但 nil 是常见的情况。

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)
}
于 2012-04-06T10:05:32.807 回答
15

对于那些感兴趣的人,这里有一个最近发布的用于 Apache 的mod_go :

https://github.com/idaunis/mod_go

于 2012-12-08T01:16:53.127 回答
9

虽然并不理想,但您可以将 Go 程序作为 CGI 脚本运行,方法是将它们放在 cgi-bin 目录中。您可以像任何其他页面一样调用它们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 目录中。不是程序源。

于 2012-04-05T23:02:30.953 回答
3

这会将域和子域请求代理到指定端口。

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    ServerName www.yourdomain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    ServerName subdomain.yourdomain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://127.0.0.1:8081/
    ProxyPassReverse / http://127.0.0.1:8081/
</VirtualHost>
于 2019-02-27T03:15:57.100 回答
2

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

于 2012-04-09T04:46:55.027 回答