Nginx

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

  • December 29, 2015

我正在嘗試將 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程序正確建立了與socket的連接。

我也嘗試以這種方式配置 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"

chmod 777 /tmp/app.socket

這是一個解決方案,但不是解決方案。

您可能應該使用相同的使用者和/或相同的組執行兩個網路伺服器,這樣您就不必讓您的套接字世界可讀可寫。我也不明白為什麼套接字需要是可執行的。所以6應該足夠了。即:660

*“502 Bad Gateway”*表示 Nginx 無法接收上游伺服器的響應。確保您有一個程序監聽/tmp/app.socket

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

引用自:https://serverfault.com/questions/316157