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
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请求头章);
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注天达云行业资讯频道,感谢您对天达云的支持。