我找不到部署 Go Web 应用程序的mod_go。有没有其他方法可以使用ApacheWeb服务器(甚至IIS)在Go中运行Web应用程序?
更新:现在,在全职做了将近一年的 Go 之后;这样做(Go with Apache)抵消了 Go 的目的(在高度并发方面的性能)。我正在使用nginx作为http/https的反向代理,并且我的Go后端很好地支持它。尽管在使用Go时,您必须稍微改变一下对Web应用程序的思维方式。
mod_go。(至少我没有听说过这样的事情。
Go Web 应用程序本身就是一个功能强大的 Web 服务器。您可以在应用中侦听端口 80,然后直接在服务器上运行它。相信我:它真的有效!
但是,如果您不这样做(出于诸如在同一台计算机上具有其他虚拟服务器,负载平衡等原因),则可以在Go应用程序前面使用nginx或Apache等HTTP服务器作为HTTP代理。我使用nginx,它很棒。这是一个过时但仍然非常有用的指南,介绍如何使用nginx执行此操作。我还没有用 Apache 做过,但这应该会有所帮助。
我推荐你的Go Web应用程序本身或nginx作为HTTP代理。
除了其他选项,还有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)
}
对于那些感兴趣的人,这里有一个最近发布的 Apache mod_go:
https://github.com/idaunis/mod_go
虽然不理想,但您可以通过将 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 目录中。不是程序源。
这会将域和子域请求代理到指定的端口。
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>
我只是使用 Web 服务器的代理工具,并在服务器上将我的应用程序作为常规守护程序(使用守护程序)运行。在阿帕奇上,这将是ProxyPass
+ ProxyPreserveHost
.