nginx基于域名的虚拟主机依靠server_name匹配http请求中的host头,通过哈希表快速路由;支持精确匹配、通配符、正则等写法;需为每个域名独立配置,显式设置default_server兜底,并为https单独配置ssl证书及跳转。

域名匹配靠 server_name
每个 server 块必须明确声明 server_name,Nginx 启动时会构建一个哈希表,按 Host 值快速查找匹配项。支持以下写法:
- 精确匹配:
server_name example.com; - 多域名并列:
server_name example.com www.example.com; - 通配符开头:
server_name *.example.com;(匹配 sub.example.com,不匹配 www.sub.example.com) - 通配符结尾:
server_name www.example.*;(较少用,需注意兼容性) - 正则表达式:
server_name ~^(?<sub>.+)\.example\.com$;</sub>(适合动态子域场景)
配置结构要独立清晰
推荐为每个域名建单独配置文件(如 /etc/nginx/sites-available/example.com),再软链到 sites-enabled 目录。每个配置至少包含:
-
listen 80;或listen 443 ssl;(HTTPS 需额外配证书路径) -
server_name明确列出该站点响应的全部域名 -
root指向专属网站根目录(如/var/www/example.com/html) -
index定义默认首页文件顺序 -
location / { try_files $uri $uri/ =404; }是常用静态资源处理逻辑
必须处理未匹配请求
若用户直接用 IP 访问,或 Host 头为空/非法,Nginx 默认选第一个 server 块响应——这容易暴露默认站或引发安全风险。建议显式设一个兜底配置:
- 加
default_server标志:listen 80 default_server; - 让这个
server返回 444(关闭连接)、403(拒绝访问)或重定向到主站 - 避免把生产配置文件放在
nginx.conf主文件里,防止误覆盖
HTTPS 要单独配 SSL 证书
HTTP 和 HTTPS 是两个独立监听端口,不能共用同一 server 块处理。正确做法是:
- 为每个域名准备独立 SSL 证书(可用 Let’s Encrypt 自动签发)
- 新建一个
server块监听 443 端口,启用ssl并指定证书路径 - 在 HTTP 的
server块中加强制跳转:return 301 https://$host$request_uri; - 注意:SNI 协议要求客户端支持 TLS 扩展,现代浏览器和系统都已默认支持











