#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/;
Кажется, я помню, что когда местоположение заканчивается на /, то же самое должен делать и перенаправленный путь.