Конфигурация веб-приложения для производства Golang


для тех из вас работает Go backends в производстве:

каков ваш стек / конфигурация для запуска веб-приложения Go?

Я не видел много на эту тему, кроме людей, использующих стандартную библиотеку net / http пакет, чтобы сохранить сервер работает. Я читаю, используя Nginx для передачи запросов на сервер Go -nginx с Go

Это кажется немного хрупким. Например, сервер не будет автоматически перезапускаться, если машина была перезапуск (без дополнительных сценариев настройки).

есть ли более прочная производственная установка?

в стороне от моего намерения - я планирую использовать бэкэнд-сервер с питанием от Go для моего следующего проекта и хочу убедиться, что Go будет жизнеспособным для запуска проекта в прямом эфире, прежде чем я вложу в него слишком много.

4 110

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

  1. эта команда должна быть расширена. sudo по мере необходимости
  2. каждая новая версия вашей программы приведет к новому двоичному файлу, который необходимо будет повторно авторизовать с помощью setcap

setcap документация

cap_net_bind_service документация

для тех, кто хочет простой 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 имеет отдельную систему ведения журнала,которая позволит вам хвост журналы для легкого устранения неполадок.