@vikholodov

Как осуществить деплой websocket на wss?

Всем привет.
В какой-то дикий гемморой превратился деплой чата на вебсокетах. На вас последняя надежда, друзья.
Проект на Django (Python). За исходник брал вот этот репозиторий https://github.com/Bearle/django-private-chat
Запускаю websocket сервер:
class Command(BaseCommand):
    help = 'Starts message center chat engine'

    def handle(self, *args, **options):
        asyncio.async(
            websockets.serve(
                handlers.main_handler,
                '0.0.0.0',
                '5002'
            )
        )
        logger.info('Chat server started')
        asyncio.async(handlers.new_messages_handler(channels.new_messages))
        asyncio.async(handlers.users_changed_handler(channels.users_changed))
        asyncio.async(handlers.gone_online(channels.online))
        asyncio.async(handlers.check_online(channels.check_online))
        asyncio.async(handlers.gone_offline(channels.offline))
        asyncio.async(handlers.is_typing_handler(channels.is_typing))
        asyncio.async(handlers.read_message_handler(channels.read_unread))
        loop = asyncio.get_event_loop()
        loop.run_forever()

к основным nginx конфигам добавил :
map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
  server {
        listen 5002;
        location / {
            proxy_pass http://ip хоста:5002;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

Основной конфиг nginx
server {

    server_name домен;
    listen 80;
    listen 443 default_server ssl;
    ssl_certificate         /home/dev/c.pem;
    ssl_certificate_key     /home/dev/k.key;

    location /static/ {
        root /home/dev/gamemode_prj/gamemode/;
    }
    location /media/ {
        root /home/dev/gamemode_prj/gamemode/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/dev/gamemode_prj/gamemode/gamemode/gamemode.sock;
   }

На фронте указываю свой домен
websocket = new WebSocket(wss://domen + '{{ request.session.session_key }}/' + opponent_username);

В ответ приходит 404
WebSocket connection to 'wss://domen/yl8xetcvg6sbbqg2cdu15qkjhshvf0cr/Vasya' failed: Error during WebSocket handshake: Unexpected response code: 404


error.log nginx молчит, access:
162.158.91.162 - - [29/May/2018:05:50:53 -0400] "GET /yl8xetcvg6sbbqg2cdu15qkjhshvf0cr/Vasya HTTP/1.1" 404 1508 "-" "Mozilla/5.0 (Windows NT 10.0; W$
162.158.91.162 - - [29/May/2018:05:50:57 -0400] "GET /static/js/scrollMonitor.js.map HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) $

scrollMonitor.js выполняет декоративные функции, не знаю почему 304 вылазит.
Максимум, что мне удалось сделать, это добиться работоспособности, указав на фронте ws://ip хоста:port
Надо обязательно wss...
  • Вопрос задан
  • 1037 просмотров
Решения вопроса 1
@Wexter
У вас проксирование на вебсокет не в той секции server сделано, внесите её в секцию где прописан 443 порт и ssl
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Ну так вы же не сделали wss(https) сервер для сокета...

Или в сам сервер сертификат подключайте или к nginx перед проксированием на сокет.
Ответ написан
Ваш ответ на вопрос

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

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