web-dev-qa-db-ja.com

UNIXソケット経由でNginx proxy_pass Node.js HTTPサーバーを構成するにはどうすればよいですか?

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/

Curlで502 Bad Gatewayエラーページのみが表示され、Node.jsプロセスでは何も表示されません。

私は何か間違ったことをしていますか?

edit:

クォンタのソリューションを試した後、Node.jsプロセスがソケットへの接続を正しく確立するため、Nginx構成に間違いがあるはずです。

私もNginxをこのように構成しようとしました:

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

server {
  listen 80;

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

しかし、これもうまくいきませんでした。

ところで、私はNginx v1.0.6を使用しています。

2番目の構成を使用すると、以下は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"
16
pvorb

chmod 777 /tmp/app.socket

これは解決策ですが、解決策ではありません。

おそらく両方のWebサーバーを同じユーザーまたは同じグループ、あるいはその両方で実行する必要があります。そうすれば、ソケットの世界を書き込み可能にする必要がなくなります。また、なぜソケットを実行可能にする必要があるのか​​わかりません。したがって、6で十分です。つまり:660

7
Fehlersturm

"502 Bad Gateway"は、Nginxが上流サーバーから応答を受信できないことを意味します。 /tmp/app.socketでリッスンするプロセスがあることを確認してください:

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

解決しました。上記で投稿したエラーログメッセージが答えを導きます。

私はいつもNode.jsプロセスを通常のユーザーとして開始しましたが、Nginxはrootによって開始されました。 Node.jsが起動すると、srwxr-xr-x権利。したがって、Nginxはソケットに書き込むことができず、ソケットから読み取ることしかできませんでした。このようにして、プロセスが開始されたときにすべてが正しくセットアップされます。しかし、いったんWebページを呼び出すと、Nginxはリクエストをソケットにプロキシする権限がないことに気づきました。

解決策は実行することでした

chmod 777 /tmp/app.socket

今、すべてが大丈夫です。

とにかくありがとうございました!

3
pvorb

私はパーティーに遅れていることを知っていますが、このページは、この正確な問題についてのGoogle検索で表示されました。シェルコマンドを実行することは、私にとって本当に理想的な解決策ではありません。これが私が解決した方法です。

手動でchmodを実行する代わりに、Nodeを、ソケットの作成後に 'fs'ライブラリを使用して実行できます。

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の呼び出しを既存の関数に追加するだけです。

2
jliles