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".
¡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.
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.
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".
Respuestas:
Depende.
Fuera de la caja, poner nginx al frente como un proxy inverso te dará:
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".
fuente
log
paquete). 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.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.
fuente
El kit de herramientas web de Gorilla le ofrece:
schema
El paquete convierte los valores del formulario en una estructura.Esto llena una gran brecha entre los
net/http
servidores Go y HTTP como NGINX.Personalmente, evitaría instalar y configurar otro servidor HTTP
net/http
si sé que puedo conectar un CDN en su lugar.Creo que
net/http
tiene el servidor HTTP más potente de cualquier biblioteca estándar.fuente
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.
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".
fuente