Pregunta Node.js + Nginx - ¿Ahora qué?


Configuré Node.js y Nginx en mi servidor. Ahora quiero usarlo, pero, antes de comenzar, hay 2 preguntas:

  1. ¿Cómo deberían trabajar juntos? ¿Cómo debo manejar las solicitudes?
  2. Hay 2 conceptos para un servidor Node.js, cuál es mejor:

    a. Cree un servidor HTTP separado para cada sitio web que lo necesite. A continuación, cargue todo el código de JavaScript al comienzo del programa, para que el código se interprete una vez.

    segundo. Cree un único servidor Node.js que maneje todas las solicitudes de Node.js. Esto lee los archivos solicitados y evalúa sus contenidos. Entonces, los archivos se interpretan en cada solicitud, pero la lógica del servidor es mucho más simple.

No está claro para mí cómo usar Node.js correctamente.


856
2018-02-15 20:49


origen


Respuestas:


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 a /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 las solicitudes de websocket, agregue las siguientes líneas en 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

Crea tu aplicación de servidor de nodo en /var/www/yourdomain/app.js y ejecutarlo en localhost: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

Reiniciar nginx:

sudo /etc/init.d/nginx restart

Por último, inicie el servidor de nodos:

cd /var/www/yourdomain/ && node app.js

Ahora debería ver "Hello World" en sudominio.com

Una última nota con respecto al inicio del servidor de nodos: debe usar algún tipo de sistema de monitoreo para el daemon de nodo. Hay un asombroso tutorial en el nodo con advenedizo y monit.


1177
2018-02-16 10:20



También puede configurar múltiples dominios con nginx, reenviando a múltiples procesos node.js.

Por ejemplo para lograr esto:

/ etc / nginx / sites-enabled / domain1

server {
    listen 80;
    listen [::]:80;
    server_name domain1.com;
    access_log /var/log/nginx/domain1.access.log;
    location / {
        proxy_pass    http://127.0.0.1:4000/;
    }
}

En / etc / nginx / sites-enabled / domain2

server {
    listen 80;
    listen [::]:80;
    server_name domain2.com;
    access_log /var/log/nginx/domain2.access.log;
    location / {
        proxy_pass    http://127.0.0.1:5000/;
    }
}

146
2018-05-02 11:38



También puede tener diferentes URL para aplicaciones en una configuración de servidor:

En / etc / nginx / sites-enabled / yourdomain:

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;

    location ^~ /app1/{
        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://127.0.0.1:3000/;
    }

    location ^~ /app2/{
        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://127.0.0.1:4000/;
    }
}

Reiniciar nginx:

sudo service nginx restart

Iniciando aplicaciones.

nodo app1.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app1!\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

nodo app2.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app2!\n');
}).listen(4000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:4000/');

44
2018-03-31 17:31



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:

Implementar múltiples aplicaciones de nodo en un servidor web en subcarpetas con Nginx

Las cosas se complican con Node cuando necesitas mover tu aplicación de localhost a internet.

No hay un enfoque común para la implementación de Nodo.

Google puede encontrar toneladas de artículos sobre este tema, pero estaba luchando por encontrar la solución adecuada para la configuración que necesito.

Básicamente, tengo un servidor web y quiero que las aplicaciones de Nodo se monten en subcarpetas (es decir, http: // myhost / demo / pet-project /) sin introducir ninguna dependencia de configuración al código de la aplicación.

Al mismo tiempo, quiero que otras cosas, como blog, se ejecuten en el mismo servidor web.

Suena simple ¿eh? Aparentemente no.

En muchos ejemplos en la web, las aplicaciones de nodo se ejecutan en el puerto 80 o son dirigidas por Nginx a la raíz.

Aunque ambos enfoques son válidos para ciertos casos de uso, no cumplen mis criterios simples pero un poco exóticos.

Es por eso que creé mi propia configuración de Nginx y aquí hay un extracto:

upstream pet_project {
  server localhost:3000;
}

server {
  listen 80;
  listen [::]:80;
  server_name frontend;

  location /demo/pet-project {
    alias /opt/demo/pet-project/public/;
    try_files $uri $uri/ @pet-project;
  }

  location @pet-project {
    rewrite /demo/pet-project(.*) $1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://pet_project;
    proxy_redirect http://pet_project/ /demo/pet-project/;
  }
}

A partir de este ejemplo, puede observar que monte mi aplicación Pet Project Node ejecutándose en el puerto 3000 a http: // myhost / demo / pet-project.

Primero Nginx comprueba si el recurso solicitado es un archivo estático disponible en / opt / demo / pet-project / public / y si es así, sirve como es que es altamente eficiente, por lo que no es necesario tener una capa redundante como Connect middleware estático.

Luego, todas las demás solicitudes se sobrescriben y se procesan para Nodo del proyecto mascota aplicación, por lo que la aplicación Nodo no necesita saber dónde está realmente montado y, por lo tanto, se puede mover a cualquier lugar puramente por configuración.

proxy_redirect es una necesidad para manejar el encabezado Location correctamente. Esto es extremadamente importante si usa res.redirect () en su aplicación Node.

Puede replicar fácilmente esta configuración para múltiples aplicaciones de nodo que se ejecutan en diferentes puertos y agregar más controladores de ubicación para otros fines.

De: http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html


26
2017-07-13 07:53



Node.js con la configuración de Nginx.

$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com

agregue la siguiente configuración para que Nginx actúe como un proxy redireccione al tráfico del puerto 3000 desde el servidor cuando procedamos de "subdominio.su_dominio.com"

upstream subdomain.your_domain.com {
  server 127.0.0.1:3000;
}
server {
  listen 80;
  listen [::]:80;
  server_name subdomain.your_domain.com;
  access_log /var/log/nginx/subdomain.your_domain.access.log;
  error_log /var/log/nginx/subdomain.your_domain.error.log debug;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://subdomain.your_domain.com;
    proxy_redirect off;
  }
}

8
2018-03-17 12:24



respondiendo su pregunta 2:

Yo 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 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.


6
2018-01-03 04:51



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 servidas por un nodo, y algunas por nginx (estático).

Tener algunos de ellos servidos por nginx aumenta su rendimiento.


5
2017-07-05 14:17



Podemos configurar fácilmente una aplicación Nodejs de Nginx actuando como un proxy inverso.
La siguiente configuración supone que la aplicación NodeJS se está ejecutando en 127.0.0.1:8080,

  server{
     server_name domain.com sub.domain.com; # multiple domains

     location /{ 
      proxy_pass http://127.0.0.1:8080;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }

     location /static/{
       alias /absolute/path/to/static/files; # nginx will handle js/css
     }
   } 

en la configuración anterior, su aplicación Nodejs lo hará,

  • obtener HTTP_HOST encabezado donde puede aplicar la lógica específica del dominio para atender la respuesta. '
  • Su aplicación debe ser administrada por un administrador de procesos como pm2 o supervisor para manejar situaciones / reutilizar enchufes o recursos, etc.

  • Configure un servicio de informe de errores para obtener errores de producción como centinela o barra antivuelco

NOTA: puede configurar la lógica para entregar rutas de solicitud específicas de dominio, crear una middleware para la aplicación expressjs


4
2018-01-07 18:54