web-dev-qa-db-ja.com

Apacheを使用したGo Webアプリケーションのデプロイ

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

pdate:Goを1年近く実行した後。これを実行すると(Apacheを使用して)、Goの目的(高度な並行性に関するパフォーマンス)が無効になります。また、nginxをhttp/httpsのリバースプロキシとして使用していて、Goバックエンドを適切にサポートしています。 Goを使用する場合は、webappsの考え方を少し変更する必要があります。

26

Mod_goはありません。 (少なくとも私はそのようなことを聞​​いたことがありません。)

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

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

Go Webアプリを単独で、またはHTTPプロキシとしてnginxをお勧めします。

25
Mostafa

他のオプションに加えて、 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)
}
22
Evan Shaw

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

https://github.com/idaunis/mod_go

13
user1784334

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

9
jimt

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

2
abbot

これにより、ドメインとサブドメインの要求が指定されたポートにプロキシされます。

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin [email protected]
    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 [email protected]
    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>
1
Mateus Lopes