Почему websoket не хочет работать через сотовую связь?

Есть приложение которое использует websoket соединение (SockJS -> Nginx -> Tornado).
Наблюдаю странное поведение. Соединение прекрасно работает если ноутбук или телефон подключен к Wi-Fi, однако если отключится от Wi-Fi и использовать сотовую связь, то данные с сервера не приходят.

Сначала я думал, что это из-за http, где либо могли заголовки отрезаться. Ok! Перевел все в на https - не помогло.

Версия Nginx 1.12.1;
Конфиг Nginx:
upstream ws_video {
    ip_hash;

    server 127.0.0.1:9101;
    server 127.0.0.1:9102;
    server 127.0.0.1:9103;
    server 127.0.0.1:9104;
}


server {
    listen      443;

    server_name ____.ru;

    ssl         on;
    ssl_certificate      /home/admin/conf/web/ssl.____.ru.pem;
    ssl_certificate_key  /home/admin/conf/web/ssl.____.ru.key;

    location / {
        proxy_pass http://ws_video;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
  • Вопрос задан
  • 351 просмотр
Пригласить эксперта
Ответы на вопрос 2
@maxtm
Make money, not job
Посмотрите в консоль браузера, что отвечает сервер.
Попробуйте на сотовой связи подключится "напрямую" (curl, telnet) и посмотреть что происходит.
Из теории бреда: попробуйте другую сотовую связь.
Ответ написан
@decembrin Автор вопроса
Все проблема была в upstream! Его я убрал совсем и прописал proxy_pass http://127.0.0.1:9101; и все стало работать. Также tornado запустил не 4 workers а одного.

Tornado также служил оповещателем. Когда происходило событие я делал POST к самому себе "requests.post("https://____.ru/notify", params=dict(message=string))" tornado его обрабатывал
from notification.connection import ClientConnection

class BroadcastHandler(tornado.web.RequestHandler):
    def post(self):
        message = self.get_argument('message', default="")
        
        for client in ClientConnection.clients:
            data = json.loads(message)

            if data['dev'] in client.devices:
                client.send(message)

        self.write(str(ClientConnection.clients))


Когда я работал через Wi-Fi tornago что то возвращал вот тут "self.write(str(ClientConnection.clients))", но когда я подключался через мобильные данные эта строка не содержала ни одного подключения...

Интересно, что если делал со своего компьютера POST запрос к https://____.ru/notify, то независимо в какой сети я работаю, все работало...

Проблема ушла, но в чем ее суть я так и не понял.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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