温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Nginx中怎么转发socket

发布时间:2021-07-30 14:06:09 来源:亿速云 阅读:954 作者:Leah 栏目:大数据

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请求头章);

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI