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