使用Apache部署Go Web应用程序

28

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

更新:现在,我已经全职使用Go将近一年了;使用Apache(与Go一起)将使Go的主要目的失去作用(即高并发性能)。我正在使用nginx作为http / https的反向代理,并将我的Go后端放在其后面。尽管当使用Go时,您需要在Web应用程序方面改变一些思维方式。


对此感兴趣的人也可以查看类似的问题 - Mostafa
6个回答

30

没有mod_go(至少我没有听说过)。

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

但是,如果您不这样做(出于其他虚拟服务器位于同一台机器上、负载均衡等原因),则可以使用HTTP服务器(例如nginx或Apache)作为Go应用程序前面的HTTP代理。我使用nginx,它非常好。这里有一个已过时但仍然非常有用的指南,介绍如何使用nginx进行此操作。我没有使用Apache,但这篇文章应该会有所帮助。

我建议您使用Go web应用本身或者nginx作为HTTP代理。


1
我在 GitHub 上找到了这个 mod_go,可能值得一看:https://github.com/idaunis/mod_go - Mika Andrianarijaona

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)
}

你知道使用 net/http/fcgi 的任何示例吗? - BurntSushi5
@BurntSushi5 编辑后添加一个示例 - Evan Shaw
这里有一个限制,对某些人来说可能是至关重要的。引用包文档:“目前仅支持响应者角色”。这意味着您的Go代码无法以这种方式处理http auth。 - abbot
1
@abbot 这不正确。授权 FCGI 角色与 HTTP 授权无关。授权应用程序根据整个 HTTP 请求决定客户端是否有访问权限。然后,如果客户端有访问权限,服务器将响应该请求。 - Evan Shaw

15

10

虽然不是理想的方式,但您可以将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时,程序会被每个请求调用一次。因此,其中的任何状态都不会持久存在。

为了清晰起见:您应该将编译好的二进制文件放置在cgi-bin目录中,而不是程序源代码。


4
这将代理域名和子域名请求到指定的端口。
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>

2

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


你有任何例子吗? - slier

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