nginx: websocket не удалось подключиться
Я работаю на Nginx, слушая только на 443 порту. За этим у меня есть другой внутренний сервер, прослушивающий http и порт 8090. Я сделал перенаправление и могу получить доступ к его веб-серверу из Интернета, но веб-сокеты терпят неудачу. В консоли браузера при подключении к веб-серверу возникает ошибка: сбой подключения WebSocket к "wss://public_fqdn/internal_app/api/ws": ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404
Моя конфигурация nginx:
сервер {
слушайте @IP_publique:443 ssl;
# Redirect to internal_app location ^~ /internal_app/ { access_log /var/log/nginx/otecs_vlan3603/internal_app_access.log main; error_log /var/log/nginx/otecs_vlan3603/internal_app_error.log debug; proxy_redirect https://$RPpublic_name/internal_app/ http://$internal_appfqdn:8090/internal_app/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; if ($request_uri ~* "/internal_app/(.*)") { proxy_pass http://$internal_appfqdn:8090/internal_app/$1; } proxy_pass http://$internal_appfqdn:8090/internal_app/; } # Redirect to web socket app location ^~ /internal_app/api/ws { access_log /var/log/nginx/otecs_vlan3603/internal_app_api_access.log main; error_log /var/log/nginx/otecs_vlan3603/internal_app_api_error.log debug; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://$internal_appfqdn:8090/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_read_timeout 86400; } }
Я сделал 2 местоположения для лучшего просмотра запросов websocket. В веб-браузере я вижу разницу между запросом из внутренней сети и из Интернета. Для внутреннего запроса первый запрос WS имеет ответ 101, но для интернет-запроса этот первый запрос WS имеет ответ 200 (и поле подключения заголовка установлено "поддерживать в действии", а не "обновлять"). Добавление базовой строки для nginx для поддержки websocket недостаточно.
Сертификат предоставляется letsencrypt/certbot.