Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

GRPC_PROXY_ERROR Linux / DevOps

Настройка балансировщика gRPC трафика на базе Nginx: модуль ngx_http_grpc_module

Обновлено: 21.08.2026
  • Клиенты 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 nginx

5. Тестирование с помощью grpcurl

grpcurl -proto service.proto grpc.example.com:443 package.ServiceName/MethodName
💡 Практика специалистов: Для эффективного распределения нагрузки на upstream используйте алгоритм least_conn или random with two choices, так как стандартный round-robin может перегрузить одну ноду при долгих streaming RPC.

Частые вопросы (FAQ)

В чем разница между grpc:// и grpcs:// в директиве grpc_pass?

grpc:// проксирует расшифрованный трафик на локальный микросервис в открытом виде (h2c), а grpcs:// выполняет TLS шифрование между Nginx и бэкендом (mTLS).

Почему стандартный L4 балансировщик плохо балансирует gRPC?

gRPC мультиплексирует сотни одновременных RPC-вызовов внутри одного постоянного TCP-соединения. Балансировщик L4 перенаправляет весь TCP-сокет на один сервер, создавая перекос нагрузки. Nginx работает на уровне L7 и распределяет индивидуальные gRPC-стримы.

Полезные материалы
Рекомендуем