404 字
2 分钟
Nginx端口转发的坑
最近在配置Nginx转发端口的时候踩了个大坑,记录一下
需求是这样的,我们游戏服务器使用的wss协议,需要用nginx进行大量的端口转发,如wss://xxx.com/10000 转发到 ws://xxx.com:10000,后面的端口范围是10000到11000,我不想写1000条这样的规则,于是我在网上找了这样一段代码:
location ~* ^/(?<port>\d+)$ { proxy_pass http://127.0.0.1:$port; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host;}咋一看,好像确实能用,就是把/port替换成
如何解决这个问题,首先想到的是用if语句,但在Nginx社区中有一个说法”If Is Evil”(if是邪恶的),因为在某些复杂情况下if语句可能导致意外行为。所以我最终采取匹配数字的方式:
location ~* ^/(?<port>(20[0-9]\{3\}))$ { proxy_pass http://127.0.0.1:$port; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host;}意思是0到9这一区段数值重复3个,也就是10000-10999的端口能匹配上,这样子其它端口就匹配不上,或者:
location ~* ^/(?<port>2[0-1]\d\d\d)$ { proxy_pass http://127.0.0.1:$port; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host;} Nginx端口转发的坑
https://blog.coding1024.com/zh/posts/ef62fe3f/
评论
欢迎交流问题、想法与经验。请友善讨论,不要留下私人敏感信息。
正在加载留言…