Як налаштувати HTTP-сервер Nginx proxy_pass Node.js через сокет UNIX?


16

Я намагаюся налаштувати сервер Nginx для підключення до HTTP-сервера Node.js через сокет домену UNIX.

Файл конфігурації Nginx:

server {
  listen 80;

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

(за даними http://wiki.nginx.org/HttpProxyModule#proxy_pass )

Сценарій Node.js:

var http = require('http');

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

Зараз, коли я намагаюся зателефонувати

curl http://localhost/

Я отримую лише сторінку з помилками 502 Bad Gateway у згортанні і нічого в процесі Node.js.

Я щось роблю не так?

редагувати:

Після спроби рішення кванту помилка повинна мати відношення до конфігурації Nginx, оскільки процес Node.js встановлює з'єднання з сокетом правильно.

Я також спробував налаштувати Nginx таким чином:

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

server {
  listen 80;

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

Але і це не спрацювало.

До речі, я використовую Nginx v1.0.6.

Далі пишеться в журнал помилок у Nginx, коли я використовую другу конфігурацію

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"

Відповіді:


7

chmod 777 /tmp/app.socket

Це рішення, але не рішення.

вам, ймовірно, слід запустити обидва веб-сервери з тим самим користувачем та / або тією самою групою, щоб вам не довелося змушувати ваш світ сокет читати для запису. Також я не бачу, чому розетку потрібно виконувати. тому 6 повинно вистачити. тобто: 660


Для тих, хто менш знайомий з дозволами Unix, якщо ця схема використовувалася для декількох облікових записів на одному хості, кожен обліковий запис міг і записувати в інші сокети. Ось чому це "не рішення", хоча це працює.
Марк Стосберг

5

"502 Bad Gateway" означає, що Nginx не може отримати відповідь від висхідного сервера. Переконайтесь, що у вас є процес прослуховування /tmp/app.socket:

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

У мене процес слухати /tmp/app.socket. Коли я виконую вашу команду, це дає мені unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket. Але дякую за пораду. Ця команда досить зручна.
pvorb

3

Я вирішив це. Повідомлення журналу помилок, яке я надсилаю вище, приводить мене до відповіді.

Я завжди запускав процес Node.js як звичайний користувач, тоді як Nginx запускався під root. Коли Node.js був запущений, він створив сокет зsrwxr-xr-x правами. Тож Nginx не міг записати в сокет, він міг читати лише з нього. Таким чином, все могло бути налаштовано правильно, коли процеси почалися. Але одного разу я зателефонував на веб-сторінку, Nginx зрозумів, що не має прав на передачу запиту в сокет.

Рішення було запустити

chmod 777 /tmp/app.socket

Тепер все нормально.

В будь-якому випадку, дякую Вам!


2

Я знаю, що я спізнився на вечірку, але ця сторінка з’явилася в пошуку Google для цієї точної проблеми. Запуск команди оболонки насправді не є ідеальним рішенням для мене, і ось як я її вирішив;

Замість того, щоб запускати chmod вручну, ви можете змусити Node робити це з бібліотекою 'fs' після створення сокета:

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

Очевидно, якщо у вашому події onListening у вас є інші речі, вам слід просто додати виклик chmodSync до існуючої функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.