Nginx funciona como un servidor front-end, que en este caso envía las solicitudes a un servidor node.js. Por lo tanto, debe configurar un archivo de configuración nginx para el nodo.
Esto es lo que he hecho en mi caja de Ubuntu:
Crea el archivo yourdomain.com
en /etc/nginx/sites-available/
:
vim /etc/nginx/sites-available/yourdomain.com
En él deberías tener algo como:
# the IP(s) on which your node server is running. I chose port 3000.
upstream app_yourdomain {
server 127.0.0.1:3000;
keepalive 8;
}
# the nginx server instance
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
access_log /var/log/nginx/yourdomain.com.log;
# pass the request to the node.js server with the correct headers
# and much more can be added, see nginx config options
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://app_yourdomain/;
proxy_redirect off;
}
}
Si desea que nginx (> = 1.3.13) también maneje solicitudes de websocket, agregue las siguientes líneas en la location /
sección:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Una vez que tenga esta configuración, debe habilitar el sitio definido en el archivo de configuración anterior:
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com
Cree su aplicación de servidor de nodo en /var/www/yourdomain/app.js
y ejecútela enlocalhost:3000
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');
Prueba de errores de sintaxis:
nginx -t
Reinicie nginx:
sudo /etc/init.d/nginx restart
Por último, inicie el servidor de nodo:
cd /var/www/yourdomain/ && node app.js
Ahora debería ver "Hello World" en yourdomain.com
Una última nota con respecto al inicio del servidor de nodo: debe usar algún tipo de sistema de monitoreo para el demonio de nodo. Hay un tutorial increíble sobre nodo con arranque y monitoreo .
location / { proxy_pass http://127.0.0.1:3000; }
? ¿Por qué necesitas todo elupstream
bit de configuración?sites-enabled
ysites-available
directorios dentro/etc/nginx
. Si su versión vino sin estos dos directorios, es probable que tenga un soloconf.d
directorio. En ese caso, seguir estas instrucciones no tendría ningún efecto, A MENOS QUE modifique lainclude
declaración dentro del archivonginx.conf
para apuntar ensites-enabled
lugar de la predeterminadaconf.d
. Espero que tenga sentido. Debería volverse explicativo una vez que vea dichainclude
declaración en su interiornginx.conf
.También puede configurar múltiples dominios con nginx, reenviando a múltiples procesos node.js.
Por ejemplo para lograr estos:
Estos puertos (4000 y 5000) deben usarse para escuchar las solicitudes de la aplicación en su código de aplicación.
/ etc / nginx / sites-enabled / domain1
En / etc / nginx / sites-enabled / domain2
fuente
http://example.com
obtiene automáticamente302
'd ahttp://www.example.com
. ¿Porqué es eso?proxy_set_header Host $host
para evitar la redirección HTTP 302.También puede tener diferentes URL para aplicaciones en una configuración de servidor:
En / etc / nginx / sites-enabled / yourdomain :
Reinicie nginx:
Iniciando aplicaciones.
nodo app1.js
nodo app2.js
fuente
Proxy aplicaciones Node Express independientes a través de Nginx.
Por lo tanto, las nuevas aplicaciones se pueden montar fácilmente y también puedo ejecutar otras cosas en el mismo servidor en diferentes ubicaciones.
Aquí hay más detalles sobre mi configuración con el ejemplo de configuración de Nginx:
De: http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html
fuente
Node.js con configuración Nginx.
agregue la siguiente configuración para que Nginx actúe como proxy redirigido al tráfico del puerto 3000 desde el servidor cuando venimos de "subdominio.su_dominio.com"
fuente
respondiendo a tu pregunta 2:
Usaría la opción
b
simplemente porque consume muchos menos recursos. con la opción 'a', cada cliente hará que el servidor consuma mucha memoria, cargando todos los archivos que necesita (aunque me gusta php, este es uno de los problemas con él). Con la opción 'b' puede cargar sus bibliotecas (código reutilizable) y compartirlas entre todas las solicitudes de los clientes.Pero tenga en cuenta que si tiene múltiples núcleos, debe ajustar node.js para usarlos todos.
fuente
Hice un repositorio en Github que puedes clonar, vagrant-node-nginx-boilerplate
básicamente la aplicación node.js en
/var/www/nodeapp
esy la configuración de nginx en
/etc/nginx/sites-available/
esfuente
También podría usar node.js para generar archivos estáticos en un directorio servido por nginx. Por supuesto, algunas partes dinámicas de su sitio podrían ser atendidas por el nodo, y algunas por nginx (estático).
Tener algunos de ellos atendidos por nginx aumenta su rendimiento.
fuente
Podemos configurar fácilmente una aplicación Nodejs por Nginx actuando como un proxy inverso.
La siguiente configuración asume que la aplicación NodeJS se ejecuta en 127.0.0.1:8080,
en la configuración anterior, su aplicación Nodejs lo hará,
HTTP_HOST
encabezado donde puede aplicar la lógica específica del dominio para servir la respuesta. 'Su solicitud debe ser administrada por un administrador de procesos como pm2 o un supervisor para manejar situaciones / reutilizar sockets o recursos, etc.
Configure un servicio de informes de errores para obtener errores de producción como centinela o barra antivuelco
NOTA: puede configurar la lógica para administrar rutas de solicitud específicas del dominio, crear un middleware para la aplicación expressjs
fuente
Nginx puede actuar como un servidor proxy inverso que funciona igual que un administrador de proyectos. Cuando recibe una solicitud, la analiza y la reenvía a la parte superior (miembros del proyecto) o se maneja sola. Nginx tiene dos formas de manejar una solicitud en función de cómo está configurada.
reenviar la solicitud a otro servidor
}
Servidor de la solicitud
reenviar la solicitud a otro servidor
Cuando ejecuta el servidor node.js en el puerto 8000, nginx reenviará la solicitud a node.js. Escriba la lógica de node.js y maneje la solicitud. Eso es todo, tiene su servidor nodejs ejecutándose detrás del servidor nginx.
Si desea ejecutar cualquier otro servicio que no sea nodejs, simplemente ejecute otro servicio como Django, flask, php en diferentes puertos y configúrelo en nginx.
fuente
Puede ejecutar nodejs usando pm2 si desea administrar cada medio de microservicio y ejecutarlo. El nodo se ejecutará en un puerto, solo configure ese puerto en nginx (/etc/nginx/sites-enabled/domain.com)
Compruebe si localhost se está ejecutando o no mediante ping.
Y
Esto es lo mejor y, como dijiste, también es más fácil
fuente
La configuración mejor y más simple con Nginx y Nodejs es usar Nginx como un equilibrador de carga HTTP y TCP con proxy_protocol habilitado. En este contexto, Nginx podrá enviar solicitudes entrantes por proxy a nodejs, y también finalizar las conexiones SSL a los servidores Nginx de fondo, y no al servidor proxy en sí. (SSL-PassThrough)
En mi opinión, no tiene sentido dar ejemplos que no sean SSL, ya que todas las aplicaciones web están (o deberían estar) usando entornos seguros.
Ejemplo de configuración para el servidor proxy, en /etc/nginx/nginx.conf
Ahora, manejemos el servidor web de fondo. /etc/nginx/nginx.conf :
Ahora, configuremos el host virtual con esta configuración habilitada para SSL y proxy_protocol en /etc/nginx/sites-available/example.com-https.conf :
Y, por último, una muestra de 2 servidores web de nodejs : primer servidor:
Segundo servidor:
Ahora todo debería funcionar perfectamente y equilibrar la carga.
Hace un tiempo escribí sobre Cómo configurar Nginx como un equilibrador de carga TCP en Docker . Compruébalo si estás usando Docker.
fuente