27

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

更新: ほぼ 1 年間フルタイムで Go を行った後。これを行う (Apache を使用する) ことは、Go の目的そのもの (高度な並行性という点でのパフォーマンス) を無効にします。そして、http/https のリバース プロキシとして nginx を使用し、その背後に Go バックエンドをうまく配置しています。ただし、Go を使用する場合は、Web アプリケーションに対する考え方を少し変える必要があります。

4

6 に答える 6

28

mod_go はありません。(少なくとも私はそんな話は聞いたことがありません。)

Go Web アプリ自体が有能な Web サーバーです。アプリでポート 80 をリッスンし、サーバーで直接実行できます。私を信じてください:それは本当にうまくいきます!

ただし、それを行っていない場合 (同じマシンに他の仮想サーバーがある、負荷分散などの理由で)、Go アプリの前で nginx や Apache などの HTTP サーバーを HTTP プロキシとして使用できます。私はnginxを使用していますが、それは素晴らしいです。これは時代遅れですが、nginxでそれを行う方法に関する非常に役立つガイドです。私はApacheでそれを行っていませんが、これは役立つはずです。

Go Web アプリを単独で使用するか、HTTP プロキシとして nginx を使用することをお勧めします。

于 2012-04-05T21:53:01.710 に答える
24

他のオプションに加えて、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)
}
于 2012-04-06T10:05:32.807 に答える
15

興味のある方は、最近リリースされた Apache 用のmod_goがここにあります。

https://github.com/idaunis/mod_go

于 2012-12-08T01:16:53.127 に答える
9

理想的ではありませんが、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ディレクトリに配置する必要があります。プログラムソースではありません。

于 2012-04-05T23:02:30.953 に答える
2

Web サーバーのプロキシ機能を使用し、サーバー上で (daemonize を使用して) 通常のデーモンとしてアプリを実行するだけです。apache ではProxyPass+になりProxyPreserveHostます。

于 2012-04-09T04:46:55.027 に答える