Nginx 不支持 在 同一个端口 同时提供 HTTP 和 HTTPS 服务,原因如下:
虽然 Nginx 本身不支持 HTTP 和 HTTPS 共享同一端口,但你可以使用 SSL 预读(SSL Preread) 技术,通过 Nginx 的 stream
模块在 同一端口 上区分 HTTP 和 HTTPS 流量。
stream
模块监听 443 端口并区分 HTTP/HTTPS# 在 http 之外的全局配置中
stream {
map $ssl_preread_protocol $name {
"" http_backend; # 没有 TLS 的是 HTTP
default https_backend; # 有 TLS 的是 HTTPS
}
upstream http_backend {
server 127.0.0.1:8080; # HTTP 服务器
}
upstream https_backend {
server 127.0.0.1:8443; # HTTPS 服务器
}
server {
listen 443;
proxy_pass $name;
ssl_preread on;
}
}
http {
server {
listen 8080;
server_name yourdomain.com;
location / {
root /usr/share/nginx/HTML;
index index.html;
}
}
server {
listen 8443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
stream
监听 443 端口
ssl_preread
读取数据流,判断是否是 HTTPS(即是否有 TLS 握手)。http_baC++kend
(127.0.0.1:8080
)。https_backend
(127.0.0.1:8443
)。http {}
配置 HTTP 和 HTTPS
server
监听 8080
端口处理 HTTP。server
监听 8443
端口处理 HTTPS。http://yourdomain.com:443
:会自动转发到 8080
端口的 HTTP 服务器。https://yourdomain.com:443
:会自动转发到 8443
端口的 HTTPS 服务器。这样,你就能在 一个端口(443) 上同时支持 HTTP 和 HTTPS 访问!
Nginx 通过 stream
模块 和 ssl_preread
技术,在 443 端口 自动区分 HTTP 和 HTTPS,并将请求转发到不同的后台端口(8080 和 8443)。
stream
模块stream
允许它直接代理 TCP 流量(即 HTTP 和 HTTPS)。ssl_preread on;
map
变量映射map $ssl_preread_protocol $proxy_backend {
"" http_backend; # 没有 TLS 的是 HTTP
default https_backend; # 有 TLS 的是 HTTPS
}
$ssl_preread_protocol
变量:
stream
服务器配置server {
listen 443;
proxy_pass $proxy_backend;
ssl_preread on;
}
$proxy_backend
变量,将请求转发到 8080(HTTP)或 8443(HTTPS)curl -v http://zhgdqh.ezczb.com:443
ssl_preread
检测到是 HTTPmap
规则匹配:$ssl_preread_protocol
为空 → 选择 http_backend
127.0.0.1:8080
(HTTP 服务器)curl -v https://zhgdqh.ezczb.com:443
ClientHello
握手包ssl_preread
读取 TLS 协议map
规则匹配:发现是 HTTPS → 选择 https_backend
127.0.0.1:8443
(HTTPS 服务器)默认情况下,Nginx 不能在同一端口同时处理 HTTP 和 HTTPS
listen 80
处理 HTTP,listen 443 ssl
处理 HTTPS。ssl_preread
来区分流量。适用于负载均衡或网关
stream
代理 TCP 流量,可以在反向代理前端统一监听 443,然后转发到不同的服务(HTTP / HTTPS)。优点 | 缺点 |
---|---|
允许 HTTP 和 HTTPS 共用 443 端口 | stream 只能代理 TCP 层,无法解析 HTTP 请求路径 |
ssl_preread 无需解密 TLS,效率高 |
不能同时做 HTTP → HTTPS 自动重定向 |
兼容性好,适用于负载均衡 | 需要额外的 http {} 服务器监听 8080 / 8443 |
通过 stream
+ ssl_preread
,Nginx 无需额外端口 就能在 443 端口同时支持 HTTP 和 HTTPS。
适用于负载均衡、网关、同一 IP 端口共用的场景。
高效,无需解密 HTTPS,直接转发 TCP 流量。
缺点:无法做 HTTP → HTTPS 自动跳转,但可以用前端 JS 或 meta refresh
解决。