Nginx转发socket

Nginx转发socket

  • 配置前的准备工作
Nginx转发socket需要stream模块的支持,编译时需要--with-stream,
该模块在Nginx安装时是默认不安装的.
同时Nginx版本应高等于于1.9;

  • 通过反向代理,进行转发操作
注释:
    官方提供的转发方式, 缺点,不能共用80端口,需要增开端口.
    
stream模块和event模块是平级的.

stream {
    # 添加socket转发的代理(上游服务器)
    upstream bss_num_socket {
        hash $remote_addr consistent;
        # 转发的目的地址和端口
        server 130.51.11.33:19001 weight=5 max_fails=3 fail_timeout=30s;
    }

    # 提供转发的服务,即访问localhost:30001,会跳转至代理bss_num_socket指定的转发地址
    server {
       listen 30001;
       proxy_connect_timeout 1s;
       proxy_timeout 3s;
       proxy_pass bss_num_socket;
    }
}

以上部分,参考官方文档.(一模一样的)
  • 另一种操作
该方式, 通过前端访问,一个专门的URI, Nginx通过URI来确认转发.优点,共用80端口.
注意, location自然是要在server之内的, 与其他location同级


location = /socket {
    # 转发到该地址
    # 转发地址可以直接用IP:端口的形式如:http://127.0.0.1:9999
    proxy_pass http://socket.byingcn.com/;
    # 转发时设置header头,在域名后添加端口号
    proxy_set_header Host $host:9502;
    # 设置HTTP1.1
    proxy_http_version 1.1;
    
    # 将客户端的Upgrade(作为websocket重要标识)请求转发(必须)
    proxy_set_header Upgrade $http_upgrade;
    # 将客户端的Connection(作为websocket重要标识)转发(非必须,但是最好转发一下)
    proxy_set_header Connection "upgrade";
    # 转发IP地址
    proxy_set_header X-Forwarded-For $remote_addr;
}


小结:
    如果不太懂上面两个proxy_set_header的意义可以通过前台抓包看下, websocket请求头即可明白.
    proxy_set_header 作为设置请求头自然是不用说的.
    
    Upgrade和Connection资料比较少.应该记一下,通过查了不少资料和亲测实践.
    此处设置的Upgrade和Connection
    即为http请求头中的Upgrade和Connection.
    而$http_upgrade系统变量则是,Nginx定义的用来获取请求头中的Upgrade的系统变量.
    通过我将Upgrade $http_upgrade;项的设置改为Upgrade "websocket"(和请求头一样);完美运行.
    基本上可以认为上面的说法是正确的.
    
    总结一下, 基本上就是在转发时,要把转发的TCP/IP(socket)数据的头中的Upgrade和Connection给带过去(或设置的和前端一样)即可.

注释:
    该部分是放在普通的server模块中的;
    给方式不用重开其他端口,只需指定某文件即可.
    原理部分在于:
    前端websocket部分请求到/socket文件.
    Nginx通过侦听,获取凡是请求该文件的操作,全部转发的http://socket.byingcn.com/;
    但是该操作同时也需要Nginx安装 --with-stream
  • websocket 请求头
GET /socket HTTP/1.1
Host: test.virtualserver.com
Connection: Upgrade 
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket 
Origin: chrome-extension://pfdhoblngboilpfeibdedpjgfnlcodoo
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Sec-WebSocket-Key: /mFCat+ePPs61TKUBZ5zHA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

注释:
    Connection字段和Upgrade字段在http权威指南中有详解(http请求头章);

转载于:https://my.oschina.net/chinaliuhan/blog/3074800

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值