¿Cuáles son los beneficios de usar Nginx frente a un servidor web para Go? [cerrado]

84

Estoy escribiendo algunos servicios web que devuelven datos JSON, que tienen muchos usuarios.

¿Cuáles son los beneficios de usar Nginx frente a mi servidor en comparación con solo usar el servidor http go?

Daniele B
fuente
Para su información, tuvo muchos errores de tcp, como el restablecimiento de la conexión por parte de un par, y los tiempos de espera de E / S al usar el servidor Go http para el servicio que maneja cientos de solicitudes POST grandes por minuto. Ponga nginx delante de él, no más problemas.
Peter Kelly
Finalmente decidí usar el servidor http de Go, sin NGINX, y funciona muy bien. No he tenido ningún problema. Pero mi servicio no ejecuta grandes solicitudes POST como en su caso.
Daniele B
20
ESTO NO ES NECESARIAMENTE BASADO EN OPINIONES. Cerrarlo como tal muestra una grave falta de comprensión de las consideraciones y advertencias que una respuesta a tal pregunta puede completar y proporcionar. La respuesta seleccionada es un gran ejemplo. De hecho, veo nuevas consideraciones relevantes en todas las respuestas proporcionadas.
vee_ess

Respuestas:

135

Depende.

Fuera de la caja, poner nginx al frente como un proxy inverso te dará:

  • Registros de acceso
  • Registros de errores
  • Terminación SSL fácil
  • Soporte SPDY
  • soporte gzip
  • Formas sencillas de configurar encabezados HTTP para ciertas rutas en un par de líneas
  • Servicio de activos estáticos muy rápido (si está sirviendo desde S3 / etc., sin embargo, esto no es tan relevante)

El servidor HTTP Go es muy bueno, pero será necesario reinventar la rueda para hacer algunas de estas cosas (que está bien: no está destinado a ser todo para todos).

Siempre me ha resultado más fácil poner nginx al frente, que es en lo que es bueno, y dejar que haga las cosas del "servidor web". La aplicación My Go hace las cosas de la aplicación, y solo el mínimo de encabezados / etc. que necesita. No considere poner nginx al frente como algo "malo".

elithrar
fuente
¡gracias por su respuesta! - 1) ¿Go HTTP produce algún tipo de registros? - 2) ¿nginx reduce de alguna manera el rendimiento de la solicitud / respuesta?
Daniele B
3
@DanieleB El servidor HTTP de Go produce solo los registros que usted desea (es decir, usando el logpaquete). Si desea registrar la dirección IP, el acceso a recursos, etc., deberá escribir eso. Lo mismo ocurre con la configuración de encabezados, más allá de lo básico. Aunque no tengo ningún dato concreto, nginx frente a Go no debería ser más lento que Go: de hecho, puede ser más rápido gracias a gzip y sus propias optimizaciones. El "costo" será una mayor utilización de memoria / CPU, pero nginx también es muy eficiente en ese frente.
elithrar
16
Una característica importante más: ¿Cómo actualizará / mantendrá su aplicación (sin eliminar paquetes mientras está inactiva)? Nginx le permitirá dirigir el tráfico sin perder paquetes.
BraveNewCurrency
+1, Nginx está en su propio lugar.
Anatoly
3
En mi Raspberry Pi, poner Nginx frente a Go aumentó significativamente la velocidad de carga de la página.
425nesp
17

El servidor http estándar de Go está bien. Si su aplicación en su mayoría / solo son solicitudes / respuestas "dinámicas", entonces es realmente la mejor manera.

Puede usar nginx para servir activos estáticos, pero lo más probable es que el Go estándar también esté bien para eso. Si necesita un mayor rendimiento, solo debe usar un CDN o caché tanto como pueda con Varnish (por ejemplo).

Si necesita servir diferentes aplicaciones desde la misma dirección IP, nginx es una buena opción para que un proxy distribuya solicitudes entre las diferentes aplicaciones; aunque más a menudo saco Varnish o HAProxy de la caja de herramientas para ese tipo de cosas.

Pregunta a Bjørn Hansen
fuente
sí, en realidad solo lo estoy usando para entregar datos dinámicos. Entonces, ¡supongo que no necesito NGINX! Gracias por su respuesta
Daniele B
No se requieren barniz / HAProxy, Nginx tiene un conjunto de herramientas similar para el almacenamiento en caché y el equilibrio de carga.
Anatoly
@mikhailov, ¿no es eso lo que dije? nginx funciona bien para ello; aunque personalmente prefiero a menudo Varnish o HAproxy. Los encuentro más fáciles de configurar y operar.
Pregunte a Bjørn Hansen
5

El kit de herramientas web de Gorilla le ofrece:

  • Enrutamiento avanzado (restricción de dominio / subdominio, coincidencia de ruta de expresión regular).
  • soporte gzip (a través de controladores de middleware ).
  • Controlador de middleware de registro que genera salidas en formato de registro común de Apache.
  • Cookies encriptadas seguras.
  • Sesiones.
  • schema El paquete convierte los valores del formulario en una estructura.

Esto llena una gran brecha entre los net/httpservidores Go y HTTP como NGINX.

Personalmente, evitaría instalar y configurar otro servidor HTTP net/httpsi sé que puedo conectar un CDN en su lugar.

Creo que net/httptiene el servidor HTTP más potente de cualquier biblioteca estándar.

Moshe Revah
fuente
2

Desde https://blog.gopheracademy.com/caddy-a-look-inside/ parece que Go puede manejar gzip, errores, archivos estáticos, enrutamiento y encabezados http usando Middleware. La línea a continuación, del blog, muestra cómo manejaría tal solicitud.

logHandler(gzipHandler(fileServer))

Manejan el registro de errores de una manera realmente interesante. Siempre que su middleware devuelva un código de error (int), el middleware de manejo de errores lo maneja automáticamente. Incluso han ido tan lejos como configurar todo el sitio en Go como lo haría Nginx. "El archivo nginx.conf para todos los sitios web de la Academia Gopher tenía más de 115 líneas. El Caddyfile equivalente tiene solo 50 líneas".

Kevin K
fuente