2014-10-03 13 views
7

Więc waliłem głową w ścianę przez większą część 2 dni, proszę o pomoc.Nginx zużywa nagłówek aktualizacji po proxy_pass

Próbuję ustanowić połączenie Websocket przy użyciu tej konfiguracji django-websocket-redis. Występują dwa wystąpienia programu uwsgi, jeden dla strony internetowej i jeden dla komunikacji internetowej.

Użyłem wireshark mocno, aby dowiedzieć się, co dokładnie się dzieje, i najwyraźniej nginx je nagłówków "Connection: Upgrade" i "Upgrade: websocket".

tutaj jest krytyczną częścią nginx config:

upstream websocket { 
    server 127.0.0.1:9868; 
} 

location /ws/ { 
    proxy_pass_request_headers  on; 
    access_log off; 
    proxy_http_version 1.1; 
    proxy_pass http://websocket; 
    proxy_set_header Connection "Upgrade"; 
    proxy_set_header Upgrade websocket; 
} 

Jak widać na tych 2 screenshots, tcpdump komunikacji wewnętrznej wynika, że ​​uścisk dłoni działa ładnie. ale w mojej przeglądarce (drugi obraz) brakuje nagłówków.

Wszelkie pomysły są bardzo cenne. Jestem naprawdę zakleszczony tutaj :(

Wersje:

nginx - 1.7.4 
uwsgi - 2.0.7 

pip zamrażania: Django == 1,7 MySQL-python == 1.2.5 django-Redis sesje == 0.4.0 Django -websocket-Redis == 0.4.2 gevent == 1.0.1 Greenlet == 0.4.4 Redis == 2.10.3 sześć == 1.8.0 uWSGI == 2.0.7 wsgiref == 0,1. 2

+0

niedaleko mojego laptopa, ale czy próbowałeś umieszczenie połączenie Upgrade poza blok pozycja? – Anzel

+0

Połączenie nagłówka: Aktualizacja powinna być ustawiona tylko wtedy, gdy żądanie zostało wykonane na adresie websocket (domain/ws/[facility-params]). Wyjaśnij trochę, czego oczekujesz od nagłówka poza blokiem lokalizacji. – DerShodan

+0

Powiedziałeś, że ten cały pracownik był tylko dla websocket? – Anzel

Odpowiedz

1

Używałbym gunicorn do wdrażania aplikacji django, ale w każdym razie.

przypomniałem sobie, że widziałem to na docs gunicorn:

Jeśli chcesz być w stanie obsłużyć strumieniowe żądania/odpowiedzi lub inne zaawansowane funkcje, takie jak Comet, Long odpytywanie lub gniazd sieciowych, trzeba do wyłączyć buforowanie proxy. Gdy to zrobisz, musisz uruchomić z jednym asynchronicznych klas pracowników.

Aby wyłączyć buforowanie, należy tylko dodać proxy_buffering; do swoim bloku lokalizacji:

w danej lokalizacji będzie:

location /ws/ { 
    proxy_pass_request_headers  on; 
    access_log off; 
    proxy_http_version 1.1; 
    proxy_redirect off; 
    proxy_buffering off; 
    proxy_pass http://websocket; 
    proxy_set_header Connection "Upgrade"; 
    proxy_set_header Upgrade websocket; 
} 

Link do przewodnika gunicorn do wdrażania w nginx. http://docs.gunicorn.org/en/latest/deploy.html?highlight=header

Nadzieja to pomaga

nie
+0

Dzięki, spróbuję tego. – DerShodan

+0

Pozdrawiam, powiedz mi, czy to działa. – Marcs

+0

Niestety, nagłówek nadal jest upuszczany. WSS jest drogą do zrobienia. – DerShodan

Powiązane problemy