Hôm qua tui ngồi debug cái web lỗi 502 một hồi, cảm giác như đầu sắp nổ tung luôn. Mấy anh em dev lâu năm hay bảo nhau rằng Apache là ông già cứng cỏi, chạy chậm chạp nhưng ổn định như "tấm khiên", còn Nginx thì như một tay đua xe thể thao, nhanh lẹ nhưng đòi hỏi kỹ năng cao hơn để điều khiển. Trước đây tui chỉ biết dùng Nginx làm reverse proxy để giấu đi API backend, nhưng hôm nay tui mới thực sự thấm thía sức mạnh của nó khi làm load balancing.
Câu chuyện bắt đầu khi server chính của team bị treo vì một request nặng, toàn bộ site "treo" theo. Tui quyết định setup lại kiến trúc: thay vì để một Nginx gánh hết traffic, tui dùng chính nó để phân phối load cho 3 instance backend. Cái hay là tui không cần viết code phức tạp, chỉ cần cấu hình một xíu là xong.
Đoạn config trong file nginx.conf tui vừa chỉnh sửa nhìn đơn giản mà hiệu quả ngất ngưởng:
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Thật ra, dùng least_conn (kết nối ít nhất) thay cho mặc định round-robin giúp tui giải quyết được vấn đề khi các server backend có cấu hình phần cứng không đồng đều. Nếu một máy yếu hơn, nó sẽ nhận ít request hơn, tránh tình trạng "ngập" mà tui hay gặp trước đây.
Nhiều người vẫn thích Apache vì cấu hình .htaccess quá tiện, nhưng đối với việc làm reverse proxy ở quy mô lớn, tui thấy Apache hơi "nặng nề". Nginx với kiến trúc event-driven của nó xử lý hàng nghìn kết nối đồng thời mà RAM không tăng vọt như Apache. Tui nhớ lần trước chạy Apache, CPU bị full 100% ngay khi có 2000 người cùng online, còn Nginx thì cứ thản nhiên chạy như không có gì xảy ra.
Tóm lại, nếu bạn đang làm project nhỏ, Apache vẫn rất tốt và dễ setup. Nhưng nếu muốn xây dựng hệ thống scalable, chịu tải cao, thì việc hiểu rõ cách Nginx làm reverse proxy và load balancing là bắt buộc. Đừng sợ code config, hiểu logic rồi thì việc này cũng không khó như nghĩ đâu. Ai đang đau đầu vì server bị overload thì thử setup thử nhé!