Jak skonfigurować serwer HTTP Nginx proxy_pass Node.js przez gniazdo UNIX?

16

Próbuję skonfigurować serwer Nginx, aby łączył się z serwerem HTTP Node.js za pośrednictwem gniazda domeny UNIX.

Plik konfiguracyjny Nginx:

server {
  listen 80;

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

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

Skrypt Node.js:

var http = require('http');

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

Teraz, kiedy próbuję zadzwonić

curl http://localhost/

Dostaję tylko stronę błędu 502 Bad Gateway w curl i nic w procesie Node.js.

czy robię coś źle?

edytować:

Po wypróbowaniu rozwiązania kwanty błąd musi mieć związek z konfiguracją Nginx, ponieważ proces Node.js prawidłowo nawiązuje połączenie z gniazdem.

Próbowałem również skonfigurować Nginx w ten sposób:

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

server {
  listen 80;

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

Ale to też nie działało.

BTW Używam Nginx v1.0.6.

Następujące informacje są zapisywane w dzienniku błędów w Nginx, gdy używam drugiej konfiguracji

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
źródło

Odpowiedzi:

7

chmod 777 /tmp/app.socket

To jest rozwiązanie, ale nie rozwiązanie.

powinieneś prawdopodobnie uruchomić oba serwery WWW z tym samym użytkownikiem i / lub tą samą grupą, abyś nie musiał zapisywać swojego świata gniazd. Nie rozumiem też, dlaczego gniazdo musi być wykonywalne. więc 6 powinno wystarczyć. tj .: 660

Fehlersturm
źródło
Dla osób mniej zaznajomionych z uprawnieniami uniksowymi, jeśli ten schemat byłby stosowany dla wielu kont na tym samym hoście, każde konto mogłoby i zapisywać do innych gniazd. Dlatego nie jest to „rozwiązanie”, nawet jeśli działa.
Mark Stosberg,
5

„502 Zła bramka” oznacza, że ​​Nginx nie może otrzymać odpowiedzi z serwera nadrzędnego. Upewnij się, że masz proces nasłuchuj /tmp/app.socket:

# netstat --protocol=unix -nlp | grep app.socket
kwanty
źródło
Mam proces słuchania /tmp/app.socket. Kiedy wykonuję twoje polecenie, daje mi to unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket. Ale dziękuję za twoją wskazówkę. To polecenie jest bardzo przydatne.
pvorb
3

Rozwiązałem to. Komunikat dziennika błędów, który zamieszczam powyżej, prowadzi mnie do odpowiedzi.

Zawsze zaczynałem proces Node.js jako zwykły użytkownik, podczas gdy Nginx był uruchamiany przez root. Po uruchomieniu Node.js utworzył gniazdo z srwxr-xr-xprawami. Aby Nginx nie mógł zapisywać w gnieździe, mógł tylko czytać z niego. W ten sposób wszystko może się poprawnie skonfigurować, gdy procesy się rozpoczną. Ale kiedy zadzwoniłem na stronę internetową, Nginx zdał sobie sprawę, że nie ma uprawnień do proxy żądania do gniazda.

Rozwiązanie miało zostać uruchomione

chmod 777 /tmp/app.socket

Teraz wszystko jest w porządku.

Mimo wszystko dziekuję!

pvorb
źródło
2

Wiem, że spóźniłem się na imprezę, ale ta strona pojawiła się podczas wyszukiwania w Google tego konkretnego problemu. Uruchamianie polecenia powłoki nie jest dla mnie idealnym rozwiązaniem i tak to rozwiązałem;

Zamiast ręcznie uruchamiać chmod, możesz sprawić, aby Node zrobił to z biblioteką „fs” po utworzeniu gniazda:

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

Oczywiście, jeśli masz już inne zdarzenia w zdarzeniu onListening, powinieneś po prostu dodać wywołanie chmodSync do istniejącej funkcji.

Jliles
źródło