我目前正在尝试在我的个人服务器上运行hack.chat 。
长话短说,它由两台服务器组成。 首先是一个简单的httpd服务器提供JavaScript和CSS。 第二个聊天系统是javascript连接到websocket的一个node.js服务器。 这里出现了问题。
我希望使用端口80,在单个IP上使用不同的域名,在Nginx中使用单独的服务器块。
我跟着Nginx的websocket文件,但这是行不通的。 当websocket尝试连接时,它总是得到200返回代码,而如果我理解的很好,它应该得到101(切换协议)。
我的Nginx版本是1.8.0,我的服务器在linux 4.0.5下运行在gentoo上
下面是相关的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/*; }
网站启用/聊天:
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服务器不给我任何日志(或者我不知道如何查看它)。
提前谢谢你的回复。
编辑
Thx到mc0e,我设法让hack.chat服务器响应101.通过比较nginx和node.js之间发生什么实际发生的直接连接,我看到直接一个标头升级:websocket设置,但nginx不。 所以我更正了我的网站启用/聊天:
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; }
我还删除了地图块,因为它用来设置连接标题closures,而不是升级。
仍然不工作。 hack.chat给出了连接:升级和升级:websocket的101,但不知何故,nginx给了一个101连接:保持活着(正如我在firefox中看到的):/
编辑
在nginx通信上做了一个ngrep,它发送hack.chat包给他,而firefox则抱怨跨源。 我会尽量避免交叉起源。
最后编辑
好吧,现在我回家了,我做了一个testing,它的工作就像一个魅力。 漂亮,我最后一个问题是因为我的工作代理,让我们希望它的caching,否则一切都将是无用的。
这是我的最后一个避免交叉来源的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 websocket dock中,当你的nginx代理看到升级头时,它将它们传递给hack.chat。 hack.chat然后需要回应101回应。
首先,您希望能够debugging实际的HTTP和hack.chat事务,以便知道问题出在您的客户端应用程序,Web服务器上还是hack.chat通信中。 这也可以让你得到确切的HTTP响应,你说你目前不知道如何得到。 如果问题是服务器端,你可能仍然希望得到更好的错误日志。
您可以使用tcpdump或ngrep捕获httpstream量。 我会去ngrep。 这样做会给你在terminal输出。
ngrep 'Host: chat.axellink.fr' port 80
你可能想在你的web服务器上运行它,但是如果你有一个可以运行ngrep的桌面环境,你可以select在那里运行它。 如果你在服务器上运行它,你也可以捕获nginx和你的聊天服务器之间的交互。
ngrep '.' port 6060
terminal输出往往足以看到你需要什么,但你也可以使用'-O'标志ngrep将数据写入pcap转储文件,就像tcpdump用'-w'所做的那样。 然后,您可以将该文件带回桌面,使用graphics客户端(如wireshark)查看该文件。
你可能会从这个问题中发现问题,但如果没有,捕捉各种相互作用,并将其添加到您的问题。
是否有问题的JavaScript请求hack.chat通信在不同的域到JavaScript的服务? 这可能是相关的: https : //stackoverflow.com/questions/20093070/unable-to-create-cross-domain-websocket-connection-to-node-js-socket-io-server