Как настроить 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 в 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"
pvorb
источник

Ответы:

6

chmod 777 /tmp/app.socket

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

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

Fehlersturm
источник
Для тех, кто менее знаком с разрешениями 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. Но спасибо за ваш совет. Эта команда довольно удобна.
Пворб
3

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

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

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

chmod 777 /tmp/app.socket

Сейчас все нормально.

Все равно спасибо!

pvorb
источник
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 в существующую функцию.

jliles
источник