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

pvo*_*orb 16 nginx javascript proxypass socket node.js

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

Nginx 配置文件:

server {
  listen 80;

  location / {
    proxy_pass http://unix:/tmp/app.socket:/;
  }
}
Run Code Online (Sandbox Code Playgroud)

(根据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');
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试打电话时

curl http://localhost/
Run Code Online (Sandbox Code Playgroud)

我只在 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

但这也不起作用。

顺便说一句,我正在使用 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"
Run Code Online (Sandbox Code Playgroud)

小智 8

chmod 777 /tmp/app.socket

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

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


qua*_*nta 5

“502 Bad Gateway”表示 Nginx 无法接收来自上游服务器的响应。确保你有一个进程监听/tmp/app.socket

# netstat --protocol=unix -nlp | grep app.socket
Run Code Online (Sandbox Code Playgroud)