Nginx 的 server 块本质是定义独立虚拟主机的逻辑单元,需通过 listen 和 server_name 明确监听端口与域名匹配规则,内部 root 设默认根目录、location 实现路径调度,且指令严格受限于 Context 作用域。

配置 Nginx 的 server 块,本质是定义一个独立的虚拟主机——它不是“加几行配置”那么简单,而是划出一个有明确边界、能自主响应请求的逻辑单元。
明确监听与匹配条件
每个 server 块必须通过 listen 和 server_name 告诉 Nginx:“我在哪个端口(和 IP)上守着,又认哪些域名”。这两条指令缺一不可,且只能写在 server 块里。
-
listen 80;表示监听所有网卡的 80 端口;listen 192.168.1.100:443 ssl;表示只监听指定 IP 的 HTTPS 端口 -
server_name example.com www.example.com;支持多个域名空格分隔;用*或正则可做通配或动态匹配(如~^www\.(.+)$) - 若请求的 Host 头不匹配任何
server_name,Nginx 会交给该listen端口下第一个server块处理
设置根目录与静态资源路径
root 是最常用的路径指令,它为整个 server 设定默认文件根目录。它会被 location 中的 root 或 alias 覆盖,但不会自动继承到子块外。
-
root /var/www/example;:请求/index.html就映射到/var/www/example/index.html - 对特定路径用
alias更安全,比如location /media/ { alias /data/uploads/; }—— 它直接替换 URI 前缀,不拼接路径,能天然防御../遍历 -
alias末尾必须带斜杠,且对应目录也要存在,否则返回 404
嵌套 location 实现路径级调度
location 必须写在 server 内部,它是真正决定“请求来了怎么处理”的环节。一个 server 可以有多个 location,按优先级匹配 URI。
- 前缀匹配:
location /api/ { proxy_pass http://backend; } - 精确匹配:
location = /health { return 200 "OK"; }(效率最高) - 正则匹配:
location ~* \.(jpg|png|gif)$ { expires 1h; } - 未设
root或alias的location,会回退使用server级的root
注意指令作用域与覆盖规则
不是所有指令都能随便塞进 server 块——每条指令都有明确的 Context(生效位置),写错地方会直接启动失败。
- 只能出现在
server的:listen、server_name、root(Normal 类型,可被子块覆盖) - 可在
server和location共存但行为不同:access_log off;在location中会关闭该路径日志;proxy_pass只在location中有效,server级写的完全被忽略 - 不能写在
server里的指令(如if、rewrite)必须放在location或更内层,否则报错











