• 旺旺
    2019-06-02
    我的留言
    老师你的websocket.conf配置文件中:
    proxy_pass http://echo.websocket.org
    为啥不是
    proxy_pass wss://echo.websocket.org
    呢?
    在http://websocket.org/echo.html 页面上,自动连接的时候,用的地址是
    ws://echo.websocket.org
    这个啊
    作者回复: 因为proxy_pass不接受wss语法 ,原因是ws是从http升级过去的,升级完成后其实在Nginx看来就退化成TCP连接,不用那么复杂。在《Web协议详解与抓包实战》第2部分课程中,有对Websocket协议格式的详细讲解。

    多谢老师的解答,《Web协议详解与抓包实战》我也定了,正在学习中。
    现在有一个需求,想向老师请教下。
    我们后端是很多个ws服务(在不同地域的不同服务器上),而且这些服务有的响应快,有的响应慢,而且在调用的时候,还可能会在响应中返回一些业务意义上的错误或者异常信息。
    现在想用nginx做反向代理,并希望nginx能对后端ws服务返回的包体中是否有指定的异常或者错误信息进行解析,如果包含指定的错误或异常,那么不要想客户端返回,而是将前端发过来的请求发往其他的后端ws服务,如果多次尝试均失败,再将最后一个后端ws服务的响应返回客户端。
    这样主要是向提高前端调用的成功率。
    不知道ngxin是否可以做到,还是要使用OpenResty来做呢?如果可以做好,请老师给个指引,谢谢!
    展开

    作者回复: nginx做不到,因为websocket自身只是想把TCP暴露给应用,因此它只是定义了一个frame的概念;Nginx不解析Frame,只是把升级后的WS协议作为TCP双向透传。

    
     1
  • Panda
    2019-03-24
    为了保证 NGINX 代理后的请求发送到固定的 Server 需要用 ip Hash 或者 一致性哈希 做负载均衡
    
     1
  • 渔人
    2019-01-21
    nginx是如何处理websocket的长连接的呢? 客户端一旦和服务端建立了连接,它发过去的数据就得稳定地被转发到特定的服务端,但是每个客户端发包的这个事件可能会被不同的nginx进程处理,如果用iphash的话,那每一个进程都需要为每个'客户端-服务端'维护一个冗余的长连接? 还有从服务端到客户端的数据。您视频里面有点简略,能详细讲讲吗?

    作者回复: 数据都是在一条建立好的TCP连接上传递的,WS连接由哪个worker进程accept,就会由它按照负载均衡算法例如iphash选择上游一台server,建立好连接后,就会在这两条连接间接力传递数据。

    
     1
  • vector_jin
    2020-02-03
    通过nginx的四层stream代理,是不是也能实现websocket代理这类应用层的代理

    作者回复: 可以

    
    
  • 旺旺
    2019-09-17
    老师,如果被代理的地址是wss协议(不是ws)的,比如wss://echo.websocket.org,那么这个时候
    proxy_pass改怎么写呢?
    proxy_pass http://echo.websocket.org
    还是
    proxy_pass https://echo.websocket.org
    呢?
    最近想通过nginx反向代理到后端是wss协议的地址,一直没搞成功。
    展开

    作者回复: 1、ws只是http的升级协议,换成https也是一样。你可以参考《Web协议详解与抓包实战》第44课,看看http/1.1怎么升级到websocket,这与https无关。
    2、nginx的http_proxy会将下游协议ssl剥离,你需要再次加上ssl,请参看96课。

     1
    
  • 帅
    2019-06-17
    老师,我配置的东西怎么报错了,而且页面链接不上
    <html><head></head><body><h1>400 WebSocket Upgrade Failure</h1></body></html>
    02:01:07.244316 IP localhost.49376 > ec2-174-129-224-73.compute-1.amazonaws.com.http: Flags [.], ack 568, win 15309, length 0
    E..(.0@.@..........I...P.....0O.P.;..~..
    02:01:07.244510 IP ec2-174-129-224-73.compute-1.amazonaws.com.http > localhost.49376: Flags [FP.], seq 568, ack 546, win 64240, length 0
    E..(......Q....I.....P...0O.....P....Q........
    02:01:07.248689 IP localhost.49376 > ec2-174-129-224-73.compute-1.amazonaws.com.http: Flags [F.], seq 546, ack 569, win 15309, length 0
    E..(.1@.@..........I...P.....0O.P.;..|..
    02:01:07.249696 IP ec2-174-129-224-73.compute-1.amazonaws.com.http > localhost.49376: Flags [.], ack 547, win 64239, length 0
    E..(......Q....I.....P...0O.....P....Y........
    展开

    作者回复: Websocket升级失败,需要查看以下头部是否传递:
    1、Sec-WebSocket-Version是否存在
    2、Connection: keep-alive, Upgrade
    3、Upgrade: websocket
    建议抓包查看,你也可以学习下我的《Web协议详解与抓包实战》第44课:websocket协议升级时的必要头部。

    
    
  • 旺旺
    2019-05-30
    老师你的websocket.conf配置文件中:
    proxy_pass http://echo.websocket.org
    为啥不是
    proxy_pass wss://echo.websocket.org
    呢?
    在http://websocket.org/echo.html 页面上,自动连接的时候,用的地址是
    ws://echo.websocket.org
    这个啊
    展开

    作者回复: 因为proxy_pass不接受wss语法 ,原因是ws是从http升级过去的,升级完成后其实在Nginx看来就退化成TCP连接,不用那么复杂。在《Web协议详解与抓包实战》第2部分课程中,有对Websocket协议格式的详细讲解。

    
    
  • 阿柒
    2019-03-22
    哈,可以抓包调试,学习了。谢谢老师
    
    
我们在线,来聊聊吧