一、介绍

在 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 解释

下面详细说一下 nginx.conf 里关键几部分的作用

1、upstream

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 只要保证一个在线即可,这样我们可以在线重新部署其中一个或两个。

2、map $http_upgrade

map $http_upgrade $connection_upgrade {
  default  upgrade;
  ''       close;
}

这部分的作用是配置 nginx 让其支持长连接代理,详细内容可以搜索 nginx 代理长连接的信息。

3、server 部分中的 DNS

server 里有很多 httpsr 配置,如果不用 https 完全可以删除。里面有一段关于 DNS 的

resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;

这段的意思是指定 google 的 DNS,当然,作者假设你想把 STF 部署在一个外网域名上,而实际上很多公司可能使用的是内网域名,这时 resolver 就必须改掉。

4、server 中的 location

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 了。不过有些情况,比如外网访问内网的机器,就必须代理。


↙↙↙阅读原文可查看相关链接,并与作者交流