nginx配置在一个端口下,同时支持http与https两种协议
Nginx 不支持 在 同一个端口 同时提供 HTTP 和 HTTPS 服务,原因如下:[*]HTTP 和 HTTPS 使用的是不同的协议,HTTPS 需要 TLS 握手,而 HTTP 不需要。
[*]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,转发到 http_backend(127.0.0.1:8080)。
[*]如果是 HTTPS,转发到 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 访问!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]