Прокси перенаправляет веб-сокеты и http на один и тот же (unix) сокет

Я сделал небольшую конфигурацию nginx для перенаправления трафика на сокет unix, прослушиваемый сервером daphne (сервер, используемый для django).

Согласно документации:

Если вы используете Daphne для всего трафика, он автоматически согласовывает HTTP и WebSocket, поэтому нет необходимости размещать ваши WebSockets на отдельном порту или пути.

Поэтому я хотел бы проксировать как веб-сокеты, так и HTTP-трафик в один и тот же сокет unix.

  1. Является ли это возможным?

  2. Как я мог сделать?

Вот что я пробовал до сих пор:

upstream django_ws {
         server unix:///path/to/ws.sock;
}

server {
       listen 8082;
       server_name 127.0.0.1;
       charset utf-8;

       root /path/to/root;

       set $myroot $document_root;

       location / {
                proxy_pass http://django_ws;
                #proxy_http_version 1.1;
                #proxy_set_header Upgrade websocket;
                #proxy_set_header Connection upgrade;
       }
}
  • Если я раскомментирую строки в блоке местоположения, страница будет пустой.

  • Если я этого не сделаю, страницы появятся, но веб-сокеты, похоже, не работают.

Как я мог это решить?

Все отлично работает с сервером разработки.


person vmonteco    schedule 27.09.2016    source источник


Ответы (1)


Я нашел решение:

Я создаю свои веб-сокеты следующим образом:

var socket = new WebSocket(ws_scheme + "://" + window.location.host
                           + "/ws" + window.location.pathname);

Так что я могу просто разделить запросы, поступающие на /ws, и запросы, поступающие на /.

Итак, я просто сделал это:

upstream django_ws {
         server unix:///path/to/ws.sock;
}

server {
       listen 8082;
       server_name 127.0.0.1;
       charset utf-8;

       root /path/to/root;

       set $myroot $document_root;


       location /ws {
                proxy_pass http://django_ws;
                proxy_http_version 1.1;
                proxy_set_header Upgrade websocket;
                proxy_set_header Connection upgrade;
       }

       location / {
                proxy_pass http://django_ws;
       }
}

и это сработало просто отлично!

person vmonteco    schedule 27.09.2016