Как настроить обратный прокси Nginx для веб-сокетов?

#asp.net #asp.net-core #nginx

#asp.net #asp.net-core #nginx

Вопрос:

У меня есть приложение ASP Core, работающее на Ubuntu.

Перед приложением есть веб-сервер Nginx, используемый в качестве обратного прокси следующим образом :

     # Part 1 : Redirect http tp https
    server {
            server_name example.com www.example.com;
            listen 80;
            listen [::]:80;

            return 301 https://www.example.com$request_uri;
    }

    # Part 2 : Reverse proxy for https requests. Get the app response from localhost:5000
    server {
            listen 443 ssl;
            server_name example.com www.example.com;

            ssl_certificate     /home/aspuser/ssl/example.crt;
            ssl_certificate_key /home/aspuser/ssl/example.key;

            access_log /var/log/nginx/reverse-access.log;
            error_log /var/log/nginx/reverse-error.log;

            location / {
                        proxy_pass http://127.0.0.1:5000;
                    }
    }

    # Part 3 : Reverse proxy for websockets on port 3000. Get the app response from localhost:5000/ws
     server {
        listen 3000 ssl;
        server_name example.com www.example.com
        
        ssl_certificate     /home/aspuser/ssl/example.crt;
        ssl_certificate_key /home/aspuser/ssl/example.key;
            
        location / {
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;

              proxy_pass http://127.0.0.1:5000/ws;

              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
            }    
      }
 

Части 1 и 2 работают правильно. Приложения корректно отображаются с SSL-сертификатом.

Часть 3: Обратный прокси-сервер Websocket не работает. Когда я пытаюсь отправить сообщение websocket с вкладки Chrome Dev, используя следующий Javascript :

 var socket = new WebSocket("wss://www.example.com:3000");

socket.onopen = function(e) {
  console.log("Connection established");
};
 

Я получаю сообщение об ошибке :

 WebSocket connection to 'wss://www.example.com:3000/' failed: Error in connection establishment: net::ERR_CONNECTION_RESET
 

То же самое приложение работает правильно с локального хоста (я получаю ответ websocket на localhost), но не при публикации в Ubuntu. (Порт 3000 разрешен в брандмауэре сервера).

Кто-нибудь может помочь, пожалуйста?

Ответ №1:

Я считаю, что ваш

 proxy_pass http://127.0.0.1:5000/ws;
 

следует прочитать

 proxy_pass http://127.0.0.1:5000/ws/;
 

Кажется, я помню, что когда местоположение заканчивается на /, то же самое должен делать и перенаправленный путь.