UNIX 소켓을 통해 Nginx proxy_pass Node.js HTTP 서버를 어떻게 구성합니까?


16

UNIX 도메인 소켓을 통해 Node.js HTTP 서버에 연결하도록 Nginx 서버를 구성하려고합니다.

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/

컬에서 502 Bad Gateway 오류 페이지 만 얻었으며 Node.js 프로세스에는 아무것도 없습니다.

내가 뭔가 잘못하고 있습니까?

편집하다:

Quanta의 솔루션을 시도한 후에는 Node.js 프로세스가 소켓에 올바르게 연결되기 때문에 실수는 Nginx 구성과 관련이 있어야합니다.

또한 Nginx를 다음과 같이 구성하려고 시도했습니다.

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

server {
  listen 80;

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

그러나 이것은 작동하지 않았습니다.

BTW 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"

답변:


6

chmod 777 /tmp/app.socket

이것은 해결책이지만 해결책은 아닙니다.

소켓 웹을 쓰기 가능하게 만들 필요가 없도록 동일한 사용자 및 / 또는 동일한 그룹으로 두 웹 서버를 모두 실행해야합니다. 또한 소켓이 실행 가능한 이유를 모르겠습니다. 6이면 충분합니다. 즉 : 660


Unix 권한에 익숙하지 않은 사용자를 위해이 체계를 동일한 호스트의 여러 계정에 사용하면 각 계정이 다른 소켓에 쓸 수 있습니다. 이것이 작동하지만 "솔루션이 아닌"이유입니다.
Mark Stosberg

5

"502 Bad Gateway" 는 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

3

나는 그것을 해결했다. 위의 postet 오류 메시지가 답으로 이어집니다.

나는 Nginx가 루트로 시작되는 동안 항상 Node.js 프로세스를 일반 사용자로 시작했습니다. Node.js가 시작되면 srwxr-xr-x권한이 있는 소켓을 작성했습니다 . 따라서 Nginx는 소켓에 쓸 수 없으며 소켓에서만 읽을 수 있습니다. 이렇게하면 프로세스가 시작될 때 모든 것이 올바르게 설정 될 수 있습니다. 그러나 일단 웹 페이지를 호출하면 Nginx는 요청을 소켓에 프록시 할 권리가 없다는 것을 깨달았습니다.

해결책은 실행했다

chmod 777 /tmp/app.socket

이제 모든 것이 정상입니다.

어쨌든 고마워요!


2

나는 파티에 늦었다는 것을 알고 있지만이 페이지는이 정확한 문제에 대한 Google 검색에서 나타났습니다. 쉘 명령을 실행하는 것은 실제로 이상적인 솔루션이 아니며 이것이 내가 해결 한 방법입니다.

chmod를 수동으로 실행하는 대신 소켓이 작성된 후 'fs'라이브러리를 사용하여 Node가이를 수행하도록 할 수 있습니다.

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 호출을 기존 함수에 추가해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.