Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是
server
块中的server_name
指令。server_name
决定了 Nginx 如何根据客户端请求的Host
头匹配对应的虚拟主机(Virtual Host)。
1. 简介
Nginx 使用 server_name
指令来确定哪个 server
块处理请求。该指令的值可以是域名、IP 地址、通配符或正则表达式。
2. 语法
server {listen 80;server_name example.com www.example.com;location / {root /var/www/html;index index.html;}
}
server_name
的值可以是多个域名,用空格分隔。- 如果未指定
server_name
,则默认使用server
块的监听地址。
3. 匹配规则
Nginx 根据请求的 Host
头匹配 server_name
。匹配顺序如下:
- 精确匹配:
example.com
仅匹配Host: example.com
。 - 通配符匹配:
*.example.com
匹配blog.example.com
、api.example.com
等。 - 正则表达式匹配:使用
~
表示正则匹配,~*
表示忽略大小写的正则匹配。 - 默认服务器:如果没有匹配的
server
块,则使用默认服务器。
4. 通配符匹配
*.example.com
匹配所有子域名,但不能作为首字符。- 例如:
*.example.com
匹配blog.example.com
,但不匹配example.com
。
5. 正则表达式匹配
使用正则表达式定义复杂的匹配规则:
server_name ~^www\.example\.com$;
~
表示正则匹配。~*
表示忽略大小写的正则匹配。
6. 默认服务器
默认服务器在以下情况下被使用:
-
未指定
server_name
的server
块:server {listen 80;# 没有 server_name 指令 }
-
server_name _;
:server {listen 80;server_name _; }
-
server_name
设置为default
或default_server
:server {listen 80 default_server;server_name example.com; }
7. 匹配优先级
Nginx 的 server_name
匹配遵循以下优先级顺序(从高到低):
- 精确匹配
- 通配符匹配(如
*.example.com
) - 正则表达式匹配
- 默认服务器
8. 实例
多域名支持
server {listen 80;server_name example.com www.example.com;location / {root /var/www/html;index index.html;}
}
子域名处理
server {listen 80;server_name ~^(?<subdomain>.+)\.example\.com$;location / {root /var/www/$subdomain;index index.html;}
}
默认服务器配置
server {listen 80 default_server;server_name _;location / {return 403;}
}
9. 注意事项
- 大小写敏感性:
server_name
默认区分大小写,可通过server_name_in_redirect off;
关闭。 - 性能优化:避免使用复杂的正则表达式,优先使用通配符或精确匹配。
- 测试配置:修改配置后,使用
nginx -t
测试配置是否正确。 - 日志排查:配置未生效时,检查
/var/log/nginx/error.log
。
10. 总结
Nginx 的 server_name
配置是虚拟主机管理的核心。通过精确匹配、通配符和正则表达式,可以灵活应对多域名、子域名和默认服务器的需求。掌握匹配优先级规则和实际应用技巧,能显著提升 Nginx 的配置效率和稳定性。
参考:Nginx 官方文档