我试图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的调用添加到现有的函数中。