
Bài 7: Cấu hình NGINX load balancing và duy trì phiên
Thiết lập upstream, kiểm tra lỗi thụ động và giới hạn retry; phân biệt định tuyến theo IP, cookie và lưu session tập trung trong cụm backend.

Định tuyến dịch vụ gRPC qua NGINX, phân biệt kết nối TLS đến upstream, cấu hình timeout cho streaming và kiểm tra bằng grpcurl.
Trước khi bắt đầu. Ví dụ dùng gRPC qua HTTP/2 với TLS tại gateway. Phải kiểm tra riêng chặng client–NGINX và NGINX–service; browser dùng gRPC-Web có yêu cầu khác với client gRPC trực tiếp.

Trong các kiến trúc Microservices phân tán quy mô lớn, việc giao tiếp giữa các dịch vụ (Inter-service Communication) bằng giao thức RESTful JSON truyền thống thường bộc lộ những hạn chế về độ trễ mạng và mức tiêu hao tài nguyên CPU do việc tuần tự hóa (Serialization) và giải tuần tự hóa (Deserialization) chuỗi JSON dạng văn bản.
gRPC dùng Protocol Buffers và hỗ trợ các kiểu RPC, bao gồm streaming. Trong mô hình trực tiếp ở bài này, HTTP/2 mang lưu lượng giữa client, gateway và service. Lợi ích hiệu năng phụ thuộc payload, triển khai và điều kiện mạng; cần benchmark cùng tải để so với API khác.

