Nginx条件动态代理

时间:2017-06-17 20:02:30

标签: nginx websocket proxy

我在我的服务器上运行游戏。 当用户请求时,我的服务器上的新进程将启动,并开始在8001-8100范围内的随机端口上侦听websocket连接。

在客户端我想连接到游戏。

var port = 8044; // <- Client is given this number when creating a new game
connection = new WebSocket("wss://XXX/websocket?port=" + port);

我的服务器是nginx反向代理。我想做这样的事情: (我需要一个有效的替代品,下面应说明这一点。)

server {
...
location /websocket/ {
  if(isNumber($port) && $port <= 8100 && $port >= 8001 {
    proxy_pass http://localhost:$port;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
} }

这些反向代理恶作剧的原因是能够使用默认的443端口,这意味着客户端不会遇到防火墙问题。 Othwerwise我只是直接从客户端连接到正确的端口。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

port参数以$arg_port的形式提供。可以使用正则表达式检查它。例如:

location /websocket/ {
    if ($arg_port !~ "^80[0-9]{2}$") {
        return 403;
    }
    proxy_pass http://localhost:$arg_port;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

具有端口范围的小诗意许可,但更复杂的表达可以达到您的精确要求。我避免在these reasonsif块中放置太复杂的内容。

有关详情,请参阅this document