Программы 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 показал себя очень стабильно для этого.