Nginx需为HTTP和HTTPS配置独立server块,分别监听80和443端口,HTTPS必须配ssl_certificate与key;HTTP可return 301跳转HTTPS,但二者逻辑隔离,不可混用同一server块。

要让 Nginx 同时支持 HTTP(如 80 端口)和 HTTPS(如 443 端口)的独立虚拟主机,关键不是“共用一个 server 块”,而是为不同协议、不同端口、甚至不同域名或路径,配置各自独立的 server 块,并确保监听地址、SSL 设置和请求处理逻辑互不干扰。
明确区分 HTTP 与 HTTPS 的监听端口与协议语义
Nginx 不会自动将 80 端口的请求升级为 HTTPS;它严格按 listen 指令执行。因此必须显式声明:
-
listen 80;表示纯 HTTP 服务,不处理 SSL 握手 -
listen 443 ssl http2;表示启用 HTTPS,且必须配套ssl_certificate和ssl_certificate_key - 若想让 HTTP 自动跳转 HTTPS,需在 80 端口 server 块中用
return 301 https://$host$request_uri;,但这属于重定向,不是“合并访问”
为不同站点分配独立 server 块(支持同端口多域名或跨端口隔离)
比如:站点 A 只走 HTTP(site-a.example.com:80),站点 B 只走 HTTPS(site-b.example.com:443),二者完全解耦:
- HTTP 站点配置示例:
server { listen 80; server_name site-a.example.com; root /var/www/site-a; index index.html; } - HTTPS 站点配置示例(含证书路径与基础安全头):
server { listen 443 ssl http2; server_name site-b.example.com; ssl_certificate /etc/nginx/ssl/site-b.crt; ssl_certificate_key /etc/nginx/ssl/site-b.key; root /var/www/site-b; index index.html; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; }
避免常见陷阱:端口冲突、证书错配与 default_server 干扰
多个 server 块监听同一端口时,Nginx 依赖 server_name 匹配,但若未命中,会落到该端口的 default_server。需注意:
- 不要让两个 HTTPS server 块共用
listen 443 ssl却没配全证书——Nginx 启动会失败 - 若测试环境用自签名证书,浏览器会报不安全,但 Nginx 本身可正常启动并响应
- 使用
nginx -t验证语法,用nginx -T查看实际加载的完整配置(含 include 文件) - 修改后务必
nginx -s reload,而非仅 restart,减少连接中断
进阶:同一域名下 HTTP 仅作跳转,HTTPS 才承载业务
这是生产常用模式,但逻辑上仍是“两个独立 server”:
- 80 端口只做 301 跳转,不放任何静态文件或 proxy_pass
- 443 端口专注业务:可接后端应用(
proxy_pass http://localhost:3000)、静态资源或 PHP-FPM - 若需 HTTP 访问调试接口,可单独开一个非标端口(如
listen 8080),并限制内网 IP 访问:allow 192.168.1.0/24; deny all;

















