基于docker的Haproxy的热发布配置
为什么想写这个,因为最近继续研究haproxy,突然想到如果能实现热发布,配合haproxy的超强代理配置,那么可以实现的功能就更加丰富了
- 项目目录结构
haproxy-demo/ ├── docker-compose.yml ├── Dockerfile.haproxy ├── haproxy.cfg ├── setup.sh ├── reload.sh ├── web1/ │ └── index.html └── web2/ └── index.html - 操作流程
- 创建文件
mkdir haproxy-demo && cd haproxy-demo - 初始化页面内容, vim setup.sh, 内容如下
mkdir -p web1 web2 echo "<h1>Web Server 1</h1>" > web1/index.html echo "<h1>Web Server 2</h1>" > web2/index.html chmod +x ./setup.sh - 添加haproxy配置, vim haproxy.cfg
global log stdout local0 maxconn 4096 defaults mode http log global option httplog timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend stats bind *:8404 stats enable stats uri /stats stats refresh 30s frontend web_frontend bind *:80 http-response add-header X-Load-Balancer "HAProxy" # 自定义信息 http-response add-header X-Server-Version "v1.0" 自定义信息 default_backend web_servers backend web_servers balance roundrobin option httpchk GET / http-response set-header X-Backend-Server v8 自定义信息 server web1 web1:80 check server web2 web2:80 check - 添加docker compose 内容, vim docker-compose.yml
services: haproxy: build: context: . dockerfile: Dockerfile.haproxy container_name: haproxy ports: - "8081:80" - "8404:8404" volumes: - haproxy_config:/usr/local/etc/haproxy restart: unless-stopped command: ["haproxy", "-f", "/usr/local/etc/haproxy/haproxy.cfg", "-W"] web1: image: nginx:alpine container_name: web1 volumes: - ./web1:/usr/share/nginx/html web2: image: nginx:alpine container_name: web2 volumes: - ./web2:/usr/share/nginx/html volumes: haproxy_config: - 添加 Dockerfile 内容, vim Dockerfile.haproxy
FROM haproxy:latest # 复制配置文件到镜像中 COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg # 下面两个暂时不要 # 确保配置文件权限正确 #RUN chmod 644 /usr/local/etc/haproxy/haproxy.cfg # 验证配置文件语法 #RUN haproxy -f /usr/local/etc/haproxy/haproxy.cfg -c - 启动docker服务
1.先执行 ./setup.sh 2.$ docker-compose up -d --build - 查看服务
$ docker ps 2eb152e70d82 nginx:alpine "/docker-entrypoint.…" 23 minutes ago Up 22 minutes 80/tcp web1 46eb39650f05 nginx:alpine "/docker-entrypoint.…" 23 minutes ago Up 22 minutes 80/tcp web2 d1d99bae1a4b haproxy-demo-haproxy "docker-entrypoint.s…" 23 minutes ago Up 22 minutes 0.0.0.0:8404->8404/tcp, :::8404->8404/tcp, 0.0.0.0:8081->80/tcp, :::8081->80/tcp haproxy - 页面法访问
http://localhost:8081/ 可以看到 Response Headers 有如下自定义字段 X-Backend-Server:v8 X-Load-Balancer:HAProxy X-Server-Version:v1.0 - 修改haproxy.cfg的配置信息, 比如 v8 改为v9
- 重点来了,通过haproxy的热启动,让配置生效,脚本 reload.sh 如下
#!/bin/bash # HAProxy配置热重启脚本 # 用法: chmod +x, ./reload.sh echo "🔄 HAProxy配置热重启开始..." # 1. 复制配置文件到容器 echo "📝 复制配置文件到容器..." if docker cp haproxy.cfg haproxy:/usr/local/etc/haproxy/haproxy.cfg; then echo "✅ 配置文件复制成功" else echo "❌ 配置文件复制失败" exit 1 fi # 2. 发送热重启信号 echo "🔥 发送热重启信号..." if docker-compose kill -s HUP haproxy; then echo "✅ 热重启信号发送成功" else echo "❌ 热重启信号发送失败" exit 1 fi # 3. 等待一下让重启完成 echo "⏳ 等待重启完成..." sleep 2 # 4. 验证配置是否生效 echo "🔍 验证配置..." echo "响应头信息:" curl -s -I http://localhost:8081 | grep -E "(HTTP|X-|Server)" echo "" echo "🎉 HAProxy配置热重启完成!" echo "💡 访问 http://localhost:8081 测试服务" echo "📊 访问 http://localhost:8404/stats 查看状态"- 再次页面法访问
http://localhost:8081/ 可以看到 Response Headers 有如下自定义字段 X-Backend-Server:v9 #内容发生变化 X-Load-Balancer:HAProxy X-Server-Version:v1.0
- 创建文件
- 为什么要使用这种方式,因为和docker的两种挂载方式有关,我会单独开一篇讲解二者的不同