Mặc dù gRPC client có thể kết nối trực tiếp tới gRPC server, việc đưa NGINX vào vị trí cổng vào (API Gateway) mang lại những lợi ích then chốt:
Để hỗ trợ gRPC, NGINX cần đáp ứng các điều kiện kỹ thuật sau:
ngx_http_grpc_module được tích hợp sẵn theo mặc định.Tạo file cấu hình mới /etc/nginx/conf.d/grpc-gateway.conf:
upstream grpc_backend_servers {
# Cân bằng tải theo số lượng kết nối gRPC ít nhất
least_conn;
server 10.0.0.21:50051;
server 10.0.0.22:50051;
keepalive 64;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name grpc.example.com;
# BẮT BUỘC: gRPC chỉ hoạt động trên nền giao thức HTTP/2
http2 on;
ssl_certificate /etc/letsencrypt/live/grpc.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grpc.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
access_log /var/log/nginx/grpc.access.log;
error_log /var/log/nginx/grpc.error.log warn;
location / {
# Chuyển tiếp lưu lượng sang cụm Upstream bằng giao thức gRPC
grpc_pass grpc://grpc_backend_servers;
# Cấu hình các tham số timeout quan trọng cho kết nối dài
grpc_connect_timeout 5s;
grpc_read_timeout 120s;
grpc_send_timeout 120s;
# Bộ đệm dữ liệu RPC
grpc_buffer_size 32k;
# Truyền thông tin địa chỉ IP thực của client vào gRPC metadata
grpc_set_header X-Real-IP $remote_addr;
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
grpc_set_header Host $host;
}
}
Trong đặc tả gRPC, đường dẫn URL HTTP/2 của một request luôn tuân theo quy ước cố định:
/{package_name}.{service_name}/{method_name}
Nhờ quy ước này, bạn có thể dễ dàng phân tách lưu lượng tới các cụm microservices độc lập trên cùng một tên miền duy nhất:
# Cụm microservice quản lý người dùng
upstream auth_service {
server 10.0.0.31:50051;
}
# Cụm microservice xử lý đơn hàng
upstream order_service {
server 10.0.0.32:50052;
}
server {
listen 443 ssl;
http2 on;
server_name api.example.com;
...
# Định tuyến các RPC thuộc package user sang Auth Service
location /user.UserService/ {
grpc_pass grpc://auth_service;
grpc_read_timeout 30s;
}
# Định tuyến các RPC thuộc package order sang Order Service
location /order.OrderService/ {
grpc_pass grpc://order_service;
grpc_read_timeout 60s;
}
}
Đối với các tính năng truyền phát dữ liệu trực tiếp theo thời gian thực (như chat, giám sát telemetries, streaming dữ liệu tài chính), gRPC duy trì kết nối luồng mở liên tục giữa client và server.
grpc_socket_keepalive on bật TCP keepalive cho kết nối upstream, không phải lệnh tắt buffering. Các timeout đọc/ghi là thời gian chờ giữa những thao tác liên tiếp; chúng không phải giới hạn tổng thời lượng của RPC.
location /streaming.StreamService/ {
grpc_pass grpc://streaming_backend;
# Bat TCP keepalive cho ket noi upstream
grpc_socket_keepalive on;
grpc_read_timeout 3600s; # Thoi gian cho giua hai lan doc lien tiep
grpc_send_timeout 3600s;
}
Tương tự như lệnh curl dành cho REST API, công cụ grpcurl là trợ thủ đắc lực nhất để các kỹ sư hệ thống tương tác và kiểm tra dịch vụ gRPC từ dòng lệnh terminal.
Cài đặt grpcurl trên Linux:
# Cài đặt qua Go hoặc tải binary phát hành
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
Liệt kê các dịch vụ gRPC đang mở thông qua NGINX Gateway:
grpcurl grpc.example.com:443 list
Thực thi một lời gọi RPC và nhận phản hồi JSON:
grpcurl -d '{"user_id": "12345"}' -proto user.proto grpc.example.com:443 user.UserService/GetUserProfile
Nếu kết quả trả về dữ liệu người dùng thành công, bạn đã hoàn tất việc thiết lập cổng giao tiếp gRPC Gateway hiệu năng cao, bảo mật và sẵn sàng cho kiến trúc Microservices hiện đại.
Như vậy, chúng ta đã hoàn thành trọn vẹn lộ trình 10 bài học chuyên sâu về NGINX từ cơ bản đến kiến trúc hạ tầng nâng cao, tạo nên nền tảng vững chắc cho mọi hệ thống phân tán trong thực tế.
Dùng grpc:// cho upstream không TLS trong vùng mạng phù hợp. Nếu upstream dùng TLS, chọn grpcs://, cấu hình CA tin cậy, xác minh chứng chỉ và tên máy chủ. Lệnh grpcurl host:443 list cần server reflection; nếu service không bật reflection, cung cấp file -proto hoặc -protoset.
Các địa chỉ example.com, IP riêng và đường dẫn trong ví dụ cần thay theo môi trường thực tế. Các sơ đồ trong bài là minh họa khái niệm, không phải bằng chứng thử nghiệm trên hệ thống của bạn.
Trước khi áp dụng: sao lưu file cấu hình bị đổi, chạy sudo nginx -t, chỉ reload khi kiểm tra thành công, rồi xác nhận endpoint, error log và chức năng ứng dụng. Nếu lỗi xuất hiện, phục hồi file đã sao lưu, kiểm tra cú pháp và reload lại; không xóa hàng loạt cấu hình để thử.

Thiết lập upstream, kiểm tra lỗi thụ động và giới hạn retry; phân biệt định tuyến theo IP, cookie và lưu session tập trung trong cụm backend.

Chọn kho gói phù hợp, cài NGINX, mở cổng web và kiểm tra dịch vụ trên Ubuntu 24.04 hoặc Rocky Linux 9. Có lưu ý riêng cho Debian và SELinux.

Cấp chứng chỉ HTTPS với Certbot, kiểm tra DNS và HTTP-01, thử gia hạn tự động và cấu hình TLS phù hợp trước khi bật HSTS.

Kiểm tra module, thư viện TLS và cổng UDP 443 trước khi bật HTTP/3; cấu hình HTTP/2 và xác nhận giao thức thực tế từ phía máy khách.