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

我试图configuration一个Nginx服务器,通过一个UNIX域套接字连接到一个Node.js HTTP服务器。

Nginxconfiguration文件:

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的解决scheme后,错误必须与Nginxconfiguration有关,因为Node.js进程正确地build立了与套接字的连接。

我也尝试过这样configurationNginx:

 upstream myapp { server unix:/tmp/app.socket; } server { listen 80; location / { proxy_pass http://myapp; } } 

但是这也不起作用。

顺便说一下我正在使用Nginx v1.0.6。

当我使用第二种configuration时,以下内容正在写入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

这是一个解决scheme,但不是解决scheme。

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

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

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

我解决了它。 我上面的错误日志消息让我回答。

我一直以普通用户身份启动Node.js进程,而Nginx则以root身份启动。 当Node.js启动时,它创build了具有srwxr-xr-x权限的套接字。 所以Nginx不能写入套接字,只能读取它。 这样,当stream程开始时,一切都可以正确设置。 但是一旦我调用了一个网页,Nginx就意识到它没有将请求代理到套接字的权利。

解决scheme是运行

 chmod 777 /tmp/app.socket 

现在,一切都好。

不pipe怎样,谢谢你!

我知道我迟到了,但这个网页出现在谷歌search这个确切的问题。 运行shell命令对我来说并不是一个理想的解决scheme,这就是我解决这个问题的方法。

手动运行chmod,而不是手动运行chmod,在创build套接字之后,可以使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的调用添加到现有的函数中。