用nginx做ws代理,并根据url参数选择后台服务器

在我的前一篇文章中已经能够通过生成url连接exsi来获得虚拟机的console,不过这个方法有一些问题。exsi一般在内网,也就是我们无法在外网链接它,也就无法获取这个console。

也就是由原来的

       浏览器 -----wss协议----> exsi主机

变为

       浏览器-------ws协议-----> nginx -------wss协议----->exsi主机

那么我们需要解决两个问题:

第一个是ws代理的问题:

在这里我选择nginx做代理

下面是配置的一部分代码

location / {
           proxy_pass https://192.168.3.1:443;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
        }

用上面的方法直接就可以成功了


但是这个方法遇到一个问题,就是vm所在的exsi主机有很多,用上面那个方法的话无法选择连接那一台服务器

这时候我有一个思路:

构造不同的url链接不同的主机,如:

location /1 {
           proxy_pass https://192.168.3.1:443;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
        }

location /2 {
           proxy_pass https://192.168.3.2:443;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
        }

location /3 {
           proxy_pass https://192.168.3.1:443;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
        }

这个方法是可以实现的,不过很糟糕。exsi主机有很多的话需要添加多条规则,而且如果exsi主机换了ip地址的话还需要修改配置文件


后来通过网上查找资料,发现nginx很强大,支持自定义变量,还可以获取url中的参数:

然后使用了一种新的方法

    location / {
           # root   html;
           # index  index.html index.htm;
           proxy_pass https://$arg_ip;
           proxy_http_version 1.1;  
           proxy_set_header Upgrade $http_upgrade;  
           proxy_set_header Connection "upgrade";
        }
其中的 $arg_ip 就是url中的参数ip的值

如wss://192.168.3.11/ticket/fjdsjafjfiehgi?ip=192.168.1.22

那么$arg_ip 就是192.168.1.22


如上,我们就可以成功实现想要的功能

感想:n'gin'x真的很强!!!!



你可能感兴趣的:(用nginx做ws代理,并根据url参数选择后台服务器)