2012-04-05 57 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