2012-04-05 43 views
23

Go Webアプリケーションを展開するためのmod_goが見つかりません。 Apache Webサーバー(またはIIS)でGoでWebアプリケーションを実行する方法はありますか?ApacheでGo Webアプリケーションを展開する

更新:今すぐ行ってから、ほぼ1年間フルタイムになります。これを実行すると(Apacheと一緒に行く)Goの目的が無効になります(並行性が高いという点でパフォーマンス)。そして、http/httpsのためにリバースプロキシとしてnginxを使い、私のGoバックエンドをうまく背後に持っています。 Goを使用する場合は、ウェブアプリケーションの考え方を少し変えなければなりません。

+0

このに興味のある人も[同様の質問]を参照することができますが(http://stackoverflow.com/q/17440415/165293)。 – Mostafa

答えて

22

mod_goはありません。 (少なくとも私はそのようなことは聞いていない)。

go webアプリケーションは、それ自体が有能なWebサーバーです。あなたはあなたのアプリでポート80を聞いて、あなたのサーバー上で直接実行することができます。私を信じて:それは本当に動作します!

しかし、(同じマシン上に他の仮想サーバーや負荷分散などの理由で)実行していないのであれば、nginxやApacheなどのHTTPサーバーをHTTPプロキシとして使用することができますあなたのGoアプリ。私はnginxを使用し、それは素晴らしいです。 Here's an outdated but still very useful nginxでそれを行う方法についてのガイド。私はApacheでそれをやっていませんが、thisが助けてください。

私はあなたのGoウェブアプリケーションを単独で、またはHTTPプロキシとしてnginxでお勧めします。

+0

githubリポジトリでこのmod_goが見つかりました。興味深い点は次のとおりです。https://github.com/idaunis/mod_go –

8

理想的ではありませんが、GoプログラムをCGIスクリプトとして実行するには、cgi-binディレクトリに配置します。

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でいることです:あなたは、プログラム例は次のようになりserver.com/cgi-bin/myapp?foo=bar

を通じて他のページのようにそれらを呼び出すことができますアプローチは、プログラムはすべての単一の要求のために呼び出されます。したがって、その中のどの状態も持続しません。

わかりやすくするために、コンパイルされたバイナリをcgi-binディレクトリに配置する必要があります。プログラムのソースではありません。

22

他のオプションに加えて、net/http/fcgiパッケージもあります。これはCGIオプションに似ていますが、FastCGIを使用しているため、必要に応じてアプリケーションで状態を保持できます。

jimtの例のFastCGI版です。 2行だけが異なることに注意してください。 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) 
} 
+0

net/http/fcgiを使用している例はありますか? – BurntSushi5

+0

@ BurntSushi5例を追加するために編集 –

+0

ここには1つの制限がありますが、これは誰かにとって重大なものかもしれません。パッケージを引用するとdoc: "現在のところレスポンダーの役割のみがサポートされています"。つまり、このようにGo認証コードでhttp authを処理することはできません。 – abbot

2

私はちょうどWebサーバーのプロキシ機能を使用し、サーバー上で通常のデーモン(daemonizeを使用)として私のアプリケーションを実行します。 Apacheの場合はProxyPass + ProxyPreserveHostとなります。興味のある方のため

+0

あなたはどんな例を持っていましたか? – slier

関連する問題