【问题标题】:How can I use Nginx to do Secure Web Socket Connections?如何使用 Nginx 进行安全 Web 套接字连接?
【发布时间】:2018-12-02 20:17:45
【问题描述】:

我可以通过 JavaScript 直接将 Web 套接字连接到我的 PHP 守护程序服务器: var websocket = new WebSocket("ws://IP:PORT");这将正确地进行握手,但是当我尝试使用 nginx 代理 http://IP 时,它无法接收到 Sec-WebSocket-Key 的标头值并且握手失败。

-- 最近更新:JavaScript 根本没有连接,原因是:SyntaxError:指定了无效或非法的字符串!

nginx配置文件: 上游聊天网络套接字 { 服务器 127.0.0.1:9090; } 服务器 { # ... 听 80 default_server; 地点 / { proxy_pass http://chatwebsocket; ... proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key; }

变量:$http_sec_websocket_key 没有设置...为什么?我应该为此使用什么变量?我的 PHP 聊天服务器没有获取名为:Sec-Websocket-Key 的 Web 套接字标头“值”。我可以手动将其设置为一些虚拟值:proxy_set_header Sec-WebSocket-Key 13;我的 PHP 日志文件会显示它有 13 个密钥。

此外,当我转到 http://IP 时,我可以在浏览器控制台窗口中检查响应标头。 HTTP/1.1 400 Bad Key Request 这是我在 PHP 中创建的错误,当:注意 - $headers 被转换为小写并修剪......并且工作正常......

$headers[strtolower(trim($matches[1]))] = trim($matches[2]);
if (!isset($headers['sec-websocket-key'])) { 返回“HTTP/1.1 400 错误密钥请求”; //...

为什么?,我想这样做是因为一旦 HTTP 工作,我想使用 HTTPS 以加密形式安全地使用 WebSocket,同时保证我的网页流量安全。

我看过这些页面:https://github.com/die-net/nginx-config-example/blob/master/include/proxy-headershttp://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 页面连接到 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;

【问题讨论】:

  • 我想在 PHP 中保持我的 web 套接字代码与它一样简单干净,同时仍然使用 Nginx 为我做 SSL。我对如何做到这一点感到困惑,有什么想法吗?
  • 好的,我想我现在明白了:nginx.com/blog/websocket-nginx
  • 刚刚通过 nginx 添加了 SSL 支持来监听 443 并安装了证书。现在,我可以通过 JavaScript wss://myDomain:443 URL 连接网络套接字。进行连接升级是让所有东西都在 Nginx 中正常工作的门票。我不需要设置 Sec-WebSocket-Key 标头(在 nginx 中)!

标签: javascript php websocket nginx-reverse-proxy


【解决方案1】:

在 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 位置路径添加路径,这样您就可以保持网页在线并将网络套接字路由到该路径!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2020-07-22
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2019-01-13
    相关资源
    最近更新 更多