web-dev-qa-db-ja.com

wss://のnginxセットアップで301リダイレクトを取得し続ける

Nginxを使用して私のDigital Ocean、Ubuntuサーバーでwss://(またはws://)を動作させることができません。301リダイレクトを取得し続け、接続しません。

WebSocketサーバー:ノード+エクスプレス+ uwsは http:// localhost:3000/chat で提供されます(私はufwで3000を開いてws://に直接接続することでテストしましたが、正常に動作します。 )

OS:Ubuntu 16.04.3 x64

これが私のnginx設定です(私は多くのバリアントとオプションを試しましたが、これが最も簡単です、正直言って問題ではないようです)

server {
    listen 443 ssl; # client_wss_port
    server_name www.example.org;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;


    location /chat/ {
        add_header locationischat 1; # this is a dummy header for debugging
        proxy_pass http://localhost:3000/chat/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

これが私のnginxバージョンです

nginx -v
nginx version: nginx/1.10.3 (Ubuntu)

これが私のファイアウォールのステータスです

ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
80                         ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
8888                       DENY        Anywhere                  
3000                       DENY        Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
8888 (v6)                  DENY        Anywhere (v6)             
3000 (v6)                  DENY        Anywhere (v6) 

リクエスト/レスポンスの例を次に示します(ChromeでSmart Websocketクライアントプラグインを使用)

Request URL: wss://www.example.org/chat
Request Method: GET
Status Code: 301 Moved Permanently
Connection: keep-alive
Content-Length: 194
Content-Type: text/html
Date: Wed, 23 May 2018 10:42:35 GMT
Location: https://www.example.org/chat/
locationischat: 1
Server: nginx/1.10.3 (Ubuntu)
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cache-Control: no-cache
Connection: Upgrade
Host: www.example.org
Origin: chrome-extension://omalebghpgejjiaoknljcfmglgbpocdp
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: hFvk0oEAzI5FLVd4W2fgoA==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36

上記のリクエストのnginx access.logは次のとおりです

49.195.190.75 - - [23/May/2018:22:39:16 +0000] "GET /chat HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
1

locationディレクティブは/chat/を参照していますが、使用しようとしているエンドポイントは/chatです。

locationは同じパスに存在し、/が追加されているため、nginxは内部リダイレクトを生成します。

/chatがWebSocketエンドポイントの場合、location /chatを使用する必要があります。

他の必要なヘッダーが不足している可能性があります。ここにあなたが持っているべきものの実用的な例があります:

    location /ws {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Proxy "";
            proxy_set_header Host $http_Host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://localhost:8080;
    }
2
Michael Hampton