nginx虚拟主机必须同时满足三个硬性条件:server块嵌套在http块内、listen显式声明端口、server_name与请求host头字面精确匹配;缺一即导致404或落入默认站。

直接结论:Nginx 虚拟主机不是“加个 server 块就能跑”,它必须同时满足三个硬性条件——server 块嵌套在 http 块内、listen 显式声明端口、server_name 与请求的 Host 头**字面精确匹配**;漏掉任一,就会 404 或落入默认站。
server 块放错位置导致 unknown directive "server"
现象:nginx -t 报 unknown directive "server",哪怕配置内容完全正确。
-
server块绝不能写在events块里,也不能顶格放在nginx.conf开头 - 必须确保它位于
http { ... }大括号内部——常见位置是/etc/nginx/nginx.conf底部的http段,或被include /etc/nginx/conf.d/*.conf加载的独立文件中 - 推荐做法:新建
/etc/nginx/conf.d/example.com.conf,只放一个server块,避免污染主配置 - 验证是否加载成功:运行
nginx -T | grep -A5 "server_name example.com",看到实际生效的完整配置才算到位
listen 80 写了但外网打不开
现象:本地 curl http://localhost 成功,但从另一台机器访问 http://192.168.1.100 超时或拒绝连接。
-
listen 80;等价于listen *:80;,可被所有 IP 访问;而listen 127.0.0.1:80;只响应本机回环,外部不可达 - CentOS/RHEL 默认启用
firewalld,Ubuntu 默认启用ufw,必须手动放行:sudo firewall-cmd --add-port=80/tcp --permanent && sudo firewall-cmd --reload(CentOS)或sudo ufw allow 80(Ubuntu) - 如果服务器在云上(如阿里云、AWS),还要检查安全组规则,80 端口必须显式开放
server_name 匹配失败的三种典型场景
现象:浏览器输入 http://example.com 却返回默认站点首页或 404,access_log 显示请求进了别的 server 块。
- 用户访问
http://192.168.1.100,但配置是server_name example.com;→ 不匹配,进第一个没带default_server的块,或 fallback 到全局默认 - 配置
server_name www.example.com;,但用户输的是example.com→ 必须显式列出:server_name example.com www.example.com; - 想匹配所有子域却写成
server_name *.example.com;→ 它只匹配一级子域(如api.example.com),不匹配dev.api.example.com;多级需正则:server_name ~^([^.]+\.)*example\.com$;
root 和 alias 在 location 中拼路径的方式完全不同
这是静态文件 404 最常见的原因:二者拼接路径的逻辑相反,改了配置却不意识到底层查找路径已变。
-
location /static/ { root /var/www; }→ 请求/static/js/app.js会找/var/www/static/js/app.js(root是拼接整个 URI) -
location /static/ { alias /var/www/static/; }→ 同样请求会找/var/www/static/js/app.js(alias是替换掉location路径部分,注意末尾斜杠必须有) - 别混用:比如
alias /var/www/static(缺斜杠)会导致 Nginx 尝试打开目录而非文件,可能报 403 或 404 - HTTPS 下多个域名共用一个实例时,
server_name写多个只首个生效——SNI 只用第一个域名查证书 SAN,其余域名若不在证书里,浏览器直接报NET::ERR_CERT_COMMON_NAME_INVALID
最常被忽略的其实是 nginx -T 这一步:语法通过不代表配置生效,你写的 server_name 可能根本没被加载进运行时配置里。还有就是 server_name 匹配纯靠字符串比对,和 DNS 解析、/etc/hosts 是否写对完全无关——它只认请求头里的 Host 字段。











