2016-04-27 16 views
2

Golangを私のサーバー側の言語として使用したいが、net/httpに頼るのではなく、Webサーバーとしてnginxを指していることを読んだことがある。(それは悪くはないが全体的にはこのポストのポイントではないようだしかし)。Golangと一緒にリバースプロキシとしてnginxを使用するにはどうすればよいですか?

私はfastcgiをGolangで使用する方法についていくつかの記事を見つけましたが、逆プロキシやHTTPなどでは見つけられません。this benchmark以外は不幸にも詳細には入りません。

これはどのように動作するかについてのチュートリアル/ガイドはありますか?

たとえば、ノードで詳細を示すbig post on Stackoverflowがありますが、同様のものは見つかりません。

+0

プロキシとしてnginx、実際のビジネスサーバーを作るプログラミング言語としてgolang、大丈夫です。あなたの問題は何ですか? –

+0

http://nf.id.au/posts/2010/10/deploying-go-web-services-behind-nginx-under.htmlを参照してください。 –

答えて

2

キャッシュにnginxを使用していない限り、これはもう必要ありません.Golang 1.6+は、httpとhttpsを直接処理するのに十分です。

あなたが主張している、と私は密かにあなたを判断し、あなたを笑うだろうただし、ここでの作業の流れだ:

  1. あなたの行くアプリはローカルポートでリッスンし、「127.0.0.1:8080」と言います
  2. nginxは0.0.0.0:80と0.0.0.0:443をリッスンし、すべての要求を127.0.0.1:8080にプロキシします。
  3. と判断されます。

Node.js + Nginx - What now?でnginxの設定は正確にあなたが行くために使用するのと同じ設定、またはCGI/FastCGIのではないことについては、他のスタンドアロンサーバーです。

+0

負荷分散のようなものでも? Goはそれを処理しますか? – mickdoe

+1

@mickdoeいいえ、しかし、それのためのパッケージがありますが、それはnginxを使用する正当な理由ですが、私はあなたのためにそれを判断しません。 ;) あなたは単一のgo appを提供するためにただ一つのnginxインスタンスを実行していると判断されます。多くの人がそれを行います。 – OneOfOne

+0

ええ、あなたはすぐに私の心を変えています。 :)だから私は理論的に 'net/http'をしばらく使っていましたか? – mickdoe

0

私は、FastCGI接続にTCPの代わりにUnixソケットを使用して、Nginxを非常に効果的に使用しています。このコードスニペットはMannersから来ますが、通常のGo APIに対しても非常に簡単に適用できます。

func isUnixNetwork(addr string) bool { 
    return strings.HasPrefix(addr, "/") || strings.HasPrefix(addr, ".") 
} 

func listenToUnix(bind string) (listener net.Listener, err error) { 
    _, err = os.Stat(bind) 
    if err == nil { 
     // socket exists and is "already in use"; 
     // presume this is from earlier run and therefore delete it 
     err = os.Remove(bind) 
     if err != nil { 
      return 
     } 
    } else if !os.IsNotExist(err) { 
     return 
    } 
    listener, err = net.Listen("unix", bind) 
    return 
} 

func listen(bind string) (listener net.Listener, err error) { 
    if isUnixNetwork(bind) { 
     logger.Printf("Listening on unix socket %s\n", bind) 
     return listenToUnix(bind) 
    } else if strings.Contains(bind, ":") { 
     logger.Printf("Listening on tcp socket %s\n", bind) 
     return net.Listen("tcp", bind) 
    } else { 
     return nil, fmt.Errorf("error while parsing bind arg %v", bind) 
    } 
} 

スイッチングはUnixドメインソケット経由のTCP接続およびFastCGIを介してHTTPの間で発生した場所である、およそline 252周りを見てみましょう。

Unixソケットでは、ソケットが適切な所有権と権限を持って整然とした方法で作成されるように、起動スクリプトを調整する必要があります。あなたがその権利を得るならば、残りは簡単です。


あなたはnginxのを使用する理由について他の発言に答えるために、それは常にあなたのユースケースに依存します。私はNginxがホストする静的/ PHPウェブサイトを持っています。そのような場合に同じサーバ上のリバースプロキシとして使用すると便利です。

関連する問題