Program Go dapat mendengarkan pada port 80 dan melayani permintaan HTTP secara langsung. Alih-alih, Anda mungkin ingin menggunakan proxy terbalik di depan program Go Anda, sehingga program ini mendengarkan di port 80 dan dan terhubung ke program Anda di port, katakanlah, 4000. Ada banyak alasan untuk melakukan yang terakhir: tidak harus menjalankan program Go Anda sebagai root, melayani situs web / layanan lain di host yang sama, penghentian SSL, load balancing, logging, dll.
Saya menggunakan HAProxy di depan. Proksi terbalik apa pun dapat berfungsi. Nginx juga merupakan opsi yang bagus (jauh lebih populer daripada HAProxy dan mampu melakukan lebih banyak hal).
HAProxy sangat mudah dikonfigurasi jika Anda membaca dokumentasinya ( versi HTML ). Seluruh haproxy.cfg
file saya untuk salah satu proyek Go saya mengikuti, jika Anda memerlukan pont awal.
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 bahkan lebih mudah.
Mengenai kontrol layanan, saya menjalankan program Go saya sebagai layanan sistem. Saya pikir semua orang melakukan itu. Server saya menjalankan Ubuntu, jadi menggunakan Upstart. Saya telah meletakkan ini di /etc/init/myapp.conf
untuk Pemula untuk mengontrol program saya:
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
Aspek lainnya adalah penerapan. Salah satu opsinya adalah menerapkan hanya dengan mengirimkan file biner dari program dan aset yang diperlukan. Ini adalah solusi IMO yang cukup bagus. Saya menggunakan opsi lain: kompilasi di server. (Saya akan beralih ke penerapan dengan file biner ketika saya menyiapkan apa yang disebut sistem "Integrasi / Penerapan Berkelanjutan".)
Saya memiliki skrip shell kecil di server yang menarik kode untuk proyek saya dari repositori Git jarak jauh, membangunnya dengan Go, menyalin binari dan aset lainnya ke ~/myapp/
, dan memulai ulang layanan.
Secara keseluruhan, semuanya tidak jauh berbeda dari penyiapan server lainnya: Anda harus memiliki cara untuk menjalankan kode Anda dan membuatnya melayani permintaan HTTP. Dalam praktiknya, Go terbukti sangat stabil untuk hal ini.