Lo he publicado en ServerFault, pero la comunidad Node.js parece pequeña allí, así que espero que esto traiga más exposición.Cómo implementar Node.js en la nube para alta disponibilidad usando multi-core, proxy inverso y SSL
Tengo una aplicación Node.js (0.4.9) y estoy buscando la mejor manera de implementarla y mantenerla. Quiero ejecutarlo en la nube (EC2 o RackSpace) con alta disponibilidad. La aplicación debe ejecutarse en HTTPS. Me preocuparé más tarde por la conmutación por error de East/West/EU.
He leído mucho sobre keep-alive (Upstart, Forever), utilidades multi-core (Fugue, multinodo, Cluster) y proxy/load balancers (node-http-proxy, nginx, Varnish y Pound). Sin embargo, no estoy seguro de cómo combinar las diversas utilidades disponibles para mí.
Tengo esta configuración en mente y necesito aclarar algunas preguntas y obtener comentarios.
- Cluster es la utilidad de varios núcleos desarrollado la mayor parte de forma activa y aparentemente popular para Node.js, a fin de utilizar eso para ejecutar el nodo 1 "grupo" por servidor de aplicaciones en el puerto no privilegiado (por ejemplo 3000). Q1: ¿Debería Forever utilizarse para mantener vivo el clúster o simplemente es redundante?
- Uso 1 nginx por servidor de aplicaciones que se ejecutan en el puerto 80, basta con invertir proxy al nodo en el puerto 3000. P2: ¿Podríanodo-http-proxy ser más adecuado para esta tarea a pesar de que no gzip o servidor de archivos estáticos rápidamente?
- Tenga un mínimo de 2 servidores como se describió anteriormente, con un servidor independiente que actúa como equilibrador de carga en estos cuadros. Use Pound escuchando 443 para finalizar HTTPS y pase HTTP a Varnish que equilibraría el balance de carga entre las direcciones IP de los servidores anteriores. Q3: ¿Debería usar nginx para hacer ambas cosas? P4: En caso de AWS o Rackspace equilibrador de carga se considerará lugar (este último no termina HTTPS)
Preguntas generales:
- Cómo ves la necesidad de (2) anterior en ¿todas?
- ¿Cuál es el mejor lugar para finalizar HTTPS?
- Si se necesitan WebSockets en el futuro, ¿qué sustituciones de nginx haría?
Realmente me gustaría escuchar cómo la gente está configurando los entornos de producción actuales y qué combinación de herramientas prefieren. Muy apreciado.
Tenga en cuenta que el clúster, etc. no proporciona multi-threading, simplemente proporcionan el uso de múltiples núcleos a través de múltiples procesos. Esto es completamente diferente. Tenga en cuenta también que Cluster no proporcionará alta disponibilidad si su master falla. El niño se suicidará y el maestro no reaparecerá. Tal vez puedas usar algo como Forever para reiniciar el maestro. Además, tenga en cuenta que Nginx no puede enrutar las conexiones de websocket. Finalmente, "un servidor independiente que actúa como un equilibrador de carga a través de estos cuadros": ¿y si este servidor se cae? – Tom
@Tom, todos excelentes puntos. Actualizaré la pregunta para tener en cuenta el uso de varios núcleos, no multi-threading, pero el primero es lo que quise decir. Usaría Monit en cada servidor para ver el PID de Cluster y reiniciarlo si fuera necesario. Comprendo la limitación actual de WS/WSS de nginx, pero aún no la necesito. Yo también usaría Monit en el equilibrador de carga, pero todavía no tengo una buena solución para ese único punto de falla, salvo las zonas de disponibilidad múltiple (duplicados de toda esta configuración). –
@ChrisF ve a hablar con los chicos de nodejitsu en #nodejitsu en freenode. Si quieres saber sobre la arquitectura de nodo, ese es el lugar donde debes estar. – Raynos