Nginx 配置多个 server 的核心在于通过监听端口、域名或 IP 的差异化匹配,将不同请求路由到不同网站或服务。 正确配置需要理解 server_name 的匹配优先级、listen 指令的作用范围,以及如何避免常见的配置冲突,遵循先进后出的匹配规则,再结合文件拆分、日志隔离和性能调优,即可构建稳定、可扩展的多站点架构。
Nginx 多 server 的基本原理
Nginx 的配置核心是 http 块,其中可包含多个 server 块,每个 server 块定义了一组监听地址和对应的请求处理规则,当请求到达时,Nginx 会按照以下逻辑进行选择:
- 先匹配 listen 指令中的 IP 和端口,确定候选 server 列表。
- 再根据 server_name(域名或通配符)进行精确匹配,优先级从高到低为:精确名称、以 开头的最长通配符、以 结尾的最长通配符、正则表达式(按配置顺序)、默认 server。
- 若没有匹配到任何 server_name,则使用默认 server,即 listen 中指定 default_server 的那个,或排在第一个的 server。
理解这个匹配顺序是配置多 server 的基础,否则容易出现“打开 A 域名却显示 B 站点”的问题。
多 server 配置的标准示例
以下是最常见的配置场景:同一台服务器上运行两个不同域名的网站,一个使用 80 端口,一个使用 443 端口并启用 HTTPS。
http {
# 第一个站点
server {
listen 80;
server_name www.example.com;
root /var/www/example;
index index.html;
}
# 第二个站点
server {
listen 80;
server_name www.test.com;
root /var/www/test;
index index.html;
}
}
如果两个站点共享同一个端口,完全依赖域名区分,server_name 必须准确无误,若其中一个域名未解析到本机,或用户直接通过 IP 访问,Nginx 会将请求交给默认 server。
推荐的配置方法:拆分文件与符号链接
将每个 server 的配置独立成文件,是管理多个站点的最佳实践。 在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/

中创建单独文件,并通过符号链接启用或禁用,这样做的好处是:
- 每个站点的配置互不干扰,便于维护和版本控制。
- 修改某个站点配置只需 reload 或 restart,不影响其他站点。
- 可以针对不同站点设置不同的 worker 参数和优化策略。
示例目录结构:
/etc/nginx/sites-available/example.com.conf/etc/nginx/sites-available/test.com.conf- 在
/etc/nginx/sites-enabled/中创建软链接指向上述文件
主配置文件中只需包含 include /etc/nginx/sites-enabled/.conf; 即可自动加载所有启用的站点。
多个 HTTPS server 的配置要点
当多个 server 同时监听 443 端口时,Nginx 需要根据 SNI(Server Name Indication)区分证书,每个 HTTPS server 都必须配置自己的 SSL 证书和私钥,且 listen 443 ssl 不能省略。
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
# 其他配置...
}
server {
listen 443 ssl;
server_name test.com;
ssl_certificate /etc/nginx/ssl/test.crt;
ssl_certificate_key /etc/nginx/ssl/test.key;
# 其他配置...
}
注意:如果多个 HTTPS 域名共用同一个 IP 地址,所有 server 块都必须支持 SNI,旧客户端不支持 SNI 时,Nginx 会使用默认 server 的证书,从而导致证书警告,因此建议将 default_server 单独放置,配置一个默认证书,避免不匹配时暴露错误证书。
多 server 配置中常见问题与解决方案
域名匹配混乱
问题现象:访问 example.com 时显示 test.com 的内容。
根因:通常因为 server_name 写错,或没有设置 default_server,导致 Nginx 选择了错误配置。
解决方案:
- 检查 server_name 是否包含括号、空格或错误后缀。
- 在第一个监听的 server 块中明确
listen 80 default_server;并返回 404 或跳转到主站点,避免无效主机头被错误处理。 - 使用
nginx -t测试配置语法,并用curl -H "Host: example.com" http://127.0.0.1验证返回结果。

