Nginx 不执行协议转换,而是通过分别控制前后端连接的协议版本实现适配;常见场景包括 HTTPS→HTTP(SSL终结)、HTTP/2前端→HTTP/1.1后端、HTTP/1.1→HTTP/1.0后端,需按需配置 listen、proxy_pass、proxy_http_version 及请求头等参数。

Nginx 本身不执行“协议转换”这一动作,而是通过分别控制前后端连接的协议版本来实现协议适配。所谓“HTTP 协议转换”,实际是指让客户端与 Nginx 使用一种协议(如 HTTPS + HTTP/2),而 Nginx 与后端服务使用另一种协议(如 HTTP/1.1 或 HTTP/1.0),中间不做帧级或语义级转换,只做请求/响应的可靠转发。
以下是最常见的三类协议适配场景及对应配置要点:
HTTPS → HTTP(SSL 终结)
适用于后端服务无 TLS 能力,Nginx 承担解密职责:
-
listen 443 ssl;必须配置有效证书(ssl_certificate和ssl_certificate_key) -
proxy_pass http://backend;—— 注意是http://,不是https:// - 透传原始协议信息:
proxy_set_header X-Forwarded-Proto $scheme; - 保留真实 IP:
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for; - 若后端依赖 Host 头,需显式设置:
proxy_set_header Host $host;
HTTP/2 前端 → HTTP/1.1 后端
这是标准且推荐的部署方式,无需额外“降级”,只需明确声明:
-
listen 443 ssl http2;启用前端 HTTP/2(必须 HTTPS) -
proxy_http_version 1.1;显式指定后端使用 HTTP/1.1(Nginx 默认即如此,显式更稳妥) - 清除 Connection 头避免干扰:
proxy_set_header Connection ""; - 不要尝试配置
proxy_http_version 2.0—— 该指令不存在,Nginx 不支持 upstream HTTP/2
HTTP/1.1 → HTTP/1.0 后端
用于老旧 CGI、嵌入式服务等弱协议栈后端:
- 强制协议降级:
proxy_http_version 1.0; - 关闭长连接:
proxy_set_header Connection "close"; - 清空 Host 头(若后端不解析):
proxy_set_header Host ""; - 禁用连接复用:不配置
upstream keepalive,并关闭重试:proxy_next_upstream off; - 移除非必需头,如
X-Forwarded-For、User-Agent(按后端实际需求保留)
所有场景都需注意:
-
proxy_pass的 URL 协议前缀(http://或https://)直接决定 Nginx 与后端通信所用协议 - 请求头精简与重写应以后端实际接受能力为准,而非默认值
- 超时参数(
proxy_connect_timeout、proxy_read_timeout)需根据后端响应特性调整,尤其 HTTPS 后端握手耗时更长
不复杂但容易忽略


















