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请求头章);
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。