容器化Varnish服务出现Service Unavailable错误排查求助
问题描述
原本在dev容器内正常运行的Varnish服务,单独容器化后无法正常工作。请求流转路径应为:https://loadwebsite.com -> dev容器 -> dev-varnish容器 -> dev容器,浏览器返回503错误:
Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
相关配置文件
varnish.local.php
<?php return [ 'acsi_varnish' => [ 'clients' => [ 'cache' => [ 'endpoint' => [ 'host' => 'dev-varnish', 'port' => '8443', 'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', ], ], ], ], ];
default.vcl
vcl 4.1; backend default { .host = "dev"; .port = "8080"; }
docker-compose-template.yml
version: '3.7' services: dev: image: dev:centos7 container_name: dev hostname: dev volumes: - ${HOST_BIND_MOUNT_DIR}:${CONTAINER_MOUNT_DIR} - /sys/fs/cgroup:/sys/fs/cgroup:ro privileged: true networks: dev-online: ipv4_address: 172.100.0.2 ports: - 443:443 # - 6082:6082 - 9001:9001 - 5672:5672 - 15672:15672 - 29015:29015 extra_hosts: - dev:127.0.0.1 - dev-mysql:172.100.0.3 - dev-mongo-3:172.100.0.4 - dev-mongo-4:172.100.0.5 - dev-solr-6:172.100.0.6 - dev-solr-8:172.100.0.7 - dev-rethinkdb:172.100.0.8 - dev-varnish:172.100.0.10 dev-mysql: image: dev-mysql-5.7:latest container_name: dev-mysql hostname: dev-mysql user: "${V_UID}:${V_GID}" volumes: - ${HOST_BIND_MOUNT_DIR_MYSQL}:${CONTAINER_MOUNT_DIR_MYSQL} networks: dev-online: ipv4_address: 172.100.0.3 ports: - 3306:3306 environment: - MYSQL_ROOT_PASSWORD:${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE:${MYSQL_DATABASE} extra_hosts: - dev:172.100.0.2 - dev-mysql:127.0.0.1 - dev-mongo-3:172.100.0.4 - dev-mongo-4:172.100.0.5 - dev-solr-6:172.100.0.6 - dev-solr-8:172.100.0.7 - dev-rethinkdb:172.100.0.8 - dev-memcached:172.100.0.9 - dev-varnish:172.100.0.10 dev-mongo-3: image: mongo-3.0:dev container_name: dev-mongo-3 hostname: dev-mongo-3 volumes: - ${HOST_BIND_MOUNT_DIR_MONGO_3}:${CONTAINER_MOUNT_DIR_MONGO} privileged: true networks: dev-online: ipv4_address: 172.100.0.4 ports: - 27017:27017 environment: - MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD}" - MYSQL_DATABASE="${MYSQL_DATABASE}" extra_hosts: - dev:172.100.0.2 - dev-mysql:172.100.0.3 - dev-mongo-3:127.0.0.1 - dev-mongo-4:172.100.0.5 - dev-solr-6:172.100.0.6 - dev-solr-8:172.100.0.7 - dev-rethinkdb:172.100.0.8 - dev-memcached:172.100.0.9 - dev-varnish:172.100.0.10 dev-mongo-4: image: mongo-4.4:dev container_name: dev-mongo-4 hostname: dev-mongo-4 user: "${V_UID}:${V_GID}" volumes: - ${HOST_BIND_MOUNT_DIR_MONGO_4}:${CONTAINER_MOUNT_DIR_MONGO} privileged: true networks: dev-online: ipv4_address: 172.100.0.5 ports: - 27018:27017 environment: - MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD}" - MYSQL_DATABASE="${MYSQL_DATABASE}" extra_hosts: - dev:172.100.0.2 - dev-mysql:172.100.0.3 - dev-mongo-3:172.100.0.4 - dev-mongo-4:127.0.0.1 - dev-solr-6:172.100.0.6 - dev-solr-8:172.100.0.7 - dev-rethinkdb:172.100.0.8 - dev-memcached:172.100.0.9 - dev-varnish:172.100.0.10 dev-solr-6: image: solr-6.6:dev container_name: dev-solr-6 hostname: dev-solr-6 networks: dev-online: ipv4_address: 172.100.0.6 ports: - 8983:8983 extra_hosts: - dev:172.100.0.2 - dev-mysql:172.100.0.3 - dev-mongo-3:172.100.0.4 - dev-mongo-4:172.100.0.5 - dev-solr-6:127.0.0.1 - dev-solr-8:172.100.0.7 - dev-rethinkdb:172.100.0.8 - dev-memcached:172.100.0.9 - dev-varnish:172.100.0.10 dev-solr-8: image: solr-8.6:dev container_name: dev-solr-8 hostname: dev-solr-8 user: "${V_UID}:${V_GID}" volumes: - ${HOST_BIND_MOUNT_DIR_SOLR}:${CONTAINER_MOUNT_DIR_SOLR_8} networks: dev-online: ipv4_address: 172.100.0.7 ports: - 8984:8983 environment: - SOLR_HEAP=2g extra_hosts: - dev:172.100.0.2 - dev-mysql:172.100.0.3 - dev-mongo-3:172.100.0.4 - dev-mongo-4:172.100.0.5 - dev-solr-6:172.100.0.6 - dev-solr-8:127.0.0.1 - dev-rethinkdb:172.100.0.8 - dev-memcached:172.100.0.9 - dev-varnish:172.100.0.10 dev-rethinkdb: image: rethinkdb container_name: dev-rethinkdb hostname: dev-rethinkdb user: "${V_UID}:${V_GID}" volumes: - ${HOST_BIND_MOUNT_DIR_RETHINKDB}:${CONTAINER_MOUNT_DIR_RETHINKDB} networks: dev-online: ipv4_address: 172.100.0.8 ports: - 28015:28015 - 8080:8080 extra_hosts: - dev:172.100.0.2 - dev-mysql:172.100.0.3 - dev-mongo-3:172.100.0.4 - dev-mongo-4:172.100.0.5 - dev-solr-6:172.100.0.6 - dev-solr-8:172.100.0.7 - dev-rethinkdb:127.0.0.1 - dev-memcached:172.100.0.9 - dev-varnish:172.100.0.10 dev-memcached: image: memcached container_name: dev-memcached hostname: dev-memcached user: "${V_UID}:${V_GID}" networks: dev-online: ipv4_address: 172.100.0.9 ports: - 11211:11211 extra_hosts: - dev:172.100.0.2 - dev-mysql:172.100.0.3 - dev-mongo-3:172.100.0.4 - dev-mongo-4:172.100.0.5 - dev-solr-6:172.100.0.6 - dev-solr-8:172.100.0.7 - dev-rethinkdb:172.100.0.8 - dev-memcached:127.0.0.1 - dev-varnish:172.100.0.10 dev-varnish: image: varnish:7.2.1-alpine container_name: dev-varnish hostname: dev-varnish user: '0' volumes: - "./default.vcl:/etc/varnish/default.vcl" ports: - "6082:8443" tmpfs: - /var/lib/varnish/varnishd:exec networks: dev-online: ipv4_address: 172.100.0.10 extra_hosts: - dev:172.100.0.2 - dev-mysql:172.100.0.3 - dev-mongo-3:172.100.0.4 - dev-mongo-4:172.100.0.5 - dev-solr-6:172.100.0.6 - dev-solr-8:172.100.0.7 - dev-rethinkdb:172.100.0.8 - dev-varnish:127.0.0.1 - dev-memcached:172.100.0.9 networks: dev-online: driver: bridge ipam: driver: default config: - subnet: 172.100.0.0/24
排查与解决步骤
1. 端口配置不匹配
- 从
varnish.local.php看,dev容器连接dev-varnish用的是8443端口,但Varnish默认监听80(HTTP)和6082(管理端口),你的docker-compose把宿主机6082映射到容器8443,但Varnish容器根本没配置开启8443的HTTPS服务。 - 要么修改
varnish.local.php里的端口为6081(Varnish默认HTTP端口),要么给Varnish容器配置SSL证书并开启8443端口。
2. 后端连接验证
- Varnish的
default.vcl配置后端是dev容器的8080端口,但dev容器的端口映射里没暴露8080,先确认dev容器内的服务确实在8080监听。 - 进入dev-varnish容器,执行
curl http://dev:8080,看能否正常访问后端服务,如果不通,说明网络或后端服务有问题。
3. Varnish启动参数修正
- 默认Varnish启动命令没指定正确的监听端口,你映射了8443但容器没开这个端口。需要在docker-compose的dev-varnish服务里添加command参数:
如果要开启HTTPS,需额外配置SSL,比如:command: varnishd -f /etc/varnish/default.vcl -a :80 -T :6082
同时挂载SSL证书文件到容器内。command: varnishd -a :443,ssl,http2 -f /etc/varnish/default.vcl -T :6082 -S /etc/varnish/secret -w 2,50,300
4. 容器网络连通性检查
- 在dev容器里执行
ping dev-varnish,在dev-varnish容器里执行ping dev,确认双向网络连通。 - 在dev容器里执行
curl http://dev-varnish:6081(默认HTTP端口),检查能否访问Varnish服务。
5. 查看Varnish日志定位问题
- 进入dev-varnish容器,执行
varnishlog,实时查看请求日志,能直接看到请求失败的具体原因(比如后端连接超时、端口不通等)。
内容的提问来源于stack exchange,提问作者Rajsekar Reddy
相关产品推荐
相关产品推荐

