Goプログラムはポート80でリッスンし、HTTPリクエストを直接処理できます。代わりに、Goプログラムの前でリバースプロキシを使用して、ポート80でリッスンし、ポート(たとえば4000)でプログラムに接続することができます。後者を実行する理由はたくさんあります。実行する必要がないからです。ルートとしてGoプログラム、同じホスト上で他のウェブサイト/サービスを提供、SSL終了、負荷分散、ロギングなど
HAProxyを使用していますは前で。リバースプロキシはすべて機能します。Nginxも優れたオプションです(HAProxyよりもはるかに人気があり、より多くのことが可能です)。
HAProxyのドキュメント(HTMLバージョン)を読むと、設定が非常に簡単です。haproxy.cfg
開始点が必要な場合に備えて、私のGoプロジェクトの1つのファイル全体が続きます。
global
log 127.0.0.1 local0
maxconn 10000
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http
bind :80
acl is_stats hdr(host) -i hastats.myapp.com
use_backend stats if is_stats
default_backend myapp
capture request header Host len 20
capture request header Referer len 50
backend myapp
server main 127.0.0.1:4000
backend stats
mode http
stats enable
stats scope http
stats scope myapp
stats realm Haproxy\ Statistics
stats uri /
stats auth username:password
Nginxはさらに簡単です。
サービスコントロールに関しては、Goプログラムをシステムサービスとして実行しています。みんなそうだと思います。私のサーバーはUbuntuを実行しているため、Upstartを使用しています。私はこれ/etc/init/myapp.conf
をUpstartが私のプログラムを制御するために入れました:
start on runlevel [2345]
stop on runlevel [!2345]
chdir /home/myapp/myapp
setgid myapp
setuid myapp
exec ./myapp start 1>>_logs/stdout.log 2>>_logs/stderr.log
別の側面は展開です。1つのオプションは、プログラムのバイナリファイルと必要なアセットを送信するだけでデプロイすることです。これは非常に優れたソリューションIMOです。私は他のオプションを使用します:サーバーでコンパイルします。(いわゆる「継続的インテグレーション/デプロイメント」システムをセットアップするときに、バイナリファイルを使用したデプロイメントに切り替えます。)
サーバーの小さなシェルスクリプトを使用して、リモートGitリポジトリからプロジェクトのコードをプルし、Goでビルドして、バイナリやその他のアセットを ~/myapp/
に、サービスを再起動します。
全体として、他のサーバー設定と全体的にそれほど違いはありません。コードを実行してHTTPリクエストを処理する方法が必要です。実際には、Goはこのようなものに対して非常に安定していることが証明されています。