指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
基于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的两种挂载方式有关,我会单独开一篇讲解二者的不同