Програми Go можуть слухати на порту 80 та обслуговувати HTTP-запити безпосередньо. Натомість ви можете використовувати зворотний проксі перед програмою Go, щоб вона прослуховувала порт 80 і підключалася до вашої програми на порту, скажімо, 4000. Є багато причин для виконання останнього: не потрібно запускати ваша програма Go як root, що обслуговує інші веб-сайти / служби на тому самому хості, завершення SSL, балансування завантаження, ведення журналів тощо.
Я використовую HAProxy спереду. Будь-який зворотний проксі може працювати. Nginx - це також чудовий варіант (набагато популярніший за HAProxy і здатний робити більше).
HAProxy дуже легко налаштувати, якщо ви прочитаєте її документацію ( версія HTML ). Весь мій haproxy.cfg
файл для одного з моїх проектів Go випливає, якщо вам потрібен початковий понт.
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
Ще один аспект - розгортання. Один із варіантів - розгортання, просто надсилаючи двійковий файл програми та необхідні активи. Це досить чудове рішення ІМО. Я використовую інший варіант: компілювання на сервері. (Я перейду до розгортання з бінарними файлами, коли встановлю так звану систему «Безперервна інтеграція / розгортання».)
У мене є невеликий скрипт оболонки на сервері, який витягує код для мого проекту з віддаленого сховища Git, будує його за допомогою Go, копіює бінарні файли та інші активи в ~/myapp/
та перезапускає сервіс.
Загалом, вся справа не сильно відрізняється від будь-якої іншої установки сервера: ви повинні мати спосіб запустити свій код і забезпечити його обслуговування HTTP-запитів. На практиці Go виявився дуже стійким до цього матеріалу.