Конфигурация веб-приложения для производства Golang
для тех из вас работает Go backends в производстве:
каков ваш стек / конфигурация для запуска веб-приложения Go?
Я не видел много на эту тему, кроме людей, использующих стандартную библиотеку net / http пакет, чтобы сохранить сервер работает. Я читаю, используя Nginx для передачи запросов на сервер Go -nginx с Go
Это кажется немного хрупким. Например, сервер не будет автоматически перезапускаться, если машина была перезапуск (без дополнительных сценариев настройки).
есть ли более прочная производственная установка?
в стороне от моего намерения - я планирую использовать бэкэнд-сервер с питанием от Go для моего следующего проекта и хочу убедиться, что 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
еще один аспект-это развертывание. Один из вариантов-развернуть, просто отправив двоичный файл программы и необходимых активов. Это довольно отличное решение ИМО. Я использую другой вариант: компиляция на сервере. (Я переключусь на развертывание с двоичными файлами, когда настрою так называемую систему" непрерывной интеграции/развертывания".)
у меня есть небольшой скрипт на сервере это извлекает код для моего проекта из удаленного репозитория Git, строит его с помощью Go, копирует двоичные файлы и другие активы в
~/myapp/
, и перезапускает службу.в целом, все это не очень отличается от любой другой настройки сервера: у вас должен быть способ запустить свой код и заставить его обслуживать HTTP-запросы. На практике Go оказался очень стабильным для этого материала.
nginx для:
- обратный HTTP прокси для моего приложения Go
- статическая обработка файла
- завершение SSL
- заголовки HTTP (Cache-Control, et. ал)
- доступ к журналам (и, следовательно, использование вращения системного журнала)
- переписывает (голый на www, http:// на https: / / и т. д.)
nginx делает это очень легко, и хотя вы можете служить непосредственно от Go благодаря
net/http
, там много "повторное изобретение колеса" и такие вещи, как глобальные заголовки HTTP, включают в себя некоторый шаблон, который вы, вероятно, можете избежать.supervisord для управления моим двоичным файлом Go. Выскочка Ubuntu (как упоминалось Mostafa) также хорош, но мне нравится 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
введите
[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 имеет отдельную систему ведения журнала,которая позволит вам хвост журналы для легкого устранения неполадок.