Я в настоящее время пытаюсь иметь 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;
}
Из моего чтения док-станции веб-сокетов 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