Come configuro il server HTTP proxy_pass Nginx Node.js tramite socket UNIX?


16

Sto cercando di configurare un server Nginx per la connessione a un server HTTP Node.js tramite un socket di dominio UNIX.

Il file di configurazione di Nginx:

server {
  listen 80;

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

(secondo http://wiki.nginx.org/HttpProxyModule#proxy_pass )

Lo 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');

Ora, quando provo a chiamare

curl http://localhost/

Ottengo solo la pagina di errore 502 Bad Gateway in curl e niente sul processo Node.js.

Sto facendo qualcosa di sbagliato?

modificare:

Dopo aver provato la soluzione di quanta, l'errore deve avere a che fare con la configurazione di Nginx, poiché il processo Node.js stabilisce correttamente la connessione al socket.

Ho anche provato a configurare Nginx in questo modo:

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

server {
  listen 80;

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

Ma neanche questo ha funzionato.

A proposito sto usando Nginx v1.0.6.

Quanto segue viene scritto nel log degli errori in Nginx, quando utilizzo la seconda configurazione

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"

Risposte:


6

chmod 777 /tmp/app.socket

Questa è una soluzione ma non la soluzione.

dovresti probabilmente eseguire entrambi i server web con lo stesso utente e / o stesso gruppo in modo da non dover rendere scrivibile il tuo mondo socket. Inoltre non vedo perché un socket debba essere eseguibile. quindi 6 dovrebbero essere sufficienti. cioè: 660


Per coloro che non hanno familiarità con le autorizzazioni Unix, se questo schema fosse utilizzato per più account sullo stesso host, ciascun account potrebbe e scrivere sul socket degli altri. Ecco perché questa "non è una soluzione" anche se funziona.
Mark Stosberg,

5

"502 Gateway non valido " significa che Nginx non può ricevere risposta dal server upstream. Assicurati di avere un processo di ascolto su /tmp/app.socket:

# netstat --protocol=unix -nlp | grep app.socket

Ho un processo da ascoltare /tmp/app.socket. Quando eseguo il tuo comando mi dà unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket. Ma grazie per il tuo consiglio. Questo comando è abbastanza utile.
pvorb,

3

L'ho risolto. Il messaggio di log degli errori che ho postato sopra mi porta alla risposta.

Ho sempre avviato il processo Node.js come un normale utente, mentre Nginx è stato avviato da root. Quando è stato avviato Node.js, ha creato il socket con srwxr-xr-xdiritti. Quindi Nginx non poteva scrivere sul socket, poteva solo leggere da esso. In questo modo tutto potrebbe essere impostato correttamente, quando i processi sono stati avviati. Ma una volta che ho chiamato una pagina web, Nginx ha capito che non aveva i diritti per delegare la richiesta al socket.

La soluzione era eseguire

chmod 777 /tmp/app.socket

Ora va tutto bene.

Grazie lo stesso!


2

So di essere in ritardo alla festa, ma questa pagina è venuta in una ricerca su Google per questo esatto problema. Eseguire un comando shell non è davvero la soluzione ideale per me, ed è così che l'ho risolto;

Invece di eseguire manualmente chmod, puoi fare in modo che Node lo faccia con la libreria 'fs' dopo aver creato il 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');
}

Ovviamente se hai già altre cose nel tuo evento onListening, dovresti semplicemente aggiungere la chiamata a chmodSync nella funzione esistente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.