Webserver for Go (golang) webservices: использование NGINX или нет?

Я пишу некоторые веб-сервисы, возвращающие данные JSON, у которых много пользователей.

Вы бы рекомендовали использовать NGINX в качестве веб-сервера или достаточно, чтобы использовать стандартный HTTP-сервер Go?

Ответ 1

Это зависит.

Из коробки, ставя nginx перед обратным прокси-сервером, вы получите:

  • Журналы доступа
  • Журналы ошибок
  • Простое завершение SSL
  • Поддержка SPDY
  • Поддержка gzip
  • Простые способы установки заголовков HTTP для определенных маршрутов в нескольких строках
  • Очень быстрый статический актив (если вы отменили S3/и т.д., хотя это не так важно)

HTTP-сервер Go очень хорош, но вам нужно будет изобрести колесо, чтобы выполнить некоторые из этих действий (это прекрасно: он не должен быть всем для всех).

Мне всегда было проще поставить nginx впереди, что и хорошо, и позволить ему делать "веб-сервер". Приложение My Go использует приложение, и только минимальное количество заголовков/и т.д. что ему нужно. Не смотрите на то, чтобы положить nginx впереди как "плохую" вещь.

Ответ 2

Стандартный HTTP-сервер Go отлично. Если ваше приложение в основном/только является "динамическим" запросом/ответом, то это действительно лучший способ.

Вы можете использовать nginx для обслуживания статических активов, но, скорее всего, стандартный Go one тоже подходит для этого. Если вам нужна более высокая производительность, вы должны просто использовать CDN или кеш столько, сколько сможете с помощью лака (например).

Если вам нужно обслуживать разные приложения с одного и того же IP-адреса, nginx - прекрасный выбор для прокси-сервера для распространения запросов между различными приложениями; хотя я чаще получаю лак или HAProxy из инструментария для такого рода вещей.

Ответ 3

веб-инструментарий Gorilla дает вам:

  • Расширенная маршрутизация (ограничение домена/поддомена, соответствие пути регулярного выражения).
  • Поддержка gzip (через обработчики промежуточного ПО.)
  • Протокол ведения промежуточного документа, который выводится в общем формате журнала Apache.
  • Защищенные зашифрованные файлы cookie.
  • Сессии.
  • schema пакет преобразует значения формы в структуру.

Это заполняет большой разрыв между Go net/http и HTTP-серверами, такими как NGINX.

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

Я думаю, что net/http имеет самый мощный HTTP-сервер в любой стандартной библиотеке.

Ответ 4

Из https://blog.gopheracademy.com/caddy-a-look-inside/ похоже, что Go может обрабатывать gzip, ошибки, статические файлы, маршрутизацию и заголовки http с использованием Middleware. Строка ниже, из блога, показывает, как вы будете обрабатывать такой запрос.

logHandler(gzipHandler(fileServer))

Они обрабатывают ведение журнала ошибок действительно интересным способом. Пока ваше промежуточное ПО возвращает код ошибки (int), промежуточное ПО обработки ошибок автоматически обрабатывает его. Они даже дошли до настройки всего сайта в Go, как Nginx. "Файл nginx.conf для всех веб-сайтов Академии Gopher был длиной более 115 строк. Эквивалентный файл Caddyfile - всего 50 строк."