log_format grpc_json escape=json '{"timestamp":"$time_iso8601",' '"client":"$remote_addr","uri":"$uri","http-status":$status,' '"grpc-status":$grpc_status,"upstream":"$upstream_addr"' '"rx-bytes":$request_length,"tx-bytes":$bytes_sent}'; map $upstream_trailer_grpc_status $grpc_status { default $upstream_trailer_grpc_status; # grpc-status is usually a trailer '' $sent_http_grpc_status; # Else use the header, whatever its source } server { listen 50051 http2; # In production, comment out to disable plaintext port listen 443 http2 ssl; server_name grpc.example.com; access_log /var/log/nginx/grpc_log.json grpc_json; # TLS config ssl_certificate /etc/ssl/certs/grpc.example.com.crt; ssl_certificate_key /etc/ssl/private/grpc.example.com.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_protocols TLSv1.2 TLSv1.3; # Routing location /routeguide. { grpc_pass grpc://routeguide_service; } location /helloworld. { grpc_pass grpc://helloworld_service; } # Error responses include conf.d/errors.grpc_conf; # gRPC-compliant error responses default_type application/grpc; # Ensure gRPC for all error responses } # Backend gRPC servers # upstream routeguide_service { zone routeguide_service 64k; server 127.0.0.1:10001; server 127.0.0.1:10002; server 127.0.0.1:10003; } upstream helloworld_service { zone helloworld_service 64k; server 127.0.0.1:20001; server 127.0.0.1:20002; } # vim: syntax=nginx