Nginx转发socket端口配置详解
Nginx转发socket端口常见场景:在线学习应用,在常规功能之外,增加一个聊天室功能,后端选择swoole提供服务提供者,同时不想前端直接ip:port方式链接到服务,需要使用Nginx进行转发。
常规情况,我们可以在用户页面,直接建立socket链接,但这样的操作会暴露端口,带来一定的安全隐患,使用Nginx进行转发,可以隐藏端口。额外的问题就是一些header参数也需要在转发过程中带给socket服务提供者,其他只需要Nginx处理一下从常规协议转换到Websocket就可以。
其中,"Upgrade"是逐跳(hop-by-hop)头,无法从客户端转发到代理服务器,通过转发代理,客户端可以使用CONNECT方法来规避此问题。但是,这不适用于反向代理,因为客户端不知道任何代理服务器,并且需要在代理服务器上进行特殊处理。同时逐跳头包含"Upgrade"和"Connection"都无法传递,则需要在转换为Websocket的时候带上这两个参数:例如:
location/chat/{ proxy_passhttp://backend; proxy_http_version1.1; proxy_set_headerUpgrade$http_upgrade; proxy_set_headerConnection"upgrade"; }
进阶:让转发到代理服务器的"Connection"头字段的值,取决于客户端请求头的"Upgrade"字段值。例如:
http{ map$http_upgrade$connection_upgrade{ defaultupgrade; ''close; } server{ ... location/chat/{ proxy_passhttp://backend; proxy_http_version1.1; proxy_set_headerUpgrade$http_upgrade; proxy_set_headerConnection$connection_upgrade; } }
注意:示例中的http://backend为一组负载均衡的服务器,只有单台服务器的,可以写成proxy_passhttp://127.0.0.1:9501;这样的。
此外,默认情况下,在60秒内未传送任何数据的链接将被关闭,时间可以使用proxy_read_timeout指令来延长。或者代理服务器可以配置定时发送ping帧来重置超时及检查链接是否可用。
参考链接:NginxWebsocketproxying
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。