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


16

我正在尝试配置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"

Answers:


6

chmod 777 /tmp/app.socket

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

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


对于那些不太熟悉Unix权限的用户,如果此方案用于同一主机上的多个帐户,则每个帐户都可以写入其他套接字。这就是为什么即使有效,这也不是“解决方案”的原因。
马克·斯托斯伯格

5

“ 502错误的网关”表示Nginx无法接收来自上游服务器的响应。确保您有一个进程在监听/tmp/app.socket

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

我有一个过程在听/tmp/app.socket。当我运行您的命令时,它给了我unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket。但是,谢谢您的提示。此命令非常方便。
pvorb 2011年

3

我解决了 我在上面张贴的错误日志消息将我引向答案。

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

解决方案是运行

chmod 777 /tmp/app.socket

现在,一切正常。

还是要谢谢你!


2

我知道我参加晚会很晚,但是此页面出现在Google搜索中,以解决此确切问题。对我来说,运行shell命令并不是真正理想的解决方案,这就是我解决的方法。

创建套接字后,可以使Node使用'fs'库来执行操作,而不是手动运行chmod:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.