在我的前一篇文章中已经能够通过生成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真的很强!!!!