在 STF 的官方的部署文档 (https://github.com/openstf/stf/blob/master/doc/DEPLOYMENT.md) 中,作者推荐用 nginx 来组合不同的模块,这样不同的模块可以分别部署在不同机器上,而且可以部署多个。先简单介绍一下 nginx 这个工具吧。
Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,简单来说,nginx 可以把用户不同的请求分配给不同的服务器处理,然后把结果在返回给用户。
在 STF 中 nginx 把不同类型的请求,例如 api、img、js 等不同类型的资源分配给不同的 docker,这样就可以实现负载均衡以及模块的扩展,甚至可以实现在不影响服务的情况下进行更新。
下面详细说一下 nginx.conf 里关键几部分的作用
http {
upstream stf_app {
server 192.168.255.100:3100 max_fails=0;
}
upstream stf_auth {
server 192.168.255.150:3200 max_fails=0;
}
.....
这部分自然对应不同的 STF 模块,其实这里可以配置多个,实现负载均衡:
http {
upstream stf_app {
server 192.168.255.100:3100 max_fails=0;
server 192.168.255.101:3100 max_fails=0;
server 192.168.255.102:3100 max_fails=0;
}
.....
100、101、102 只要保证一个在线即可,这样我们可以在线重新部署其中一个或两个。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
这部分的作用是配置 nginx 让其支持长连接代理,详细内容可以搜索 nginx 代理长连接的信息。
server 里有很多 httpsr 配置,如果不用 https 完全可以删除。里面有一段关于 DNS 的
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
这段的意思是指定 google 的 DNS,当然,作者假设你想把 STF 部署在一个外网域名上,而实际上很多公司可能使用的是内网域名,这时 resolver 就必须改掉。
location ~ "^/d/floor4/([^/]+)/(?<port>[0-9]{5})/$" {
proxy_pass http://192.168.255.200:$port/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
}
这段的意思是代理长连接了,主要用途是代理 provider 的屏幕画面传输,如果没有这段,用户是看不到 provider 的屏幕的,但是可以操作屏幕!!!有兴趣的同学可以试一下。localtion 那一行其实是一个正则匹配,因为每个手机传输图像的端口不一样,所以只能匹配了。真正区别不同 provider 的参数是 floo4。
当然,让 nginx 代理屏幕的图像传输感觉会有性能问题,如果大量手机同时使用,不知道 nginx 会不会有瓶颈。解决这个问题的方法是不用 nginx 代理,直接让用户从 provider 处接收屏幕图像,只要修改 provider 的启动参数就可以了:
.....ws://192.168.0.100:<%= publicPort %>/d/floor4/<%= serial %>/<%= publicPort %>/
不用 nginx 代理以后就可以自由的增加和减少 provider 了。不过有些情况,比如外网访问内网的机器,就必须代理。