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 访问!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |