Прокси реверса Nginx WebSocket сохраняет возврат 200 вместо 101

Я в настоящее время пытаюсь иметь hack.chat на своей персональной работе сервера.

Короче говоря, это состоит из двух серверов. Первым является простой httpd сервер, вручающий JavaScript и CSS. Второй, система чата, является node.js сервером, который JavaScript подключает к использованию websocket. И здесь прибывает проблемы.

Я хочу, чтобы все это использовало порт 80, с другим доменным именем на единственном IP, с помощью отдельного блока сервера в Nginx.

Я следовал документу Nginx websocket, но это не работает. Когда websocket пытается соединиться, это всегда получает 200 кодов возврата, тогда как, если я понял хорошо, это должно добраться 101 (протокол переключения).

Моя версия Nginx 1.8.0, и мой сервер работает на хинду с Linux 4.0.5

Вот является дамп соответствующего nginx conf файлами:

nginx.conf:

user nginx nginx;
worker_processes 1;

error_log /var/log/nginx/error_log info;

events {
    worker_connections 1024;
    use epoll;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main
        '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $bytes_sent '
        '"$http_referer" "$http_user_agent" '
        '"$gzip_ratio"';

    client_header_timeout 10m;
    client_body_timeout 10m;
    send_timeout 10m;

    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 2k;
    request_pool_size 4k;

    gzip on;
    gzip_min_length 1100;
    gzip_buffers 4 8k;
    gzip_types text/plain;

    output_buffers 1 32k;
    postpone_output 1460;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 75 20;

    ignore_invalid_headers on;

    include /etc/nginx/sites-enabled/*;
}

sites-enabled/chat:

map $http_upgrade $connection_upgrade{
    default upgrade;
    ''  close;
}

server{
    listen 0.0.0.0:80;
    server_name chat.axellink.fr;

    location / {
        proxy_pass http://127.0.0.1:6060;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    access_log /var/log/nginx/chat_access;
    error_log /var/log/nginx/chat_error debug;
}

Когда я смотрю на access_log, он эффективно показывает 200 ответов и в error_log нет никакой ошибки. К сожалению, node.js сервер не дает мне журнала (или я не знаю, как просмотреть его).

Заранее спасибо за любой ответ.

Править

Благодаря mc0e мне удалось иметь hack.chat сервер, отвечают 101. Путем сравнения, что на самом деле происходит между nginx и node.js с тем, что происходит на прямом подключении, я видел что на прямом Обновление заголовка: websocket установлен, но nginx не делает. Таким образом, я исправил свой sites-enabled/chat к:

server{
    listen 0.0.0.0:80;
    server_name chat.axellink.fr;

    location / {
        proxy_pass http://127.0.0.1:6060;
        proxy_http_version 1.1;
        proxy_set_header Upgrade "websocket";
        proxy_set_header Connection "Upgrade";
    }

    access_log /var/log/nginx/chat_access;
    error_log /var/log/nginx/chat_error debug;
}

Я также удалил блок карты, поскольку он раньше устанавливал заголовок Соединения для закрытия вместо Обновления.

Все еще не работает все же. hack.chat отдает 101 с Соединением: Обновление и Обновление: websocket, но так или иначе nginx отдает 101 с Соединением: активный (как, что я вижу в Firefox):/

Править

Сделал ngrep на nginx связи, он действительно отправляет, пакет hack.chat отдает ему, и Firefox жалуется на перекрестный источник. Я буду стараться избегать перекрестного источника.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ

Хорошо теперь, когда я дома, я сделал тест, и он работал как очарование. Симпатичные sur, что моя последняя проблема была из-за моего прокси работы, позволяют нам надеяться, что это - кэш, или иначе все было бы бесполезно.

Здесь является последним из моего conf, который избегает перекрестного источника:

server{
        listen 0.0.0.0:80;
        server_name chat.axellink.fr;

        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;
                proxy_pass http://127.0.0.1:8081;
        }

        location /chat/ {
                proxy_pass http://127.0.0.1:6060;
                proxy_http_version 1.1;
                proxy_set_header Upgrade "websocket";
                proxy_set_header Connection "Upgrade";
        }

        access_log /var/log/nginx/chat_access;
        error_log /var/log/nginx/chat_error debug;
}
6
задан 7 August 2015 в 23:31
1 ответ

Из моего чтения док-станции веб-сокетов nginx, когда ваш прокси-сервер nginx видит заголовки Upgrade, передает их hack.chat. После этого hack.chat должен ответить ответом 101.

Прежде всего, вы хотите иметь возможность отлаживать фактические транзакции HTTP и hack.chat, чтобы вы знали, в вашем клиентском приложении проблема или в веб-сервер, или с помощью hack.chat связи. Это также позволит вам получить точный HTTP-ответ, который, по вашему мнению, в настоящее время вы не знаете, как получить. ЕСЛИ проблема на стороне сервера, возможно, вы все еще хотите получить более качественные журналы того, что пошло не так.

Вы можете захватить HTTP-трафик с помощью tcpdump или ngrep. Я бы пошел на ngrep. Выполнение этого подобного действия даст вам вывод в вашем терминале.

ngrep 'Host: chat.axellink.fr' port 80

Вы, вероятно, захотите запустить это на своем веб-сервере, хотя, если у вас есть среда рабочего стола, которая может запускать ngrep, вы можете запустить его там. Если вы запустите его на сервере, вы также можете зафиксировать взаимодействие между nginx и вашим чат-сервером.

ngrep '.' port 6060

Часто вывода терминала достаточно, чтобы увидеть, что вам нужно, но вы также можете использовать флаг '-O' для ngrep, чтобы записать данные в файл дампа pcap, как это делает tcpdump с '-w'. Затем вы можете вернуть этот файл на свой рабочий стол, чтобы просмотреть его с помощью графического клиента, такого как wirehark.

Возможно, вы сможете определить проблему из этого, но если нет, запишите различные взаимодействия и добавьте их в свой вопрос.

Есть ли проблема с javascript, запрашивающим связь с hack.chat на другом домене, отличном от того, с которого javascript обслуживается? Это может быть актуально: https://stackoverflow.com/questions/20093070/unable-to-create-cross-domain-websocket-connection-to-node-js-socket-io-server

2
ответ дан 3 December 2019 в 00:40

Теги

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