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/

curlで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;
  }
}

しかし、これも機能しませんでした。

ところで私は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"

回答:


6

chmod 777 /tmp/app.socket

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

おそらく、同じユーザーまたは同じグループで両方のWebサーバーを実行する必要があります。そのため、ソケットワールドを書き込み可能にする必要はありません。また、ソケットを実行可能にする必要がある理由がわかりません。6で十分です。すなわち:660


Unixの権限にあまり詳しくない人のために、このスキームが同じホスト上の複数のアカウントに使用されている場合、各アカウントは他のソケットに書き込みを行うことができます。だからこそ、これは機能するのに「解決策ではない」のです。
マークストスバーグ

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

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

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

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

chmod 777 /tmp/app.socket

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

ともあれ、ありがとう!


2

私はパーティーに遅れていることは知っていますが、このページは、この正確な問題の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の呼び出しを既存の関数に追加するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.