Назад | Перейти на главную страницу

Как настроить HTTP-сервер Nginx proxy_pass Node.js через сокет UNIX?

Я пытаюсь настроить сервер 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 в curl и ничего не вижу в процессе Node.js.

Я делаю что-то неправильно?

редактировать:

После попытки решения Quanta ошибка должна быть связана с конфигурацией 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"

chmod 777 /tmp/app.socket

Это решение, но не решение.

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

"502 Неверный шлюз" означает, что Nginx не может получить ответ от вышестоящего сервера. Убедитесь, что процесс прослушивает /tmp/app.socket:

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

Я решил это. Сообщение журнала ошибок, которое я написал выше, привело меня к ответу.

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

Решением было запустить

chmod 777 /tmp/app.socket

Теперь все в порядке.

В любом случае, спасибо!

Я знаю, что опаздываю на вечеринку, но эта страница появилась в поиске 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 в существующую функцию.