MAATRIX / Блог / gRPC-сервис на собственном VPS

gRPC-сервис на собственном VPS

Блог MAATRIX · 2026-07-07

gRPC даёт быстрый бинарный протокол поверх HTTP/2 — идеально для микросервисов и мобильных бэкендов. Разберём, как развернуть gRPC-сервис на VPS, закрыть его TLS и пробросить через nginx.

Почему gRPC требует нормального сервера

['gRPC работает поверх HTTP/2 с постоянными мультиплексированными соединениями. Это значит, что каждый долгоживущий стрим держит ресурсы, а сериализация protobuf нагружает CPU. На дешёвом shared-хостинге такое просто не запустить — нужен root и полноценное ядро.', 'Для gRPC критична производительность на ядро: сериализация/десериализация protobuf и TLS-хендшейки любят быстрый одноядерный throughput. На тарифах MAATRIX стоят AMD EPYC + NVMe, поэтому даже базовый план тянет тысячи RPS без просадок по latency.', 'Ещё одна причина брать VPS, а не облачную функцию: gRPC-стримы бывают двунаправленными и живут минутами. Serverless-платформы режут время выполнения и рвут долгие соединения, а на своём сервере вы сами задаёте таймауты, keepalive и лимиты дескрипторов. Для аудитории из России добавляется практичный плюс — зарубежный сервер в UK или США с оплатой картой РФ, СБП или криптой, когда обычные иностранные провайдеры карту просто не принимают.', "
  • Root-доступ — нужен для systemd, портов и TLS-сертификатов.
  • HTTP/2 end-to-end — прокси обязан уметь grpc_pass.
  • Статический IP — чтобы повесить домен и Let's Encrypt.
"]

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для gRPC

Готовим окружение

['Возьмём Ubuntu 22.04/24.04. Обновляемся и ставим базовые пакеты:', '
apt update && apt upgrade -y\napt install -y build-essential curl git nginx
', 'Поставим Go как пример рантайма для gRPC-сервера (аналогично можно взять Python/Node):', "
curl -LO https://go.dev/dl/go1.22.5.linux-amd64.tar.gz\nrm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz\necho 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile\nsource /etc/profile\ngo version
", 'Для генерации кода из .proto понадобится protoc и плагины:', '
apt install -y protobuf-compiler\ngo install google.golang.org/protobuf/cmd/protoc-gen-go@latest\ngo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
']

Запуск сервиса через systemd

['Собираем бинарник и кладём его в /opt/grpcapp/server. Демонизируем через systemd, чтобы сервис поднимался после ребута:', "
cat > /etc/systemd/system/grpcapp.service <<'EOF'\n[Unit]\nDescription=gRPC service\nAfter=network.target\n\n[Service]\nExecStart=/opt/grpcapp/server\nRestart=always\nUser=www-data\nEnvironment=GRPC_PORT=50051\n\n[Install]\nWantedBy=multi-user.target\nEOF\nsystemctl daemon-reload\nsystemctl enable --now grpcapp\nsystemctl status grpcapp
", 'Сервис слушает на 127.0.0.1:50051 — наружу его выпустит nginx с TLS, а сам порт закрыт файрволом. Директива Restart=always поднимет процесс после падения или ребута сервера, а запуск от пользователя www-data ограничивает права на случай компрометации. Логи смотрите через journalctl -u grpcapp -f — systemd собирает stdout/stderr автоматически, отдельный логгер не нужен.']

Проксируем через nginx с TLS

['gRPC требует HTTP/2 и специального модуля grpc_pass. Сначала выпустим сертификат:', '
apt install -y certbot\ncertbot certonly --standalone -d grpc.example.com
', 'Конфиг nginx для gRPC-проксирования:', '
server {\n    listen 443 ssl http2;\n    server_name grpc.example.com;\n\n    ssl_certificate     /etc/letsencrypt/live/grpc.example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/grpc.example.com/privkey.pem;\n\n    location / {\n        grpc_pass grpc://127.0.0.1:50051;\n        grpc_read_timeout 300s;\n        grpc_send_timeout 300s;\n    }\n}
', 'Проверяем и перезагружаем:', '
nginx -t && systemctl reload nginx
']

Проверка и частые ошибки

['Тестируем сервис извне через grpcurl:', '
grpcurl grpc.example.com:443 list\ngrpcurl -d \'{"name":"world"}\' grpc.example.com:443 helloworld.Greeter/SayHello
', '
  • Ошибка «Received RST_STREAM» — nginx собран без http2 или в location нет grpc_pass.
  • upstream unavailable — сервис не слушает 50051; проверьте ss -tlnp | grep 50051.
  • TLS handshake fail — клиент коннектится по plaintext; используйте -plaintext только для локальных тестов.
', 'Держите gRPC-сервис на отдельном VPS в UK или США: низкий пинг до Европы, root-доступ и ежедневные бэкапы на MAATRIX закрывают вопрос надёжности.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для gRPC

Частые вопросы

Можно ли на одном VPS держать gRPC и REST?

Да. nginx маршрутизирует по домену/пути: gRPC на grpc.example.com, REST на api.example.com — оба через один сервер.

Какой тариф выбрать под gRPC?

Для старта хватит базового плана от $8/мес; при росте числа стримов берите больше ядер — protobuf и TLS упираются в CPU.

Нужен ли HTTP/2 у клиента?

Да, gRPC работает только поверх HTTP/2. Большинство официальных gRPC-библиотек включают его по умолчанию.