Làm cách nào để định cấu hình máy chủ HTTP Nginx proxy_pass Node.js qua ổ cắm UNIX?


16

Tôi đang cố gắng định cấu hình máy chủ Nginx để kết nối với máy chủ HTTP Node.js thông qua ổ cắm tên miền UNIX.

Tệp cấu hình Nginx:

server {
  listen 80;

  location / {
    proxy_pass http://unix:/tmp/app.socket:/;
  }
}

(theo http://wiki.nginx.org/HttpProxyModule#proxy_pass )

Kịch bản Node.js:

var http = require('http');

http.createServer(function(req, res) {
  console.log('received request');
  req.end('received request\n');
}).listen('/tmp/app.socket');

Bây giờ, khi tôi cố gắng gọi

curl http://localhost/

Tôi chỉ nhận được trang lỗi 502 Bad Gateway trong curl và không có gì trong quy trình Node.js.

Tôi có làm điều gì sai?

biên tập:

Sau khi thử giải pháp của quanta, lỗi phải xảy ra với cấu hình Nginx, vì quy trình Node.js thiết lập kết nối với ổ cắm một cách chính xác.

Tôi cũng đã cố gắng định cấu hình Nginx theo cách này:

upstream myapp {
  server unix:/tmp/app.socket;
}

server {
  listen 80;

  location / {
    proxy_pass http://myapp;
  }
}

Nhưng điều này cũng không hoạt động.

BTW Tôi đang sử dụng Nginx v1.0.6.

Sau đây là ghi vào nhật ký lỗi trong Nginx, khi tôi sử dụng cấu hình thứ hai

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"

Câu trả lời:


6

chmod 777 /tmp/app.socket

Đây là một giải pháp nhưng không phải là giải pháp.

bạn có thể nên chạy cả hai máy chủ web với cùng một người dùng và / hoặc cùng một nhóm để bạn không phải làm cho thế giới ổ cắm của mình có thể ghi được. Ngoài ra tôi không thấy lý do tại sao một ổ cắm cần phải được thực thi. vậy 6 nên là đủ. tức là: 660


Đối với những người ít quen thuộc với quyền Unix, nếu lược đồ này được sử dụng cho nhiều tài khoản trên cùng một máy chủ, mỗi tài khoản có thể và ghi vào ổ cắm khác. Đó là lý do tại sao đây "không phải là một giải pháp" mặc dù nó hoạt động.
Mark Stosberg

5

"502 Bad Gateway" có nghĩa là Nginx không thể nhận được phản hồi từ máy chủ ngược dòng. Hãy chắc chắn rằng bạn có một quá trình lắng nghe /tmp/app.socket:

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

Tôi đã có một quá trình lắng nghe /tmp/app.socket. Khi tôi chạy lệnh của bạn, nó cho tôi unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket. Nhưng cảm ơn vì tiền boa của bạn. Lệnh này khá tiện dụng.
pvorb

3

Tôi đã giải quyết nó. Thông báo nhật ký lỗi tôi đăng ở trên dẫn tôi đến câu trả lời.

Tôi luôn bắt đầu quá trình Node.js như một người dùng bình thường, trong khi Nginx được bắt đầu bằng root. Khi Node.js được khởi động, nó đã tạo ra socket có srwxr-xr-xquyền. Vì vậy, Nginx không thể ghi vào ổ cắm, nó chỉ có thể đọc từ nó. Bằng cách này, mọi thứ có thể được thiết lập chính xác, khi các quy trình bắt đầu. Nhưng một khi tôi gọi cho một trang web, Nginx nhận ra rằng nó không có quyền ủy quyền yêu cầu cho ổ cắm.

Giải pháp là chạy

chmod 777 /tmp/app.socket

Bây giờ, mọi thứ đều ổn.

Dù sao cũng cảm ơn bạn


2

Tôi biết tôi đến bữa tiệc muộn, nhưng trang này đã xuất hiện trong một tìm kiếm Google cho vấn đề chính xác này. Chạy một lệnh shell không thực sự là một giải pháp lý tưởng cho tôi và đây là cách tôi giải quyết nó;

Thay vì chạy chmod theo cách thủ công, bạn có thể khiến Node làm điều đó với thư viện 'fs' sau khi ổ cắm được tạo:

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');
}

Rõ ràng nếu bạn đã có những thứ khác trong sự kiện onListening của mình, bạn chỉ nên thêm lệnh gọi chmodSync vào hàm hiện có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.