nginx仅负责http层转发与增强,不参与业务协议设计;其核心作用是安全、稳定、高效地路由请求并补充头信息、处理跨域、负载均衡等,所有协议规范由后端定义,nginx配置必须与之严格对齐。

Nginx 本身不参与业务协议设计,它只做HTTP 层的转发与增强。对接 Java 或 Go 后端时,真正起作用的是后端服务暴露的协议规范(如 REST/JSON、gRPC、WebSocket),而 Nginx 的角色是安全、稳定、高效地将请求按规则路由过去,并补充必要头信息、处理跨域、负载均衡等。关键在于:协议规范由后端定义,Nginx 配置需与之严格对齐。
统一使用 HTTP/JSON 作为基础通信协议
这是最通用、调试最友好的方式,适用于 Java(Spring Boot)和 Go(net/http + encoding/json)双方。
- 后端接口必须遵循 RESTful 命名惯例:用名词表示资源(
/users)、动词由 HTTP 方法承载(GET/POST/PUT/DELETE) - 请求和响应统一使用
application/json类型,避免 XML 或表单编码混用 - Java 中用
@RequestBody和@ResponseBody;Go 中用json.Unmarshal/json.Marshal,结构体字段加json:"field_name"标签确保大小写一致 - Nginx 不修改请求体,但需透传关键 header:
Content-Type、Authorization、X-Request-ID等
gRPC 场景下 Nginx 的有限支持
Nginx 自 1.13.10 起支持 gRPC 代理,但仅限于 HTTP/2 + Protobuf 的纯 gRPC 服务(非 gRPC-Web),且要求后端开启 HTTP/2。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- Java 后端需使用
grpc-netty-shaded并启用 HTTP/2;Go 后端用golang.org/x/net/http2配置 server - Nginx 配置中必须显式开启 HTTP/2:
listen 443 http2 ssl;(gRPC over TLS 是强制要求) -
proxy_pass必须指向后端 gRPC server 的 HTTPS 地址,不能是 HTTP - 不支持 gRPC-Web(浏览器直连 gRPC),如需前端调用,应通过 Envoy 或 grpc-gateway 转成 REST 接口
CORS 与预检请求的 Nginx 层处理
当前端(如 Vue/React)直接访问 Nginx 暴露的 /api 路径时,跨域由 Nginx 统一管控,避免每个 Java/Go 接口重复写 CORS 逻辑。
- 在对应
location /api/块中添加标准响应头:add_header 'Access-Control-Allow-Origin' 'https://fe.example.com' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Accept' always; add_header 'Access-Control-Allow-Credentials' 'true' always;
- 对
OPTIONS预检请求直接返回 204,不转发给后端:if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' 'https://fe.example.com'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Accept'; add_header 'Access-Control-Allow-Credentials' 'true'; return 204; } - 生产环境禁止使用
*通配符(尤其带credentials时)
错误传递与可观测性对齐
Java 抛异常、Go 返回 error,都不能直接透传给前端。Nginx 应配合后端约定统一错误模型。
- 后端统一返回标准错误体,例如:
{"code":4001,"message":"参数缺失","data":null},状态码使用语义化 HTTP 状态码(400/401/403/404/500) - Nginx 可配置
proxy_intercept_errors on;并自定义错误页,但更推荐让后端完整控制错误响应格式 - 为链路追踪注入 header:
proxy_set_header X-Request-ID $request_id;、proxy_set_header X-B3-TraceId $traceid;(若集成 OpenTelemetry/Jaeger) - 日志中记录上游响应时间:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time';
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










