Go programları 80 numaralı bağlantı noktasını dinleyebilir ve HTTP isteklerini doğrudan sunabilir. Bunun yerine, Go programınızın önünde bir ters proxy kullanmak isteyebilirsiniz, böylece program 80 numaralı bağlantı noktasını dinler ve programınıza bağlantı noktası, örneğin 4000 üzerinden bağlanır. İkincisini yapmanın birçok nedeni vardır: çalıştırmak zorunda olmamak Go programınız kök olarak, aynı ana bilgisayarda başka web sitelerine / hizmetlere hizmet veriyor, SSL sonlandırma, yük dengeleme, günlük kaydı vb.
Önde HAProxy kullanıyorum . Herhangi bir ters proxy çalışabilir. Nginx aynı zamanda harika bir seçenektir (HAProxy'den çok daha popülerdir ve daha fazlasını yapabilir).
Belgelerini ( HTML sürümü ) okursanız, HAProxy'nin yapılandırılması çok kolaydır . haproxy.cfg
Başlangıç pontuna ihtiyacınız olması durumunda, Go projelerimden biri için tüm dosyam aşağıdaki gibidir.
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 daha da kolay.
Servis kontrolü ile ilgili olarak, Go programımı bir sistem servisi olarak çalıştırıyorum. Bence bunu herkes yapıyor. Sunucum Ubuntu'yu çalıştırdığı için Upstart kullanıyor. Bunu /etc/init/myapp.conf
Upstart'ın programımı kontrol etmesi için koydum :
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
Diğer bir husus da konuşlandırmadır. Seçeneklerden biri, programın ikili dosyasını ve gerekli varlıkları göndererek dağıtmaktır. Bu oldukça harika bir çözüm IMO. Diğer seçeneği kullanıyorum: sunucuda derleme. (Sözde “Sürekli Entegrasyon / Dağıtım” sistemi kurduğumda ikili dosyalarla dağıtıma geçeceğim.)
Sunucuda, projem için uzaktaki bir Git deposundan kod çeken, Go ile oluşturan, ikili dosyaları ve diğer varlıkları kopyalayan ~/myapp/
ve hizmeti yeniden başlatan küçük bir kabuk betiğim var .
Genel olarak, her şey diğer herhangi bir sunucu kurulumundan çok farklı değildir: kodunuzu çalıştırmanın ve HTTP isteklerine hizmet etmesini sağlamanın bir yolunu bulmanız gerekir. Pratikte, Go bu tür şeyler için çok kararlı olduğunu kanıtladı.