Я пытаюсь настроить сервер 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"
«502 Bad Gateway» означает, что Nginx не может получить ответ от вышестоящего сервера. Убедитесь, что у вас есть процесс прослушивания
/tmp/app.socket
:источник
/tmp/app.socket
. Когда я запускаю твою команду, это дает мнеunix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket
. Но спасибо за ваш совет. Эта команда довольно удобна.Я решил это. Сообщение журнала ошибок, которое я постет выше, приведет меня к ответу.
Я всегда запускал процесс Node.js как обычный пользователь, в то время как Nginx запускался пользователем root. Когда Node.js был запущен, он создал сокет с
srwxr-xr-x
правами. Поэтому Nginx не мог писать в сокет, он мог только читать из него. Таким образом, все может быть настроено правильно, когда процессы начались. Но как только я позвонил на веб-страницу, Nginx понял, что у него нет прав на передачу запроса в сокет.Решение было запустить
Сейчас все нормально.
Все равно спасибо!
источник
Я знаю, что опоздал на вечеринку, но эта страница появилась в поиске Google именно для этой проблемы. Выполнение команды оболочки на самом деле не идеальное решение для меня, и вот как я это решил;
Вместо того, чтобы запускать chmod вручную, вы можете заставить Node делать это с библиотекой 'fs' после создания сокета:
Очевидно, что если у вас уже есть другие вещи в вашем событии onListening, вам просто нужно добавить вызов chmodSync в существующую функцию.
источник