如何使用Nginx进行安全的Web套接字连接?

时间:2018-06-23 17:15:50

标签: javascript php websocket nginx-reverse-proxy

我可以通过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-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 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;

1 个答案:

答案 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套接字路由到该路径!