Docker-stick-nginx镜像制作

什么是 Sticky?

为了理解 Sticky 的工作原理,我们可以先考虑一个问题:负载均衡怎么做?

  • DNS 解析,在域名解析时分配给不同的服务器 IP;
  • IP Hash,根据客户端的 IP,将请求分配到不同的服务器上;
  • cookie,服务器给客户端下发一个 cookie,具有特定 cookie 的请求会分配给它的发行者。
  • Sticky 就是基于 cookie 的一种负载均衡解决方案,通过 cookie 实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器。请求来了,服务器发个 cookie,并说:下次来带上,直接来找我。

为方便叙述,文中的 cookie 都指 sticky 使用的 cookie。

Sticky 工作原理

Sticky 是 nginx 的一个模块,通过分发和识别 cookie,来使同一个客户端的请求落在同一台服务器上。sticky 的处理过程如下(假设 cookie 名称为 route):

  1. 客户端首次发起请求,请求头未带 route 的 cookie。nginx 接收请求,发现请求头没有 route,则以轮询方式将请求分配给后端服务器。
  2. 后端服务器处理完请求,将响应头和内容返回给 nginx。
  3. nginx 生成 route 的 cookie,返回给客户端。route 的值与后端服务器对应,可能是明文,也可能是 md5、sha1 等 Hash 值。
  4. 客户端接收请求,并创建 route 的 cookie。
  5. 客户端再次发送请求时,带上 route。
  6. nginx 接收到 route,直接转给对应的后端服务器。

关于 sticky 的详细的配置过程在
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky

配置说明

upstream stage_app {
  #ip_hash;
  sticky name=ktag expires=10y httponly ;
  server 10.0.0.17:18080 fail_timeout=30s  ;
  server 10.0.0.17:18081 fail_timeout=30s  ;
}

更加详细的配置见官方给予的文档。

封装 docker 思路

  1. 基于 centos7 开始创建镜像。
  2. 在容器中映射所需要的安装文件。
  3. 在容器中编译安装。
  4. 在容器中映射配置文件,日志文件,www 等
  5. 编写 Dockerfile 文件
  6. 将 Dockerfile 编译成镜像
  7. 启动镜像生成容器,提供服务。

中间需要注意的几个点

  1. 模块的源代码需要修改,具体的修改见 delploy 项目
  2. Docker 中 CMD 和 ENTERPOINT 注意执行时间,CMD 是在 docker start 时执行的,可以被 docker 中的命令进行覆盖。
  3. 注意配置文件的映射,以及配置文件中配置的目录。

详见deplop/docker-nginx-stick中配置

关于我
loading