我找不到部署Go Web应用程序的mod_go。是否有其他方法在Apache Web服务器(甚至IIS)中运行Go Web应用程序?
更新:现在,我已经全职使用Go将近一年了;使用Apache(与Go一起)将使Go的主要目的失去作用(即高并发性能)。我正在使用nginx作为http / https的反向代理,并将我的Go后端放在其后面。尽管当使用Go时,您需要在Web应用程序方面改变一些思维方式。
我找不到部署Go Web应用程序的mod_go。是否有其他方法在Apache Web服务器(甚至IIS)中运行Go Web应用程序?
更新:现在,我已经全职使用Go将近一年了;使用Apache(与Go一起)将使Go的主要目的失去作用(即高并发性能)。我正在使用nginx作为http / https的反向代理,并将我的Go后端放在其后面。尽管当使用Go时,您需要在Web应用程序方面改变一些思维方式。
除了其他选项之外,还有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)
}
虽然不是理想的方式,但您可以将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目录中,而不是程序源代码。
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服务器的代理功能,并将我的应用程序作为常规守护进程(使用daemonize)在服务器上运行。在Apache上,这将是ProxyPass
+ProxyPreserveHost
。