Como configuro o servidor HTTP Nginx proxy_pass Node.js via soquete UNIX?

16

Estou tentando configurar um servidor Nginx para se conectar a um servidor HTTP Node.js por meio de um soquete de domínio UNIX.

O arquivo de configuração do Nginx:

server {
  listen 80;

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

(de acordo com o link )

O script do Node.js:

var http = require('http');

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

Agora, quando tento ligar

curl http://localhost/

Eu só obtenho a página de erro 502 Bad Gateway no curl e nada no processo Node.js.

Estou fazendo algo errado?

edit:

Depois de tentar a solução do quanta, o erro deve ter a ver com a configuração do Nginx, já que o processo do Node.js estabelece a conexão ao socket corretamente.

Eu também tentei configurar o Nginx dessa maneira:

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

server {
  listen 80;

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

Mas isso também não funcionou.

Por que estou usando o Nginx v1.0.6.

O seguinte está sendo gravado no log de erros no Nginx, quando eu uso a segunda configuração

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"
    
por pvorb 28.09.2011 / 01:47

4 respostas

6

chmod 777 /tmp/app.socket

Esta é uma solução, mas não a solução.

você provavelmente deve executar ambos os servidores da Web com o mesmo usuário e / ou mesmo grupo, para que você não precise tornar o mundo do soquete de leitura gravável. Também não vejo por que um soquete precisa ser executável. então 6 deve ser o suficiente. ou seja, 660

    
por 26.01.2012 / 16:53
5

"502 Bad Gateway" significa que o Nginx não pode receber resposta do servidor upstream. Certifique-se de que você tem um processo de escuta em /tmp/app.socket :

# netstat --protocol=unix -nlp | grep app.socket
    
por 28.09.2011 / 02:08
3

Eu resolvi isso. A mensagem do log de erro que eu coloquei acima me leva à resposta.

Eu sempre iniciei o processo do Node.js como usuário normal, enquanto o Nginx foi iniciado pelo root. Quando o Node.js foi iniciado, ele criou o soquete com srwxr-xr-x rights. Então, o Nginx não pôde escrever no socket, só pôde ler a partir dele. Desta forma, tudo poderia configurar corretamente, quando os processos foram iniciados. Mas uma vez que eu chamei a página web, o Nginx percebeu que não tinha o direito de fazer proxy do pedido para o socket.

A solução foi executar

chmod 777 /tmp/app.socket

Agora está tudo bem.

Obrigado mesmo assim!

    
por 28.09.2011 / 14:18
2

Eu sei que estou atrasado para a festa, mas esta página surgiu em uma pesquisa no Google para esse problema exato. A execução de um comando de shell não é realmente uma solução ideal para mim e é assim que resolvi isso;

Em vez de executar o chmod manualmente, você pode fazer o Node fazer isso com a biblioteca 'fs' depois que o soquete for criado:

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

Obviamente, se você já tem outras coisas no seu evento onListening, você deve apenas adicionar a chamada ao chmodSync na função existente.

    
por 29.12.2015 / 18:55