글 / gRPC 통신

Nginx gRPC 프록시 설정

http2 on과 grpc_pass로 요청을 전달하고, 스트리밍 경로는 기본 60초인 읽기·쓰기 timeout을 늘린다.

작성일 · 읽는 시간 3분 · Nginx 1.28 기준

요구 사항

gRPC는 HTTP/2 위에서 동작한다. 리버스 프록시인 nginx에서 HTTP/2 수신을 활성화하고, 일반 프록시의 proxy_pass 대신 gRPC 모듈의 grpc_pass로 요청을 백엔드 서버에 전달한다.

클라이언트, nginx, 백엔드 서버의 gRPC 프록시 구성

기본 설정

nginx/etc/nginx/sites-available/grpc
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    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;

    # TLS는 nginx에서 끝내고 백엔드로는 평문으로 넘긴다
    location / {
        grpc_pass grpc://127.0.0.1:50051;
    }
}
  • http2 on: 이 서버 블록에서 HTTP/2를 수신한다.
  • grpc_pass: grpc://는 평문으로, grpcs://는 TLS로 백엔드 서버에 접속한다.
참고

http2 on은 nginx 1.25.1부터 사용할 수 있다. listen 443 ssl http2 형태의 이전 방식을 사용하면 경고가 출력된다.

스트리밍 연결 유지

grpc_read_timeout과 grpc_send_timeout의 기본값은 60초이다. 이 값은 호출 전체가 아니라 연속한 두 번의 읽기(쓰기) 사이의 시간에 적용된다. 서버 스트리밍에서 서버가 60초 동안 아무것도 전송하지 않으면 nginx가 연결을 닫는다.

읽기 간격이 60초에 이르면 nginx가 연결을 닫는 과정

nginx
# gRPC 요청 경로는 /패키지.서비스/메서드 꼴이다
location /device.v1.StatusService/WatchStatus {
    grpc_pass grpc://127.0.0.1:50051;
    grpc_read_timeout 1h;
    grpc_send_timeout 1h;
    client_body_timeout 1h;
}
  • grpc_read_timeout: 백엔드 서버의 응답을 대기하는 간격이다.
  • grpc_send_timeout: 백엔드 서버로 요청을 전송할 때 연속한 두 번의 쓰기 사이에 허용하는 간격이다.
  • client_body_timeout: 클라이언트의 요청 본문을 대기하는 간격이다. 기본값이 60초이므로 클라이언트가 간헐적으로 전송하는 스트리밍은 이 제한의 영향을 받는다.

nginx의 timeout 세 가지가 적용되는 구간

timeout을 늘리는 대신 서버가 60초보다 짧은 주기로 메시지를 전송하도록 구성할 수도 있다.

확인 방법

bash
sudo nginx -t && sudo systemctl reload nginx