Nginx
如何通過 UNIX 套接字配置 Nginx proxy_pass Node.js HTTP 伺服器?
我正在嘗試將 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