server_name配置错误或DNS未解析是90%多域名访问失败的根源,需用nginx -T确认生效配置,server_name按字面/正则精确匹配Host头,403多因目录权限或SELinux导致,HTTPS多域名须共用IP+端口且各配独立证书。

server_name 配置不对,或没做 DNS 解析,是 90% 的多域名访问失败根源。不是 Nginx 不工作,而是它根本没收到你期望的 Host 头。
确认 Nginx 是否监听了正确端口并加载了 server 块
运行 nginx -t 只能验证语法,不能保证配置被实际加载。真正要查的是当前生效的 server 块:
执行 nginx -T 2>&1 | grep -A 5 'server {.*listen.*80',看输出里是否包含你写的 server_name 值。如果没出现,说明该配置文件没被 include 进主配置,或者路径写错(比如漏了 .conf 后缀)。
常见错误:
-
/etc/nginx/conf.d/下的文件名没以.conf结尾,Nginx 默认不加载 -
include路径用了相对路径但没在nginx.conf的http块内定义基础路径 - 配置文件里写了
listen 8080,但浏览器访问的是http://example.com(默认走 80)
server_name 匹配逻辑和常见写法差异
server_name 不是“模糊匹配”,而是按字面或正则精确匹配 Host 请求头。比如用户访问 www.example.com,而你只写了 server_name example.com;,那请求会落到默认 server(通常是第一个或 default_server 标记的块)。
建议写法(兼顾简洁与覆盖):
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 同时支持带 www 和不带 www:
server_name example.com www.example.com; - 用通配符(仅限左侧):
server_name *.example.com;→ 匹配blog.example.com,但不匹配example.com - 用正则(需加波浪线):
server_name ~^(www\.)?example\.com$;→ 更灵活,但性能略低
注意:server_name 为空或写成 _ 时,该块会作为“兜底 server”,接收所有未被其他 server_name 匹配的请求 —— 别误以为这是“通配”。
目录权限、SELinux 和 root 路径陷阱
页面返回 403 Forbidden,大概率不是配置问题,而是 Linux 权限或安全模块拦截:
- 确保
root指向的目录(如/var/www/example.com/html)对 Nginx worker 进程用户(通常是www-data或nginx)可读、可执行(execute权限对目录是进入必需的) - CentOS/RHEL 系统默认开启 SELinux,即使权限正确也会拒绝访问。临时验证:运行
setenforce 0;若恢复访问,说明需打标签:chcon -R -t httpd_sys_content_t /var/www/example.com/html -
root路径不要用相对路径(如html),必须写绝对路径;且末尾不加斜杠(/var/www/example.com/html✅,/var/www/example.com/html/❌,后者可能触发 location 匹配异常)
HTTPS 域名复用必须共用同一 IP+端口
HTTP 下多个域名可共用 80 端口,靠 Host 头区分;但 HTTPS 在 TLS 握手阶段(SNI 之前)就需确定证书,所以:
- 多个 HTTPS 域名必须共享同一个
listen 443 ssl块 - 每个
server块都要单独配ssl_certificate和ssl_certificate_key,不能复用 - 旧客户端(如 Windows XP + IE6)不支持 SNI,一个 IP 只能绑一个 HTTPS 域名
别试图在一个 server 块里塞多个 server_name 却只配一套证书 —— 浏览器会警告证书域名不匹配,且 Nginx 日志里会出现 no suitable certificate found 类错误。

















