Настройка nginx для wss: // продолжаем получать 301 редирект

Не удается заставить wss: // (или ws: //) работать на моем сервере Digital Ocean, Ubuntu с использованием nginx, продолжайте получать 301 редирект и нет соединения.

Сервер Websocket: node + express + uws обслуживается на http: // localhost: 3000 / chat (я протестировал его, открыв 3000 в ufw и подключившись напрямую к ws: //, работает нормально.)

ОС: 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) 

Вот пример запроса / ответа (с использованием плагина Smart Websocket Client в Chrome)

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 для указанного выше запроса

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
задан 24 May 2018 в 01:42
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
ответ дан 3 December 2019 в 20:14

Теги

Похожие вопросы