Go Webアプリケーションをデプロイするためのmod_goが見つかりません。 Apache Webサーバー(またはIIS)を使用してGoでWebアプリケーションを実行する他の方法はありますか?
pdate:Goを1年近く実行した後。これを実行すると(Apacheを使用して)、Goの目的(高度な並行性に関するパフォーマンス)が無効になります。また、nginxをhttp/httpsのリバースプロキシとして使用していて、Goバックエンドを適切にサポートしています。 Goを使用する場合は、webappsの考え方を少し変更する必要があります。
Mod_goはありません。 (少なくとも私はそのようなことを聞いたことがありません。)
Go Webアプリ自体は、対応可能なWebサーバーです。アプリでポート80をリッスンして、サーバーで直接実行できます。私を信じて:それは本当にうまくいく!
ただし、それを行わない場合(同じマシン上に他の仮想サーバーがある、負荷分散などの理由で)、Goアプリの前でHTTPプロキシとしてnginxやApacheなどのHTTPサーバーを使用できます。私はnginxを使用しています。 これは古いですが、まだ非常に便利です nginxでそれを行う方法のガイド。私はApacheでそれをしていませんが、 this が役立つはずです。
Go Webアプリを単独で、またはHTTPプロキシとしてnginxをお勧めします。
他のオプションに加えて、 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)
}
興味のある方のために、最近リリースされた mod_go がここにあります。
理想的ではありませんが、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ディレクトリに配置する必要があります。プログラムのソースではありません。
私はWebサーバーのプロキシ機能を使用し、サーバー上で(daemonizeを使用して)通常のデーモンとしてアプリを実行しています。 ApacheではProxyPass
+ ProxyPreserveHost
になります。
これにより、ドメインとサブドメインの要求が指定されたポートにプロキシされます。
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>