访问控制

这篇文章将会介绍如何在配置应用网关中的规则, 从而对应用的访问进行控制.

在这篇文章中, 你将会完成:

  • 添加 HTTP 策略
  • 添加 HTTP 强转 HTTPs 策略
  • 添加 TCP 策略
  • 添加 泛域名 策略
  • 添加 A/B 测试, 灰度发布策略
  • 参数配置

前期准备

请确保你能够满足以下条件:

  • 一个状态健康的 Rainbond.
  • 一个或多个运行中的服务
  • 一个可用, 并且已经解析到应用网关所在机器上的域名(机器的 IP 可以在添加策略的面板上找到)

添加 HTTP 策略

  • 准备一个服务,参考服务创建文档
  • 点击 应用网关 -> 访问控制 -> 添加策略
  • 填写路由条件等信息
  • 点击 确认 访问控制 - 图1

配置完成后, 就可以通过域名(www.test.com)对应用(Nginx)进行访问了.

HTTPs 策略, HTTP 强转 HTTPs 策略

  • 准备一个服务,参考服务创建文档
  • 点击 应用网关 -> 访问控制 -> 添加策略
  • 填写 域名, 绑定证书, 应用(组), 服务组件, 端口号, HTTP Rewrite HTTPs 等信息
  • 点击 确认

如果没有勾选 HTTP Rewrite HTTPs, 那么将会是单纯的HTTPs

访问控制 - 图2

配置完成后, 用 http://www.test.com 进行访问, 将被强制转成 https://www.test.com.

TCP 访问策略

基于四层的访问策略支持的路由条件有:IP地址和端口。 IP地址支持选择目前集群所有网关节点的内外网IP地址或使用0.0.0.0通配地址全局生效。 针对每个IP地址可选择性设置不冲突的端口。需要注意的是80/443端口是保留端口不能使用。 这里的IP地址可以是固定IP地址或虚拟IP地址,内网IP地址或外网IP地址。

0.0.0.0 是指此策略将在全部网关节点生效,可以通过所有网关节点的IP地址和映射到网关节点的公网IP地址访问。

添加方式: - 准备一个服务,参考服务创建文档 - 点击 应用网关 -> 访问控制 -> TCP/UDP -> 添加策略 - 填写 IP, 端口, 应用(组), 服务组件, 端口号, 负载均衡 - 点击 确认

TCP 策略会有一个系统自动分配的端口, 你也可以指定端口, 但是要注意端口冲突的问题.

访问控制 - 图3

配置完成后, 就可以通过 IP+Port(47.92.168.60:20128)访问应用了.

泛域名

  • 准备一个服务,参考服务创建文档
  • 点击 应用网关 -> 访问控制 -> 添加策略
  • 填写 泛域名, 应用(组), 服务组件, 端口
  • 点击 确认

访问控制 - 图4

配置完成后, 任何一个解析到39.104.143.70的 test.com 的子域名都会访问同一个应用(Nginx).

高级路由(A/B 测试, 灰度发布)

在高级路由中, 我们可以对不同的服务绑定同一个域名, 通过设置不同的 请求路径, Cookie, Header, 将流量路由到相应的服务上. 另外, 我们还可以通过设置权重, 将流量按权重分配到不同的服务上. 以上的功能, 可以帮助我们轻松地实现 A/B 测试, 灰度发布.

Cookie

在 HTTP 策略中添加两个Cookie信息, branch=v5.0和version=beta, 如下图所示:

访问控制 - 图5

设置了Cookie后, 单纯的通过域名已经无法访问应用了:

  1. 172:~ abe$ curl www.test.com
  2. <html>
  3. <head><title>502 Bad Gateway</title></head>
  4. ...

在访问的时候需要带上Cookie信息才能正常地对应用进行访问:

  1. 172:~ abe$ curl --cookie "branch=v5.0;version=beta" www.test.com
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Welcome to nginx!</title>
  6. ...

Header

在 HTTP 策略中添加两个请求头信息, branch=v5.0 和 version=beta, 如下图所示:

访问控制 - 图6

设置了请求头后, 单纯的通过域名已经无法访问应用了:

  1. 172:~ abe$ curl www.test.com
  2. <html>
  3. <head><title>502 Bad Gateway</title></head>
  4. ...

在访问的时候需要带上请求头信息才能正常地对应用进行访问:

  1. 172:~ abe$ curl -H "branch:v5.0" -H "version:beta" www.test.com
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Welcome to nginx!</title>
  6. ...

权重

首先, 准备两个应用, 2048和Nginx,打开对外访问

然后, 给这两个应用, 分别添加一条 除了权重, 其他信息都一样的策略. 2048的权重设置为75, Nginx的权重设置为25.

最后, 通过他们的域名test.goodrain.com访问; 可以发现, 有75%的概率访问的是2048, 25%的概率访问的是Nginx. 访问控制 - 图7

通过以上对 Cookie, Header, 权重的配置, 就可以灵活地配置 A/B 测试灰度发布.

参数配置

网关目前支持的参数有以下几个:

连接超时时间

定义与上游服务器(upstream)建立连接的超时时间. 单位是秒, 默认: 75.

请求超时时间

设置将请求传输到上游服务器(upstream)的超时时间. 单位是秒, 默认: 60. 仅在两次连续写入操作之间设置超时时间, 而不是为整个请求的传输. 如果上游服务器服务器在此时间内未收到任何内容,则关闭连接.

响应超时时间

定义从上游服务器(upstream)读取响应的超时时间. 单位是秒, 默认: 60. 仅在两个连续的读操作之间设置超时, 而不是为整个响应的传输. 如果上游服务器在此时间内未传输任何内容, 则关闭连接.

上传限制

设置上传内容(或请求正文)的最大限制, 将大小设置为0将不作限制. 单位是 Mb, 默认: 1.

自定义请求头

设置了自定义请求头后, 每个发往上游服务器(upstream)的请求都会带上这些请求头.

后端响应缓冲区

对应 Nginx 的 proxy_buffering 参数, 默认关闭. 如果关闭了后端响应缓冲区,那么 Nginx 会立即把从后端收到的响应内容传送给客户端;. 如果开启了后端响应缓冲区, 那么 Nignx 会把后端返回的内容先放到缓冲区当中,然后再返回给客户端; 并且这个过程是边收边传,不是全部接收完再传给客户端.

Websoket

在网关支持的 WebSocket 与单纯的 WebSocket 不同, 是在 HTTP 的基础上, 使用 HTTP Upgrade 机制将连接从 HTTP 升级到 WebSocket. 这个 HTTP Upgrade 机制是在请求中添加两个自定义请求头, 分别是 ‘Upgrade $http_upgrade’ 和 ‘Connection “Upgrade”’, 当勾选了 Websoket, 网关会自动为当前的策加上这两个请求头. 更多的信息可以参考: NGINX as a WebSocket Proxy