¿Cómo configuro el servidor HTTP Nginx proxy_pass Node.js a través del socket UNIX?

16

Estoy tratando de configurar un servidor Nginx para conectarse a un servidor HTTP Node.js a través de un socket de dominio UNIX.

El archivo de configuración de Nginx:

server {
  listen 80;

  location / {
    proxy_pass http://unix:/tmp/app.socket:/;
  }
}

(de acuerdo con http://wiki.nginx.org/HttpProxyModule#proxy_pass )

El script Node.js:

var http = require('http');

http.createServer(function(req, res) {
  console.log('received request');
  req.end('received request\n');
}).listen('/tmp/app.socket');

Ahora, cuando trato de llamar

curl http://localhost/

Solo obtengo la página de error 502 Bad Gateway en curl y nada en el proceso Node.js.

¿Estoy haciendo algo mal?

editar:

Después de probar la solución de quanta, el error debe tener que ver con la configuración de Nginx, ya que el proceso Node.js establece la conexión al socket correctamente.

También intenté configurar Nginx de esta manera:

upstream myapp {
  server unix:/tmp/app.socket;
}

server {
  listen 80;

  location / {
    proxy_pass http://myapp;
  }
}

Pero esto tampoco funcionó.

Por cierto, estoy usando Nginx v1.0.6.

Lo siguiente se escribe en el registro de errores en Nginx, cuando uso la segunda configuración

2011/09/28 13:33:47 [crit] 1849#0: *5 connect() to unix:/tmp/app.socket failed  (13: Permission denied) while connecting to upstream, client: 127.0.0.1,        server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/app.socket:/", host: "localhost:80"
pvorb
fuente

Respuestas:

6

chmod 777 /tmp/app.socket

Esta es una solución pero no la solución.

Probablemente debería ejecutar ambos servidores web con el mismo usuario y / o el mismo grupo para que no tenga que hacer que su mundo de socket sea de escritura. Además, no veo por qué un socket debe ser ejecutable. entonces 6 debería ser suficiente. es decir: 660

Fehlersturm
fuente
Para aquellos menos familiarizados con los permisos de Unix, si este esquema se usara para varias cuentas en el mismo host, cada cuenta podría escribir en el otro socket. Es por eso que esto "no es una solución" a pesar de que funciona.
Mark Stosberg
5

"502 Bad Gateway" significa que Nginx no puede recibir respuesta del servidor ascendente. Asegúrese de tener un proceso. Escuche /tmp/app.socket:

# netstat --protocol=unix -nlp | grep app.socket
quanta
fuente
Tengo un proceso para escuchar /tmp/app.socket. Cuando ejecuto el comando que me da unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket. Pero gracias por tu consejo. Este comando es bastante útil.
pvorb
3

Lo resolví El mensaje de registro de error que publico arriba me lleva a la respuesta.

Siempre comencé el proceso Node.js como un usuario normal, mientras que Nginx fue iniciado por root. Cuando se inició Node.js, creó el socket con srwxr-xr-xderechos. Entonces, Nginx no podía escribir en el socket, solo podía leer de él. De esta manera, todo podría configurarse correctamente, cuando se iniciaron los procesos. Pero una vez que llamé a una página web, Nginx se dio cuenta de que no tenía los derechos para delegar la solicitud al socket.

La solución fue correr

chmod 777 /tmp/app.socket

Ahora todo está bien.

¡Gracias de todos modos!

pvorb
fuente
2

Sé que llego tarde a la fiesta, pero esta página apareció en una búsqueda de Google para este problema exacto. Ejecutar un comando de shell no es realmente una solución ideal para mí, y así es como lo resolví;

En lugar de ejecutar chmod manualmente, puede hacer que Node lo haga con la biblioteca 'fs' después de crear el socket:

var fs = require('fs');

var server = http.createServer(...This varies by implementation...);

server.listen('/path/to/socket');

server.on('listening', onListening);

function onListening() {
  fs.chmodSync('/path/to/socket', '777');
}

Obviamente, si ya tiene otras cosas en su evento onListening, simplemente debe agregar la llamada a chmodSync en la función existente.

jliles
fuente