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"
"502 Bad Gateway" significa que Nginx no puede recibir respuesta del servidor ascendente. Asegúrese de tener un proceso. Escuche
/tmp/app.socket
:fuente
/tmp/app.socket
. Cuando ejecuto el comando que me daunix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket
. Pero gracias por tu consejo. Este comando es bastante útil.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-x
derechos. 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
Ahora todo está bien.
¡Gracias de todos modos!
fuente
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:
Obviamente, si ya tiene otras cosas en su evento onListening, simplemente debe agregar la llamada a chmodSync en la función existente.
fuente