nginx通过server_name按host头精确匹配域名实现多站点路由,优先级为:精确匹配>通配符(.example.com或mail.)>正则匹配>默认server(_或default_server);每个域名对应独立server块,支持多域名空格分隔及https证书绑定。

Nginx 通过 server_name 指令区分不同域名的请求,每个站点用独立的 server 块定义,靠 Host 请求头精准路由——不是靠端口或IP,而是靠域名本身。
每个站点一个 server 块
这是最清晰、最易维护的方式。每个域名(或一组相关域名)对应一个 server 块,放在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 下,再软链到 sites-enabled(Debian/Ubuntu 系统需此步)。
- 块内用
listen 80(或listen 443 ssl)声明监听协议和端口 -
server_name后空格分隔多个域名,例如:server_name example.com www.example.com; -
root指向该站点专属的文件目录,避免混用 - 配置完记得
nginx -t测试语法,再systemctl reload nginx
server_name 匹配有优先级
Nginx 不是简单“包含就匹配”,而是按明确顺序判断:
- 精确匹配最高(如
server_name api.example.com;) - 其次通配符(如
server_name *.example.com;) - 再其次是正则(如
server_name ~^([a-z]+)\.example\.com$;) - 都不匹配时,使用带
default_server标识的块;没标则取第一个加载的server块(按文件名排序)
HTTPS 站点要单独配 SSL
HTTP 可共用 80 端口,但 HTTPS 必须为每个域名单独指定证书路径:
-
ssl_certificate和ssl_certificate_key要指向该域名的有效证书 - 若多个域名共用一张 SAN 证书,可在一个
server块里写多个server_name,并复用同一组证书 - 建议加
return 301 https://$host$request_uri;强制跳转,避免 HTTP 明文访问
本地测试不用 DNS
开发或测试阶段,DNS 还没生效?直接改本机 /etc/hosts:
- 添加类似
127.0.0.1 site1.test site2.test的行 - 浏览器访问
http://site1.test就能命中对应server_name的配置 - 注意:Nginx 本身不查 hosts,这是操作系统层面的解析,只要请求发过去,Host 头对了就能匹配











