Используем прокси для перенаправления запросов с wss на ws
У тебя есть самоподписаный сертификат и доступ в мдм ты получаешь через https:// или у тебя есть свой домен с сертификатом LetsEncrypt и ты тоже открываешь УД через https:// во всех этих случаях WebSocket у тебя не работают. На всякий случай, через WebSocket происходит общение бекэнда с фронтэндом, т.е. данные на твоей сцене обновляются без обновления самой страницы.
Вот как раз проскирование сокетов позволяет направить данные из https:// на http:// (Это простым языком, не пинайте)
Делать будем на Apache, на nginx полно инструкций в интернете.
Для начала узнаем версию Apache
server@server:~$ sudo apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built: 2020-08-12T21:33:25
Если у вас ниже - возможно работать не будет, т.к. не хватит некоторых модулей.
Для начала включим модули для прокси и рестартим апач:
a2enmod proxy proxy_wstunnel proxy_http rewrite
systemctl restart apache2
После этого открываем конфигурацию сайта, лежат тут /etc/apache2/sites-enabled
У меня прикреплен домен и есть SSL сертификат, поэтому файл конфигурации выглядит так: domen.ru-le-ssl.conf
Открываем файл с правами на изменение и вписываем вниз:
ProxyPass /wssoverws ws://192.168.1.100:8001/majordomo
ProxyPassReverse /wssoverws ws://192.168.1.100:8001/majordomo
Как видим у меня порт стандартный (8001), объясню, что написано выше.
/wssoverws - адрес при переходе на который будет срабатывать прокси, например: ws://server/wssoverws ну а дальше, адрес на которых будет перенаправлен трафик
Естественно, IP нужно поменять на свои.
Далее, открываем файл /var/www/html/templates/websockets.html
Находим похожее и меняем на то, что ниже:
//Вставить в начало
window.onbeforeunload = function() {
//wsSocket.onclose = function () {}; // disable onclose handler first
wsSocket.close();
console.log('close');
};
if (loc.protocol === "https:") {
serverUrl = "wss:";
addr = loc.hostname + '/wssoverws';
} else {
serverUrl = "ws:";
addr = loc.hostname + ':<#WEBSOCKETS_PORT#>/majordomo';
}
serverUrl += "//" + addr;
Делаем рестарт апач и mdm:
systemctl restart apache2
systemctl restart majordomo
Открывам /etc/nginx/sites-enabled/default и в него добавляем новый сервер:
server {
listen 8002 default_server;
ssl on;
ssl_certificate /etc/letsencrypt/live/**********************/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/********************/privkey.pem;
server_name _;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_cache_bypass 1;
proxy_no_cache 1;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
Теперь запросы на порт 8002 будут проксироваться на 8001.
Далее, открываем файл /var/www/html/templates/websockets.html (Лучше сделать копию и положить в корень templates_alt, чтобы не затирать обновлениями.
Находим похожее и меняем на то, что ниже:
if (loc.protocol === "https:") {
serverUrl = "wss:";
addr = loc.hostname + ':8002/majordomo';
} else {
serverUrl = "ws:";
addr = loc.hostname + ':8001/majordomo';
}
serverUrl += "//" + addr;
Нижний Новгород, Россия
На форуме: SmoKE_xDDD