Конфигурация веб-приложения 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

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

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

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


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