nginx配置多域名,核心结论是:本质上就是编写多个server块,但真正的技术难点和易错点集中在默认服务器的兜底策略、HTTPS证书的批量绑定,以及不同域名转发到不同后端服务的精细路由上,只要掌握了这三大核心场景的配置逻辑,就能应对绝大多数生产环境需求,下文将直接拆解具体配置方案与避坑指南。
基础架构:多域名复用一个Nginx实例
在Nginx中,每个域名对应一个 server 块,最简单且最常见的需求,是将 example.com 和 admin.example.com 指向同一台服务器的不同端口,或不同目录,其核心指令是 server_name,支持精确匹配、通配符(.example.com)和正则表达式(~^www.(d+).example.net$)。
一个标准的HTTP多域名基础配置结构如下:
- 每个域名独立占用一个
server块。 listen 80配合不同的server_name即可完成请求分发。- 当请求的
Host头与某个server_name匹配时,Nginx会进入该块处理。
独立见解:很多教程会建议使用 include 将每个域名的配置拆分成独立文件,放入 /etc/nginx/conf.d/ 目录,这不仅提升了可读性,更重要的是便于通过配置管理工具(如Ansible)进行自动化发布,避免手工编辑主配置文件导致语法错误。
进阶配置:HTTPS多域名与证书管理
随着HTTPS普及,配置多域名时涉及TLS证书的加载,传统方式是每个域名配置独立的 listen 443 ssl 块,并分别指定 ssl_certificate 路径,但这种方式在域名数量增多后,会造成大量重复监听指令。

更专业的方案是使用HTTP/2多域名共享与证书自动续期,针对不同域名但共用同一Nginx实例的场景,推荐以下两种主流解法:
- 多证书独立监听:适用于各域名使用不同证书(如不同品牌或不同主域名),每个server块仅监听
443 ssl,并设置ssl_certificate与ssl_certificate_key。 - 单IP通配符证书:若所有域名均为
.example.com的形式,可申请通配符证书,在所有server块中引用同一条证书路径,负载更低且管理集中。
易错点警示:如果多个域名共用同一个IP和端口,且使用了不同证书,必须确保在 server 块中配置 listen 443 ssl; 时,开启 ssl_preread 模块(在L4层)或在HTTP层使用 server_name 区分,否则,Nginx默认会使用第一个加载的证书回应所有SSL握手请求,导致证书不匹配错误。
精细化路由:不同域名转发到不同服务
对于微服务架构,常需要将 api.example.com 反向代理到后端Java服务,将 static.example.com 指向本地静态文件目录。location 块和 proxy_pass 是核心。
一个高效的配置片段逻辑如下:
- 精确匹配 结合域名进行分流。
- 利用
proxy_set_header Host $host;保持后端服务接收到的原始域名,避免重定向混乱。 - 对静态资源域名,直接配置
root或alias,减少代理开销。
独立见解(酷番云经验案例):在酷番云部署基于Nginx的多域名网关时,我们常遇到客户因后端服务路径冲突导致的反代故障,某个客户将 /api/auth

同时转发给两个不同的微服务,我们的独家解决方案是:摒弃传统的单层 location 正则匹配,采用嵌套 location 结合变量重置策略,具体做法是,先在server层通过 set $backend_pool "service_a"; 进行域名标记,然后在具体 location 中通过 if ($host = "api2.example.com") { set $backend_pool "service_b"; } 动态切换 proxy_pass 的地址,这种方式比正则匹配更直观、更易维护,且避免了Nginx配置中 if 指令与 proxy_pass 共存时的经典历史坑点(即if内使用proxy_pass会改变rewrite模块行为),针对该客户,我们还在酷番云控制台为其配置了基于域名的CC防护策略,使得恶意流量在到达Nginx之前就被边缘节点过滤,大幅减少了源站Nginx的并发连接压力。
高阶避坑:默认服务器与匹配优先级
在多域名环境中,最容易忽略的是 default_server 的配置,当请求的 Host 头无法匹配任何 server_name 时(如直接用IP访问,或恶意请求未知域名),Nginx会使用 listen 指令下标记为 default_server 的块来响应。
专业的配置建议:
- 永远定义一个默认server块,返回
444(关闭连接)或跳转到官网主域名,防止未备案域名或IP直接穿透访问到业务。 - 匹配优先级顺序为:
server_name精确匹配 > 通配符起始匹配 > 通配符结束匹配 > 正则匹配(按文件顺序)。
server_name 指令的特殊性:当使用下划线 _ 时,它不代表任何具体域名,仅作为兜底使用,这在生产环境中比使用IP或具体域名作为兜底更安全,因为

_ 永远不会与真实域名冲突。
相关问答模块
问题1:在Nginx中配置多个域名时,为了安全,我是否应该将默认页面指向一个空白页面还是直接关闭连接?
建议直接关闭连接,返回 444 状态码是Nginx特有的,表示直接断开TCP连接,不返回任何HTTP响应,这样做可以隐藏服务器存在信息,并有效减少恶意扫描,如果是法律合规需求(如备案检查),可以返回 302 跳转到主域名,但务必在 default_server 块中配置 server_name _; 以捕获所有未匹配流量。
问题2:如果我有两个域名都指向同一Nginx,但需要回源到两份不同的网站代码(PHP),如何配置才能确保Nginx处理PHP时不会互相干扰?
核心在于使用 fastcgi_param 和 root 的搭配,你需要为每个域名独立的 server 块,确保 root 指向各自的网站目录,关键在于 在同一 location ~ .php$ 处理块中,通过 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 动态拼接路径,由于Nginx会根据域名进入不同的 server 块,而 $document_root 是基于当前块的 root 指令计算的,因此不会互相干扰,如果使用 try_files 需要特别注意,务必在 location 内引用变量,避免在server级别硬编码绝对路径。
配置方案均已在生产环境验证,您可根据实际业务需求调整,如果您在配置过程中遇到类似问题,欢迎在评论区留言,或直接联系酷番云技术支持团队,我们提供针对高并发场景的专属Nginx优化方案,你的转发和评论,是持续输出深度干货的最大动力。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/743492.html

