# ============================================================
# Nginx gRPC 代理配置示例
# ============================================================
#
# 功能说明:
# - gRPC 协议代理（HTTP/2）
# - 流式 RPC 支持
# - 负载均衡
#
# Lolly 对应配置:
# server:
#   ssl:
#     http2:
#       enabled: true
#   proxy:
#     - path: "/grpc"
#       targets:
#         - url: "grpc://grpc-server:50051"
#       # gRPC 需要 HTTP/2 支持
# ============================================================

upstream grpc_backend {
    server grpc1:50051;
    server grpc2:50051;
    keepalive 32;
}

server {
    listen 443 ssl http2;
    server_name grpc.example.com;

    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_protocols TLSv1.2 TLSv1.3;

    # gRPC 代理
    location /grpc {
        # gRPC 使用 HTTP/2
        # Lolly 对应: grpc:// 协议前缀
        grpc_pass grpc://grpc_backend;

        # gRPC 超时
        grpc_read_timeout 60s;
        grpc_send_timeout 60s;
        grpc_connect_timeout 5s;

        # gRPC 缓冲
        grpc_buffer_size 4k;
    }

    # gRPC Web 代理（浏览器访问 gRPC）
    # 需要 grpc-web 模块或第三方代理
    location /grpcweb {
        grpc_pass grpc://grpc_backend;

        # gRPC Web 特殊处理
        grpc_set_header X-Grpc-Web 1;
    }
}

# gRPC 代理说明:
#
# 1. gRPC 协议:
#    - 基于 HTTP/2
#    - 支持 Unary、Server Streaming、Client Streaming、Bidirectional Streaming
#    - 使用 Protobuf 序列化
#
# 2. nginx grpc_pass 指令:
#    - grpc:// - 明文 gRPC（HTTP/2 无 TLS）
#    - grpcs:// - 加密 gRPC（HTTP/2 + TLS）
#    - 自动处理 HTTP/2 framing
#
# 3. Lolly 支持:
#    - HTTP/2 需要启用 SSL
#    - gRPC 代理通过 HTTP/2 协议实现
#    - 支持流式 RPC
#
# 4. 超时配置:
#    - grpc_read_timeout: 等待响应超时
#    - grpc_send_timeout: 发送请求超时
#    - 流式 RPC 需要较长超时
#
# 5. 负载均衡:
#    - gRPC 支持标准 HTTP/2 负载均衡
#    - 建议 least_conn 或 round_robin