Настройка балансировщика gRPC трафика на базе Nginx: модуль ngx_http_grpc_module
- Клиенты gRPC получают статус ошибки
UNAVAILABLE (14): Socket closedилиINTERNAL (13): RST_STREAM. - Попытка проксировать gRPC через обычный
proxy_passприводит к сбросу потоков (gRPC требует чистый транспорт HTTP/2). - Отсутствие балансировки вызовов (RPC Calls) внутри одного постоянного TCP-соединения.
1. Архитектура проксирования gRPC в Nginx
gRPC работает исключительно поверх HTTP/2. Для его корректной обработки Nginx должен слушать порт с флагом http2 и использовать модуль grpc_pass.
2. Конфигурация Upstream пула gRPC сервисов
В /etc/nginx/conf.d/grpc.conf:
upstream grpc_backend {
# Балансировка по наименьшему числу подключений
least_conn;
server 10.0.1.10:50051;
server 10.0.1.11:50051;
}3. Конфигурация виртуального хоста с SSL и HTTP/2
server {
listen 443 ssl http2;
server_name grpc.example.com;
ssl_certificate /etc/letsencrypt/live/grpc.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grpc.example.com/privkey.pem;
# Логирование gRPC статусов
access_log /var/log/nginx/grpc_access.log combined;
error_log /var/log/nginx/grpc_error.log info;
location / {
# Проксирование gRPC запросов
grpc_pass grpc://grpc_backend;
# Для зашифрованного gRPC бэкенда (mTLS):
# grpc_pass grpcs://grpc_backend;
grpc_set_header Host $host;
grpc_set_header X-Real-IP $remote_addr;
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Таймауты для длинных gRPC стримов
grpc_read_timeout 300s;
grpc_send_timeout 300s;
}
}4. Валидация и перезагрузка
nginx -t && systemctl reload nginx5. Тестирование с помощью grpcurl
grpcurl -proto service.proto grpc.example.com:443 package.ServiceName/MethodName Частые вопросы (FAQ)
В чем разница между grpc:// и grpcs:// в директиве grpc_pass?
grpc:// проксирует расшифрованный трафик на локальный микросервис в открытом виде (h2c), а grpcs:// выполняет TLS шифрование между Nginx и бэкендом (mTLS).
Почему стандартный L4 балансировщик плохо балансирует gRPC?
gRPC мультиплексирует сотни одновременных RPC-вызовов внутри одного постоянного TCP-соединения. Балансировщик L4 перенаправляет весь TCP-сокет на один сервер, создавая перекос нагрузки. Nginx работает на уровне L7 и распределяет индивидуальные gRPC-стримы.