Wie konfiguriere ich den HTTP-Server von Nginx proxy_pass Node.j über einen UNIX-Socket?


16

Ich versuche, einen Nginx-Server so zu konfigurieren, dass er über einen UNIX-Domain-Socket eine Verbindung zu einem Node.js-HTTP-Server herstellt.

Die Nginx-Konfigurationsdatei:

server {
  listen 80;

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

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

Das Skript Node.js:

var http = require('http');

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

Nun, wenn ich versuche anzurufen

curl http://localhost/

Ich erhalte nur die 502 Bad Gateway-Fehlerseite in Curl und nichts im Node.js-Prozess.

Mache ich etwas falsch?

bearbeiten:

Nachdem Sie die Lösung von quanta ausprobiert haben, muss der Fehler mit der Nginx-Konfiguration zusammenhängen, da der Prozess Node.js die Verbindung zum Socket korrekt herstellt.

Ich habe auch versucht, Nginx so zu konfigurieren:

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

server {
  listen 80;

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

Aber das hat auch nicht funktioniert.

Übrigens benutze ich Nginx v1.0.6.

Folgendes wird in das Fehlerprotokoll in Nginx geschrieben, wenn ich die zweite Konfiguration verwende

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"

Antworten:


6

chmod 777 /tmp/app.socket

Dies ist eine Lösung, aber nicht die Lösung.

Sie sollten wahrscheinlich beide Webserver mit demselben Benutzer und / oder derselben Gruppe betreiben, damit Ihre Socket-Welt nicht lesbar und beschreibbar ist. Ich verstehe auch nicht, warum ein Socket ausführbar sein muss. also sollten 6 genug sein. dh: 660


Für diejenigen, die mit Unix-Berechtigungen weniger vertraut sind, könnte jedes Konto auf den anderen Socket schreiben, wenn dieses Schema für mehrere Konten auf demselben Host verwendet würde. Deshalb ist dies "keine Lösung", obwohl es funktioniert.
Mark Stosberg

5

"502 Bad Gateway" bedeutet, dass Nginx keine Antwort vom Upstream-Server erhalten kann. Stellen Sie sicher, dass Sie einen Prozess abhören /tmp/app.socket:

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

Ich habe einen Prozess abgehört /tmp/app.socket. Wenn ich Ihren Befehl ausführe, gibt es mir unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket. Aber danke für deinen Tipp. Dieser Befehl ist sehr praktisch.
pvorb

3

Ich habe es gelöst. Die Fehlermeldung, die ich oben postete, führte mich zur Antwort.

Ich habe den Node.js-Prozess immer als normaler Benutzer gestartet, während Nginx von root gestartet wurde. Beim Start von Node.js wurde der Socket mit erstelltsrwxr-xr-x Rechten erstellt. Nginx konnte also nicht in den Socket schreiben, sondern nur daraus lesen. Auf diese Weise konnte alles richtig eingestellt werden, wenn die Prozesse gestartet wurden. Als ich jedoch eine Webseite anrief, stellte Nginx fest, dass sie nicht die Berechtigung hatte, die Anfrage an den Socket zu übermitteln.

Die Lösung war zu laufen

chmod 777 /tmp/app.socket

Jetzt ist alles gut.

Trotzdem danke!


2

Ich weiß, dass ich zu spät zur Party komme, aber diese Seite ist bei einer Google-Suche nach genau diesem Problem aufgetaucht. Das Ausführen eines Shell-Befehls ist für mich keine ideale Lösung, und so habe ich es gelöst.

Anstatt chmod manuell auszuführen, können Sie Node veranlassen, dies mit der 'fs'-Bibliothek zu tun, nachdem der Socket erstellt wurde:

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

Wenn Sie bereits andere Dinge in Ihrem onListening-Ereignis haben, sollten Sie den Aufruf von chmodSync einfach der vorhandenen Funktion hinzufügen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.