如何通过 UNIX 套接字配置 Nginx proxy_pass Node.js HTTP 服务器?

如何通过 UNIX 套接字配置 Nginx proxy_pass Node.js HTTP 服务器?

我正在尝试配置 Nginx 服务器以通过 UNIX 域套接字连接到 Node.js HTTP 服务器。

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/

我在 curl 中只收到 502 Bad Gateway 错误页面,而在 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"

答案1

chmod 777 /tmp/app.socket

这是一个解决方案,但不是解决方案。

您可能应该使用同一个用户和/或同一个组运行这两个 Web 服务器,这样您就不必让您的套接字世界可读写。另外,我不明白为什么套接字需要可执行。所以6应该足够了。即:

chmod 0660 /tmp/app.socket

答案2

“502错误的网关”意味着 Nginx 无法从上游服务器接收响应。请确保你有一个进程在监听/tmp/app.socket

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

答案3

我解决了。我上面发布的错误日志消息引导我找到了答案。

我总是以普通用户身份启动 Node.js 进程,而 Nginx 则以 root 身份启动。启动 Node.js 时,它会创建具有srwxr-xr-x权限的套接字。因此 Nginx 无法写入套接字,只能从中读取。这样,当进程启动时,一切都可以正确设置。但是,一旦我调用网页,Nginx 就会意识到它没有权限将请求代理到套接字。

解决方案是运行

chmod 777 /tmp/app.socket

现在,一切都好了。

不管怎样,谢谢你!

答案4

我知道我来晚了,但这个页面是在谷歌搜索这个确切问题时出现的。运行 shell 命令对我来说并不是一个理想的解决方案,这就是我解决问题的方法;

您无需手动运行 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 的调用添加到现有函数中。

相关内容