端口被占用或冲突
问题现象:两个 server 都监听 80 端口,但第二个配置无效。
根因:Nginx 允许一个端口对应多个 server,只要 server_name 不同即可,但如果两个 server 的 listen 指令完全一致且都没有指定 default_server,则两者并存时第一个作为默认,不会报错,但容易产生意料之外的行为。
解决方案:
- 明确指定每个 server 的 domain,避免依赖默认顺序。
- 使用
listen 80 default_server单独定义默认站点,其他 server 不需要加 default_server。
静态资源 404 或路径错误
根因:多个 server 共用一套 root 或 alias,导致资源定位失败。
解决方案:每个 server 块内重新定义 root 或 alias,不要依赖全局 http 块中的 root,同时检查 location 中的路径是否与站点实际目录结构一致。
酷番云经验案例:多站点隔离与性能优化
我们在酷番云的实际部署中,曾遇到一台云服务器承载 6 个不同业务站点的情况,最初将全部配置写在一个 nginx.conf 内,结果每次更新任一站点都需要全量 reload,且日志全部混在一起,排查问题极为困难。
我们采用的方案是:
- 为每个站点在酷番云上创建独立的日志目录,通过
access_log /var/log/nginx/siteA_access.log main;分离日志。 - 在 server 配置中针对高流量站点启用
gzip、keepalive_timeout 65和针对性的expires缓存策略。 - 利用酷番云云服务器的弹性资源,将静态资源通过
location ^~ /static/直接交给 Nginx 处理,动态请求转发至后端,降低后端压力。
改进后,站点间互相隔离,单个站点流量高峰时不会影响其他站点,同时因为配置拆分,更新某个站点的规则时仅需 nginx -s reload,不影响其他 worker 进程的现有连接。多 server 配置的核心不只是语法正确,更需要设计合理的文件结构和资源隔离策略。

高级技巧:基于变量的默认站点
有时需要同时处理多个域名,且所有域名指向同一个应用,此时可以用正则 server_name 简化配置:
server {
listen 80;
server_name ~^(www.)?(.+).example.net$;
set $site $2;
root /var/www/$site;
index index.html;
}
这种写法适合泛域名解析,但要注意安全隐患:$site 被用户控制,可能产生路径穿越问题,务必对 $site 做白名单校验或使用 map 指令限制范围。
相关问答
Q1:Nginx 多 server 配置中,两个 server 都监听 80 端口,如何确保某个域名一定访问到指定 server?
答案为:依赖 server_name 的精确匹配,请确保该 server 块中的 server_name 完全等于访问的域名,不带 www 就只匹配不带 www 的域名,如果需要同时支持带和不带 www,可使用两个精确名称或使用通配符 .example.com 与 example.com 并列,为其他不相关的域名或 IP 单独设置默认 server,并返回 444 或重定向,避免被错误接收。
Q2:多个 HTTPS server 共用 443 端口时,Nginx 如何区分证书?
答案为:依靠 SNI(Server Name Indication) 扩展,在 TLS 握手阶段,客户端会先发送目标域名,Nginx 根据该域名选择对应的 server 块,并返回该块的证书,因此每个 server 块必须确保 server_name 和证书域名一致,对于不支持 SNI 的极老客户端,Nginx 会使用 443 端口上的 default_server 的证书,所以建议单独设置一个默认 HTTPS server,并配置匹配默认 IP 的自签证书,避免连接报错。
结语与互动
多 server 配置是 Nginx 日常运维中最常接触的技能,只要掌握了匹配优先级、拆分配置文件和隔离日志三层思路,就能胜任绝大多数多站点场景,你在实际配置中是否遇到过其他怪异问题?default_server 不生效,或 reload 后配置未加载?欢迎在评论区分享你的经验,我们一起探讨更优的解法。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/796518.html


评论列表(2条)
读了这篇文章,我深有感触。作者对每个的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是每个部分,给了我很多新的思路。感谢分享这么好的内容!