server块必须放在http块内部才生效,否则报错;推荐在/etc/nginx/conf.d/下新建独立配置文件,写入server块后需nginx -t验证并reload生效。

nginx.conf 里 server 块写在哪才生效
配置虚拟主机,server 块不能随便塞进任意位置——它必须放在 http 块内部,否则 Nginx 启动直接报错:unknown directive "server"。常见错误是把 server 块写在 events 块里,或者顶格写在配置文件开头。
-
http块通常位于/etc/nginx/nginx.conf主配置中,也可能被拆到/etc/nginx/conf.d/下的独立文件(如default.conf) - 推荐做法:新建
/etc/nginx/conf.d/example.com.conf,只放一个server块,避免主配置被改乱 - 改完后必须运行
sudo nginx -t验证语法,再sudo systemctl reload nginx生效
监听 80 端口但访问不到?检查 listen 指令和防火墙
listen 不只是写个端口号那么简单。默认监听 127.0.0.1:80 或 [::1]:80,会导致外部机器无法访问;而没加 default_server 又可能让请求落到默认站点上。
- 对外服务务必写成
listen 80;(等价于listen *:80;),而不是listen 127.0.0.1:80; - 若多个
server都监听80,Nginx 会按配置顺序匹配server_name;没匹配上的,才交给第一个带default_server的server块处理 - 别忘了检查系统防火墙:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS),确保 80 端口开放
server_name 匹配失败的三种典型场景
server_name 不是“域名解析成功就能用”,它只做 HTTP 请求头里的 Host 字段字符串匹配,不查 DNS,也不管你本地 hosts 是否指向正确 IP。
- 浏览器地址栏输
http://192.168.1.100,但server_name example.com;—— 匹配失败,落到默认server -
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 ~^(?<subdomain>.+)\.example\.com$;</subdomain>
root 和 alias 路径行为差异极易搞混
静态文件返回路径出错,八成栽在这俩上。root 是拼接整个请求 URI,alias 是替换 location 路径部分——这个区别直接影响文件能否找到。
- 如果配置
location /static/ { root /var/www; },访问/static/js/app.js,Nginx 实际找的是/var/www/static/js/app.js - 如果改成
location /static/ { alias /var/www/static/; },同样请求会去找/var/www/static/js/app.js(注意结尾斜杠必须有) -
alias不能用于location /,因为无路径可替换;此时只能用root - 路径末尾斜杠、大小写、符号转义(如空格需编码)都会影响匹配结果,建议统一用小写字母 + 连字符命名目录
nginx -t。尤其是开发环境改了 hosts 又切回浏览器测试时,缓存和 301 重定向很容易掩盖真实问题。










