Для тех из вас, кто использует бэкенды Go в производственной среде:
Какой у вас стек / конфигурация для запуска веб-приложения Go?
Я мало что видел по этой теме, кроме людей, использующих пакет стандартной библиотеки net / http для поддержания работоспособности сервера. Я читал использование Nginx для передачи запросов на сервер Go - nginx с Go
Мне это кажется немного хрупким. Например, сервер не перезапустится автоматически, если машина была перезапущена (без дополнительных сценариев конфигурации).
Есть ли более надежная производственная установка?
Кстати, о моем намерении - я планирую использовать бэкэнд-сервер REST на Go для своего следующего проекта и хочу убедиться, что Go будет жизнеспособным для запуска проекта вживую, прежде чем я буду вкладывать в него слишком много.
источник
Ответы:
Программы Go могут прослушивать порт 80 и напрямую обслуживать HTTP-запросы. Вместо этого вы можете использовать обратный прокси-сервер перед вашей программой Go, чтобы она слушала порт 80 и подключалась к вашей программе через порт, скажем, 4000. Для последнего есть много причин: отсутствие необходимости запускать ваша программа Go как root, обслуживающая другие веб-сайты / службы на том же хосте, завершение SSL, балансировка нагрузки, ведение журнала и т. д.
Я использую HAProxy спереди. Любой обратный прокси может работать. Nginx также является отличным вариантом (гораздо более популярным, чем HAProxy, и способен на большее).
HAProxy очень легко настроить, если вы прочитаете его документацию ( HTML-версия ).
haproxy.cfg
Ниже приведен весь мой файл для одного из моих проектов Go, на случай, если вам понадобится стартовая точка.Nginx еще проще.
Что касается управления службами, я запускаю свою программу Go как системную службу. Я думаю, что все так делают. На моем сервере работает Ubuntu, поэтому он использует Upstart. Я поместил это
/etc/init/myapp.conf
для Upstart, чтобы управлять моей программой:Другой аспект - развертывание. Один из вариантов - развернуть, просто отправив двоичный файл программы и необходимых ресурсов. ИМО, это отличное решение. Я использую другой вариант: компиляция на сервере. (Я переключусь на развертывание с использованием двоичных файлов, когда настрою так называемую систему «непрерывной интеграции / развертывания».)
У меня есть небольшой сценарий оболочки на сервере, который извлекает код для моего проекта из удаленного репозитория Git, собирает его с помощью Go, копирует двоичные файлы и другие ресурсы
~/myapp/
и перезапускает службу.В целом, все это не сильно отличается от любой другой настройки сервера: у вас должен быть способ запустить свой код и заставить его обслуживать HTTP-запросы. На практике Go показал себя очень стабильно для этого.
источник
nginx для:
nginx делает это очень простым, и хотя вы можете работать напрямую с Go, благодаря
net/http
множеству «изобретений колеса» и тому подобному, как глобальные заголовки HTTP, используются некоторые шаблоны, которых, вероятно, можно избежать.supervisord для управления моим двоичным кодом Go. Upstart Ubuntu (как упоминал Мостафа) тоже хорош, но мне нравится supervisord, поскольку он относительно не зависит от дистрибутива и хорошо документирован.
Супервайзер, для меня:
источник
Для тех, кому нужно простое приложение go, работающее как демон, используйте systemd (поддерживается многими дистрибутивами Linux) вместо Upstart.
Создайте служебный файл по адресу
Войти
Затем включите и запустите службу
systemd имеет отдельную систему журналирования, которая позволит вам отслеживать журналы для облегчения поиска и устранения неисправностей.
источник
Вы можете привязать свой двоичный файл к сокету к привилегированным портам Интернет-домена (номера портов меньше 1024), используя
setcap
setcap 'cap_net_bind_service=+ep' /path/to/binary
sudo
как надоsetcap
setcap
документацияcap_net_bind_service
документацияисточник