web-dev-qa-db-ja.com

nginxを介したプロキシwss(ピアによって接続がリセットされました)

Ip-address a.b.c.dにブラウザとサーバーがあります。サーバーにアクセスできるURLが2つあります。

  1. ブラウザからNginxを介して

    browser -> https://a.b.c.d/ -> server
    
  2. JavaScriptからWSSを介して

    browser -> wss://a.b.c.d:10062 -> server
    

したがって、サーバーは443(nginx)でリストし、他のアプリケーションは10062でリストします。同じポート(443)への2番目の接続を変更したい:

browser -> wss://a.b.c.d/someurl -> server

したがって、nginxで次のようなa.b.c.d:10062にプロキシすることは可能ですか?

server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /path/to/crt/for/https;
    ssl_certificate_key /path/to/key/for/https;

    server_name a.b.c.d;

    location /someurl  {             
        -->> What to write here to create redirect for wss://a.b.c.d:10062 ?  << --
    }

    # the other locations here ('/', etc)
    # ... 
    # ...
 }

次に試しました:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

location /someurl {
    proxy_pass http://127.0.0.1:10062;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

しかし、テストのために https://a.b.c.d/someurl に行くと、

2015/12/14 16:12:51 [error] 371#0: *113 connect() failed (111: Connection refused) 
while connecting to upstream, client: my_ip, server: a.b.c.d, request: "GET /someurl HTTP/1.1", 
upstream: "http://127.0.0.1:10062/someurl", Host: "a.b.c.d"

しかし!:Netstatはこれを示しています:

Sudo netstat -tnlp | grep :10062
tcp        0      0 a.b.c.d:10062          0.0.0.0:*                   LISTEN      5702/webrtc2sip

127.0.0.1の代わりにa.b.c.dを指定する必要があるようですので、私は試しました

location /someurl {
    proxy_pass http://a.b.c.d:10062;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

結果:

2015/12/14 16:54:11 [error] 13189#0: *123 recv() failed (104: Connection reset by peer) 
while reading response header from upstream, 
client: my_ip, server: a.b.c.d, request: "GET /someurl HTTP/1.1", upstream: "http://a.b.c.d:10062/someurl", Host: "a.b.c.d"

OK。プロキシに渡すときにsomeurlをトランクしました:

location = /someurl {
    return 302 /someurl/;
}

location /someurl/ {
      proxy_pass http://a.b.c.d:10062/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
}

https://a.b.c.d/someurl または https://a.b.c.d/someurl/ に移動すると、次のように表示されます。

2015/12/14 17:14:45 [error] 15836#0: *70 recv() failed (104: Connection reset by peer) 
while reading response header from upstream, client: my_ip, server: a.b.c.d, request: "GET /someurl/ HTTP/1.1", upstream: "http://a.b.c.d:10062/", Host: "a.b.c.d"

なぜアップストリームを表示するのですか: " http://a.b.c.d:10062 / "? 「wss://a.b.c.d:10062 /」と表示されるべきではありませんか?

2
Ivan Borshchov

あなたの質問に答えるには:

「上流に表示される理由: " http://a.b.c.d:10062 / "?「wss://a.b.c.d:10062 /」と表示されるべきではないのですか? "

NginxはURIをそのように表示します。これは、構成でURIが提供される方法だからです。

proxy_pass http://a.b.c.d:10062;

NginxをWebSocketプロキシとして使用するための推奨構文 に従っているように見えるため、詳細が問題の指標であるとは思いません。

2
Mark Stosberg