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):
- 客户端首次发起请求,请求头未带 route 的 cookie。nginx 接收请求,发现请求头没有 route,则以轮询方式将请求分配给后端服务器。
- 后端服务器处理完请求,将响应头和内容返回给 nginx。
- nginx 生成 route 的 cookie,返回给客户端。route 的值与后端服务器对应,可能是明文,也可能是 md5、sha1 等 Hash 值。
- 客户端接收请求,并创建 route 的 cookie。
- 客户端再次发送请求时,带上 route。
- 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 思路
- 基于 centos7 开始创建镜像。
- 在容器中映射所需要的安装文件。
- 在容器中编译安装。
- 在容器中映射配置文件,日志文件,www 等
- 编写 Dockerfile 文件
- 将 Dockerfile 编译成镜像
- 启动镜像生成容器,提供服务。
中间需要注意的几个点
- 模块的源代码需要修改,具体的修改见 delploy 项目
- Docker 中 CMD 和 ENTERPOINT 注意执行时间,CMD 是在 docker start 时执行的,可以被 docker 中的命令进行覆盖。
- 注意配置文件的映射,以及配置文件中配置的目录。
详见deplop/docker-nginx-stick
中配置