1. Kiểm tra container cloudflared / web app có đang chạy không
Bash
docker ps # Xem container nào đang chạy
docker ps -a # Xem tất cả, kể cả stopped/exitedNếu container cloudflared hoặc container web (nginx, node, php-fpm…) bị exited → lỗi 502 gần như chắc chắn từ đó.
2. Xem log của cloudflared (quan trọng nhất)
Bash
# Nếu dùng docker run
docker logs <tên_container_hoặc_ID_cloudflared> --tail 100
# Nếu dùng docker-compose
docker-compose logs -f cloudflaredCác lỗi thường gặp trong log cloudflared:
- level=error msg="Unable to reach the origin service" → Cloudflare không kết nối được tới container backend
- connection with proxy lost, dial tcp 172.x.x.x:port: connection refused → Backend từ chối kết nối
- HTTP status 502 hoặc 502 trong log → Backend trả về lỗi
3. Kiểm tra container backend có listen đúng port & IP không
Nhiều người để app chỉ bind 127.0.0.1 → cloudflared trong container khác không kết nối được.
Bash
# Vào container backend kiểm tra
docker exec -it <tên_container_backend> bash
# Ví dụ với Nginx
netstat -tlnp | grep :80
# hoặc
ss -tlnp | grep :80Phải thấy:
text
LISTEN 0.0.0.0:80 hoặc :::80Nếu chỉ thấy 127.0.0.1:80 → sửa lại config để listen 0.0.0.0
4. Kiểm tra kết nối từ container cloudflared tới backend
Bash
# Vào container cloudflared
docker exec -it <cloudflared_container> sh
# Thử curl tới backend (thay bằng địa chỉ thực tế trong docker network)
curl -v http://172.18.0.x:80
curl -v http://backend-container-name:8000
curl -v http://host.docker.internal:8080 # nếu dùng host networkNếu curl bị timeout hoặc connection refused → lỗi mạng Docker.
5. Kiểm tra Docker network
Bash
docker network ls
docker network inspect <tên_network>Khuyến nghị:
- Cả cloudflared và backend cùng nằm trên một network user-defined
- Không dùng network mode: host cho cloudflared (dễ lỗi với Cloudflare Warp)
Ví dụ docker-compose tốt:
YAML
services:
cloudflared:
image: cloudflare/cloudflared
networks:
- mynet
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=xxx
web:
image: nginx:latest
networks:
- mynet
ports:
- "8080:80" # không cần expose ra host nếu chỉ cloudflared truy cập
networks:
mynet:
driver: bridge6. Các nguyên nhân phổ biến & cách fix nhanh
| Nguyên nhân | Cách fix nhanh |
|---|---|
| Backend chỉ listen 127.0.0.1 | Sửa config listen 0.0.0.0 |
| Docker network khác nhau | Đưa chung vào 1 network |
| Backend port sai trong tunnel config | Kiểm tra file config.yml hoặc --url |
| cloudflared restart liên tục | Xem log → thường do token sai hoặc origin unreachable |
| Dùng network_mode: host cho cloudflared | Đổi sang bridge + dùng host.docker.internal hoặc internal IP |
| CPU/RAM hết → container bị kill | docker stats → tăng RAM/CPU |
7. Lệnh tổng hợp nhanh để debug (copy-paste)
Bash
echo "=== Container status ===" && docker ps -a --filter "name=cloudflare"
echo "=== Cloudflared log last 50 lines ===" && docker logs --tail 50 $(docker ps -q --filter "name=cloudflare") 2>/dev/null
echo "=== Backend listening on? ===" && docker exec <backend_container> ss -tlnp
echo "=== Test connection from cloudflared ===" && docker exec $(docker ps -q --filter "name=cloudflare") curl -m 5 -v http://<backend>:portChạy 4 lệnh trên là 90% biết ngay lỗi nằm ở đâu.
0 comments:
Post a Comment