Конфигурация веб-приложения Golang production
для тех из вас, кто работает Go backends в производстве:
каков ваш стек / конфигурация для запуска веб-приложения Go?
Я не видел много по этой теме, кроме людей, использующих стандартный пакет библиотеки net / http для работы сервера. Я читал, используя Nginx для передачи запросов на сервер Go -nginx с Go
Это кажется немного хрупким. Например, сервер не будет автоматически перезагружаться, если компьютер перезапуск (без дополнительных сценариев настройки).
есть ли более твердая производственная установка?
в стороне от моего намерения - я планирую использовать сервер REST для моего следующего проекта и хочу убедиться, что Go будет жизнеспособным для запуска проекта вживую, прежде чем я инвестирую в него слишком много.
4 ответов
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
для выскочки, чтобы контролировать мою программу:
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
другой аспект развертывания. Один из вариантов-развернуть, просто отправив двоичный файл программы и необходимых активов. Это довольно отличное решение IMO. Я использую другой вариант: компиляция на сервере. (Я переключусь на развертывание с двоичными файлами, когда я настрою так называемую систему" непрерывной интеграции/развертывания".)
у меня есть небольшой скрипт на сервере это извлекает код для моего проекта из удаленного репозитория Git, строит его с Go, копирует двоичные файлы и другие активы в ~/myapp/
, и перезапускает службу.
в целом, все это не очень отличается от любой другой установки сервера: вы должны иметь возможность запустить свой код и он будет обслуживать HTTP-запросы. На практике Go оказался очень стабильным для этого материала.
nginx для:
- обратный HTTP-прокси в мое приложение Go
- статическая обработка файла
- завершение SSL
- заголовки HTTP (Cache-Control, et. al)
- журналы доступа (и, следовательно, использование вращения системного журнала)
- переписывает (голый для www, http: / / для https: / / и т. д.)
nginx делает это очень легко, и хотя вы можете служить непосредственно из Go благодаря net/http
, там много "повторное изобретение колеса" и такие вещи, как глобальные заголовки HTTP, включают в себя некоторую шаблонную таблицу, которую вы, вероятно, можете избежать.
supervisord для управления моим GO binary. Выскочка Ubuntu (как упоминал Мостафа) также хорош, но мне нравится supervisord, поскольку он относительно дистрибутивен и хорошо документирован.
Supervisord, для меня:
- запускает мой GO binary по мере необходимости
- поднимает его после аварии
- держит мою окружающую среду переменные (ключи аутентификации сеанса и т. д.) как часть одной конфигурации.
- запускает мою БД (чтобы убедиться, что мой двоичный файл Go не работает без него)
вы можете привязать свой двоичный файл к сокету к привилегированным портам интернет-домена (номера портов менее 1024) с помощью setcap
setcap 'cap_net_bind_service=+ep' /path/to/binary
- эта команда должна быть расширена.
sudo
по мере необходимости - каждая новая версия вашей программы будет результат в новый двоичный файл, который должен быть обновлен с помощью
setcap
для тех, кто хочет простой go приложение работает как демон, используйте systemd в (поддерживается многими дистрибутивами linux) вместо выскочки.
создайте файл службы в
touch /etc/systemd/system/my-go-daemon.service
Enter
[Unit]
Description=My Go App
[Service]
Type=simple
WorkingDirectory=/my/go/app/directory
ExecStart=/usr/lib/go run main.go
[Install]
WantedBy=multi-user.target
затем включите и запустите службу
systemctl enable my-go-daemon
systemctl start my-go-daemon
systemctl status my-go-daemon
systemd имеет отдельную систему ведения журнала, которая позволит вам хвост журналы для легкой тревоги съемки.