NGINX 1.25如何在多个域名上启用QUIC/HTTP/3?
NGINX 1.25 多域名共享443端口提供HTTP/3服务的实现方法
可以实现,但不能直接在多个server块里重复配置listen 443 quic reuseport;,得换个配置思路:
核心配置方案:单server块统一处理HTTP/3请求
把所有域名的HTTP/3监听集中到一个server块里,利用同一张SAN证书和SNI识别域名,具体配置如下:
server { # 仅在这一个块中配置QUIC监听 listen 443 quic reuseport; # 保留原有HTTP/2监听 listen 443 ssl http2; # 加载包含所有SAN域名的证书 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; # 列出所有需要支持的域名 server_name domain1.com domain2.com domain3.com; # 根据域名分配不同处理逻辑 location / { if ($host = domain1.com) { root /var/www/domain1; } if ($host = domain2.com) { proxy_pass http://backend-for-domain2; } # 其他域名的处理规则可依次添加 } }
配置逻辑说明
- NGINX不允许同一端口重复配置QUIC监听,重复添加
listen 443 quic会触发duplicate listen options报错 - 既然所有域名都在同一张SAN证书中,HTTP/3客户端会自动发送SNI,NGINX可通过
$host变量识别请求对应的域名,进而分发到对应处理逻辑,完全符合RFC9114的规范要求
保留独立server块的替代方案
如果不想把所有逻辑混在一个块里,可以把HTTP/3监听单独放在一个默认server,其他server块仅处理HTTP/2,再通过内部转发实现:
# 专门处理HTTP/3请求的默认server server { listen 443 quic reuseport; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; server_name _; # 匹配所有域名 location / { # 转发到对应域名的本地server块(需提前配置本地监听端口) proxy_pass http://$host$request_uri; proxy_set_header Host $host; } } # 各个独立的域名server块(仅处理HTTP/2) server { listen 127.0.0.1:8080 ssl; server_name domain1.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; root /var/www/domain1; # 其他专属配置 } server { listen 127.0.0.1:8081 ssl; server_name domain2.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; proxy_pass http://backend-for-domain2; # 其他专属配置 }
内容的提问来源于stack exchange,提问作者Ruud
相关产品推荐
相关产品推荐

