我可以通过JavaScript将Web套接字直接连接到我的PHP守护程序服务器:var websocket = new WebSocket(“ ws:// IP:PORT”);这样可以正确获得握手,但是当我尝试使用nginx代理http://IP时,它无法接收Sec-WebSocket-Key的头值,并且握手失败。
-最近更新:由于以下原因,JavaScript根本无法连接:SyntaxError:指定了无效或非法的字符串!
nginx config file: upstream chatwebsocket { server 127.0.0.1:9090; } server { # ... listen 80 default_server; location / { proxy_pass http://chatwebsocket; ... proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key; }
未设置变量:$ http_sec_websocket_key ...为什么?我应该为此使用什么变量?我的PHP聊天服务器未获取名为以下内容的Web套接字标头“ Value”:Sec-Websocket-Key。我可以使用以下命令手动将其设置为一些虚拟值:proxy_set_header Sec-WebSocket-Key 13;并且我的PHP日志文件将显示密钥为13。
此外,当我转到http://IP时,可以在浏览器控制台窗口中检查响应标头。 HTTP / 1.1 400 Bad Key Request,这是我在以下情况下在PHP中创建的错误:注意-$ header转换为小写字母并进行了修整...并且工作正常...
$headers[strtolower(trim($matches[1]))] = trim($matches[2]);
if (! isset($headers['sec-websocket-key'])) { return "HTTP/1.1 400 Bad Key Request"; //...
为什么?我要这样做是因为HTTP能够正常工作,我想使用HTTPS以加密形式安全地使用WebSockets,还可以确保我的网页流量安全。
我看过以下页面:https://github.com/die-net/nginx-config-example/blob/master/include/proxy-headers和http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header。 不确定$ http_sec_websocket_key为什么没有获得值集...或在该位置使用什么变量?
似乎是JavaScript问题: var websocket = new WebSocket('http://IP'); SyntaxError:指定了无效或非法的字符串
如何将JavaScript Page连接到Nginx网页代理,可以吗?或如何设置服务器以进行wss:// IP
或者用PHP中的任何简单代码编写wss套接字?
哈,我明白了,这里是Nginx配置:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream chatwebsocket {
server 127.0.0.1:9090;
}
server {
listen 8020;
location / {
proxy_pass http://chatwebsocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
我错过了proxy_set_header **
升级
** $ http_upgrade;
答案 0 :(得分:0)
在JavaScript中执行:var websocket = new WebSocket('wss://DomainName:443');
在Nginx中执行:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream appwebsocket {
server 127.0.0.1:9090;
}
server {
listen 443;
server_name YOUR_Domain_Name_HERE;
ssl on;
ssl_certificate /etc/nginx/ssl/ssl.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://appwebsocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
进行连接升级是使所有内容都在Nginx中正常运行的门票。我不需要设置Sec-WebSocket-Key标头(在nginx中)!另外,我不需要重新编写PHP应用程序!
请记住,您可以将路径添加到nginx位置路径,以便使您的网页保持在线状态,并将Web套接字路由到该路径!