Nỗi ám ảnh mang tên “Conflict Port”
Bạn đã bao giờ rơi vào cảnh dở khóc dở cười khi deploy 3-4 website lên cùng một VPS chưa? Website A đòi chiếm port 80, Website B cũng không vừa khi muốn port tương tự. Cuối cùng, bạn đành ngậm ngùi để Web B chạy ở port 8081. Khách hàng truy cập cứ phải gõ thêm cái đuôi lằng nhằng, trông vừa thiếu chuyên nghiệp vừa kém bảo mật.
Hồi mình mới làm dự án cho một shop quần áo, mình từng loay hoay cấu hình Nginx thủ công. Cứ mỗi lần thêm một landing page mới, mình lại phải SSH vào server, sửa file nginx.conf rồi reload. Có lần mình gõ thiếu đúng một dấu chấm phẩy (;), Nginx lăn đùng ra chết. Cả hệ thống sập suốt 15 phút ngay lúc khách đang chạy quảng cáo nghìn đơn. Sau cú sốc đó, mình thề phải tìm bằng được một giải pháp tự động. Và Traefik xuất hiện như một cứu cánh.
Lên bàn cân: Traefik có gì hơn Nginx?
Trước khi bắt tay vào gõ lệnh, hãy cùng xem tại sao Traefik lại đang trở thành tiêu chuẩn mới cho dân DevOps:
- Nginx truyền thống: Hiệu năng cực tốt nhưng lại rất “thủ công mỹ nghệ”. Bạn phải viết file config cho từng domain và tự setup Certbot để gia hạn SSL mỗi 90 ngày.
- Nginx Proxy Manager (NPM): Có giao diện Web UI khá thân thiện. Tuy nhiên, nếu bạn muốn quản lý 20-30 container bằng code (Infrastructure as Code) thì UI lại trở thành rào cản lớn.
- Traefik Proxy: Đây là hàng chuyên dụng cho Docker. Nó không bắt bạn viết file config dài dằng dặc. Thay vào đó, Traefik tự lắng nghe Docker Socket để biết khi nào có container mới vừa “mọc” lên.
Triết lý “Configuration Discovery” cực hay
Điểm ăn tiền nhất của Traefik chính là khả năng tự phát hiện dịch vụ. Thay vì bạn phải khai báo với Proxy, Traefik sẽ chủ động hỏi Docker: “Có dịch vụ nào mới không?”.
Lúc này, container chỉ cần dán một cái nhãn (label) đại loại như: “Tôi là app.com”. Traefik sẽ tự động tạo đường ống dẫn traffic và đi xin chứng chỉ SSL từ Let’s Encrypt. Mọi thứ diễn ra hoàn toàn tự động trong chưa đầy 10 giây.
Triển khai Traefik thực chiến
Bạn cần chuẩn bị một VPS sạch, đã cài Docker và một domain đã trỏ bản ghi A về IP server.
Bước 1: Tạo mạng lưới kết nối
Chúng ta tạo một mạng ảo để Traefik có thể “nói chuyện” với các container khác trong môi trường cách ly.
docker network create web_proxy
Bước 2: Cấu hình File thực thi
Tạo thư mục traefik và file docker-compose.yml. Đây là trái tim của hệ thống:
version: '3.8'
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=admin@yourdomain.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
networks:
- web_proxy
Hãy lưu ý dòng exposedbydefault=false. Nó giúp bảo vệ server của bạn. Chỉ những container nào bạn cho phép rõ ràng thì Traefik mới công khai ra internet.
Bước 3: Deploy app và hưởng thụ thành quả
Thử chạy một ứng dụng web đơn giản. Bạn không cần sửa bất kỳ file config nào của Traefik nữa. Chỉ cần thêm vài dòng labels vào file app của bạn:
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`blog.cuaban.com`)"
- "traefik.http.routers.myapp.entrypoints=websecure"
- "traefik.http.routers.myapp.tls.certresolver=myresolver"
Ngay sau khi lệnh up -d thực thi, Traefik sẽ tự động cấp SSL. Bạn truy cập domain sẽ thấy ổ khóa xanh hiện lên ngay lập tức.
Vài lưu ý “xương máu” để tránh ăn hành
Dưới đây là những lỗi phổ biến mà mình từng mất cả đêm để debug:
- Quyền hạn file acme.json: Traefik rất kỹ tính về bảo mật. File lưu SSL phải có quyền
600. Nếu bạn để quyền777, Traefik sẽ log lỗi “permissions are too open” và từ chối chạy. - Giới hạn của Let’s Encrypt: Đừng restart container quá nhiều lần trong lúc cấu hình sai. Let’s Encrypt có thể khóa IP của bạn trong vài giờ nếu gửi yêu cầu cấp SSL lỗi liên tục.
- Dashboard: Nếu bật Dashboard (port 8080), hãy nhớ dùng
Basic Auth. Đừng để lộ sơ đồ hệ thống cho hacker xem miễn phí.
Lời kết
Chuyển từ Nginx sang Traefik giống như việc bạn nâng cấp từ xe số lên xe tay ga vậy. Lúc đầu có thể hơi lạ lẫm với cách cấu hình bằng nhãn (labels), nhưng khi đã quen, bạn sẽ thấy nó cực kỳ nhàn. Nó giúp bạn tập trung vào việc phát triển sản phẩm thay vì ngồi fix lỗi proxy mỗi đêm.
Nếu bạn đang vận hành microservices, hãy thử Traefik ngay. Chúc các bạn có những hệ thống chạy mượt mà!

