如何在Docker Swarm中配置HAProxy通过SSL自动路由流量到复制服务
配置修正方案
现有配置的核心问题
- docker-compose.yml 配置错误
- HAProxy 挂载的
haproxy.cfg使用了命名卷而非本地文件挂载,你本地修改的配置无法同步到容器内 - HAProxy 端口映射逻辑与内部监听端口不匹配,同时未挂载SSL证书文件
- node-server 不需要映射8080端口到宿主机,集群内通过overlay网络可直接通信
- HAProxy 挂载的
- haproxy.cfg 配置错误
- 前端监听端口与docker-compose映射的容器端口不匹配,未配置SSL证书加载逻辑
- 后端地址写死为127.0.0.1:8000,无法指向Swarm集群内的node-server服务,也适配不了多副本的服务发现
- 未适配node-server本身是HTTPS服务的特性,后端请求需要兼容HTTPS协议
调整后的配置
1. 前置准备
将你的SSL证书(公钥+私钥合并为单个PEM格式文件)放在manager节点的配置目录下,命名为haproxy.pem,和docker-compose.yml、haproxy.cfg存放在同一目录。
2. 修改后的docker-compose.yml
version: '3.9' services: proxy: image: haproxy:latest ports: - 443:443 volumes: # 本地配置文件挂载到容器内 - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg # SSL证书挂载 - ./haproxy.pem:/etc/haproxy/certs/haproxy.pem deploy: placement: constraints: [node.role == manager] networks: - servers-network node-server: image: glusk/hackathon-2021:latest command: npm run server deploy: mode: replicated replicas: 2 networks: - servers-network networks: servers-network: driver: overlay # 开启服务发现自动解析 attachable: true
3. 修改后的haproxy.cfg
global daemon maxconn 256 # 配置SSL证书默认加密套件 ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend https-in # 绑定443端口并加载SSL证书 bind *:443 ssl crt /etc/haproxy/certs/haproxy.pem default_backend servers backend servers # 后端服务走HTTPS协议,node-server为自签证书时添加verify none跳过校验,可信证书可删除该参数 server-template node-server 2 node-server:8080 check ssl verify none maxconn 32
部署操作
- 登录manager节点,确认三个配置文件(docker-compose.yml、haproxy.cfg、haproxy.pem)都在当前目录
- 先删除之前错误部署的栈:
docker stack rm hackathon-2021
- 等待10秒左右资源释放后重新部署:
docker stack deploy --compose-file=docker-compose.yml hackathon-2021
- 验证服务状态:
# 查看栈服务状态 docker stack services hackathon-2021 # 查看HAProxy日志确认无报错 docker logs -f $(docker ps -q -f name=hackathon-2021_proxy)
内容的提问来源于stack exchange,提问作者Janez Kuhar
相关产品推荐
相关产品推荐

