Chuyển đến nội dung chính (Skip to content)
Mục lục bài viết
Nginx

Cấu hình NGINX reverse proxy cho gRPC

Cấu hình NGINX reverse proxy cho gRPC

Đị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.

Sơ đồ kiểm tra nginx grpc reverse proxy
Hai nhánh kiểm tra ban đầu: tls hoặc http/2 chưa đúng hoặc kết nối được nhưng rpc lỗi. Chạm vào hình để mở bản lớn.

1. Tổng quan về gRPC trong kiến trúc microservices hiện đại

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.

Minh họa gRPC client → NGINX gateway → gRPC service
Luồng khái niệm: gRPC client → NGINX gateway → gRPC service. Chạm vào hình để mở bản lớn.

2. Tại sao chọn NGINX làm Gateway và reverse proxy cho gRPC?

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:

  • Chấm dứt mã hóa SSL/TLS (SSL Termination): NGINX tiếp nhận kết nối TLS an toàn từ Internet, giải mã và chuyển tiếp lưu lượng nội bộ dạng plaintext tới các microservices phía sau, giúp giảm đáng kể gánh nặng tính toán CPU cho các service backend.
  • Cân bằng tải các luồng RPC (Stream-level Load Balancing): Vì gRPC sử dụng một kết nối TCP duy nhất cho hàng nghìn request, các load balancer ở tầng L4 (như AWS NLB) sẽ gửi toàn bộ kết nối TCP vào một máy chủ duy nhất. NGINX là L7 Proxy có khả năng phân phối từng frame RPC riêng lẻ tới các backend khác nhau.
  • Định tuyến linh hoạt (Content-based Routing): Phân chia lưu lượng tới các microservices khác nhau dựa trên đường dẫn gói tin Protobuf (Package/Service name).
  • Bảo mật tập trung: Áp dụng Rate Limiting, xác thực mTLS và kiểm soát quyền truy cập tại một điểm duy nhất.

3. Yêu cầu tiền đề trên Ubuntu 24.04 LTS

Để hỗ trợ gRPC, NGINX cần đáp ứng các điều kiện kỹ thuật sau:

  • Phiên bản NGINX từ 1.13.10 trở lên (bản NGINX Mainline cài đặt trên Ubuntu 24.04 theo hướng dẫn ở Bài 1 hoàn toàn thỏa mãn).
  • Module ngx_http_grpc_module được tích hợp sẵn theo mặc định.
  • Chứng chỉ bảo mật SSL/TLS hợp lệ (bắt buộc vì HTTP/2 trên trình duyệt và các thư viện gRPC chuẩn luôn yêu cầu kết nối an toàn).

4. Cấu hình chi tiết NGINX reverse proxy với chỉ thị grpc_pass

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;
    }
}

5. định tuyến linh hoạt theo Protobuf Package và Service

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;
    }
}

6. Tối ưu hóa cho gRPC Streaming hai chiều

Đố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;
}

7. Kiểm tra và debug kết nối với công cụ grpcurl

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.

Nguồn đối chiếu và kiểm tra trước khi áp dụng

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ử.

Tìm hiểu thêm

Xem toàn bộ lộ trình Nginx