Nginx gRPC 프록시 설정
http2 on과 grpc_pass로 요청을 전달하고, 스트리밍 경로는 기본 60초인 읽기·쓰기 timeout을 늘린다.
요구 사항
gRPC는 HTTP/2 위에서 동작한다. 리버스 프록시인 nginx에서 HTTP/2 수신을 활성화하고, 일반 프록시의 proxy_pass 대신 gRPC 모듈의 grpc_pass로 요청을 백엔드 서버에 전달한다.
기본 설정
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가 연결을 닫는다.
# 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초이므로 클라이언트가 간헐적으로 전송하는 스트리밍은 이 제한의 영향을 받는다.
timeout을 늘리는 대신 서버가 60초보다 짧은 주기로 메시지를 전송하도록 구성할 수도 있다.
확인 방법
sudo nginx -t && sudo systemctl reload nginx