【Nginx开荒攻略】深度解析基于域名的虚拟主机配置:从域名解析到实战部署
目录
引言
1 基于域名的虚拟主机基础概念
1.1 什么是基于域名的虚拟主机?
1.2 基于域名虚拟主机的特点
1.3 三种虚拟主机配置方式对比
1.4 基于域名虚拟主机的应用场景
2 域名解析与网络基础
2.1 DNS解析原理
2.2 DNS配置
2.3 本地hosts文件配置
2.4 验证域名解析
3 Nginx基于域名的虚拟主机配置基础
3.1 Nginx配置文件结构
3.2 server_name指令详解
3.3 基础配置示例
3.4 创建网站目录和测试文件
3.5 重启Nginx服务
3.6 测试访问
4 域名匹配规则详解
4.1 server_name匹配优先级
4.2 精确匹配
4.3 通配符匹配
4.4 正则表达式匹配
4.5 默认虚拟主机配置
4.6 域名匹配实战示例
5 高级配置技巧
5.1 多域名配置
5.2 泛域名配置
5.3 HTTPS配置
5.4 反向代理配置
5.5 负载均衡配置
6 总结
引言
在现代Web服务器架构中,虚拟主机技术是实现多站点托管的核心技术之一。Nginx作为业界领先的高性能Web服务器,提供了灵活多样的虚拟主机配置方案。其中,基于域名的虚拟主机配置是最常用、最灵活的方式,特别适合互联网环境下的多网站托管需求。基于域名的虚拟主机通过不同的域名来区分不同的虚拟主机,多个域名可以指向同一个IP地址,通过Nginx的server_name指令进行匹配和路由。这种配置方式不仅节省了IP地址资源,还能为每个网站提供独立的配置和运行环境。
1 基于域名的虚拟主机基础概念
1.1 什么是基于域名的虚拟主机?
基于域名的虚拟主机是指通过不同的域名来区分不同的虚拟主机。多个域名可以指向同一个服务器的IP地址,Nginx根据客户端请求中的Host头部字段,将请求路由到对应的虚拟主机进行处理。
1.2 基于域名虚拟主机的特点

特点描述:
- 资源高效:多个域名共享同一个IP地址,节省IP资源
- 配置灵活:每个虚拟主机拥有独立的配置文件和根目录
- 用户友好:用户通过熟悉的域名访问网站,无需记忆端口号
- SEO友好:每个域名有独立的SEO优化空间
1.3 三种虚拟主机配置方式对比
配置方式 | 区分依据 | 适用场景 | 优势 | 劣势 |
基于域名 | 域名 | 外部网站、互联网应用 | 用户友好、利于SEO | 需要域名解析 |
基于IP | IP地址 | 独立IP需求、SSL绑定 | 完全隔离、独立SSL | 需要多个IP |
基于端口 | 端口号 | 内部服务、测试环境 | 简单易用、无需额外IP | 用户需记忆端口 |
1.4 基于域名虚拟主机的应用场景
- 企业多站点:企业官网、产品站、博客等独立站点
- 多租户系统:SaaS平台中不同租户的独立站点
- 电商平台:主站、商城、社区等不同功能模块
- 内容分发:不同语言版本、不同地区版本的网站
2 域名解析与网络基础
2.1 DNS解析原理

- 用户输入域名:用户在浏览器中输入要访问的域名
- 检查本地DNS缓存:浏览器首先检查本地是否有该域名的DNS缓存记录
- 本地DNS缓存查询:如果本地缓存中有,直接返回IP地址
- 询问本地DNS服务器:如果本地缓存没有,询问本地DNS服务器(如路由器、ISP提供的DNS)
- 本地DNS服务器查询:如果本地DNS服务器有记录,直接返回IP地址
- 询问根DNS服务器:如果本地DNS服务器没有,询问根DNS服务器
- 询问顶级DNS服务器:根DNS服务器返回顶级域名服务器地址
- 询问权威DNS服务器:顶级域名服务器返回权威DNS服务器地址
- 返回IP地址:权威DNS服务器返回域名的IP地址
- 建立连接:浏览器获取IP地址后,建立TCP连接访问网站
2.2 DNS配置
# Linux系统DNS配置
vim /etc/resolv.conf# 添加DNS服务器
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 114.114.114.114
2.3 本地hosts文件配置
# Linux/Mac系统hosts文件
vim /etc/hosts# 添加域名解析记录
192.168.1.100 www.site1.com
192.168.1.100 www.site2.com
192.168.1.100 www.site3.com
2.4 验证域名解析
# 查看域名解析
nslookup www.site1.com
dig www.site1.com
ping www.site1.com# 查看DNS缓存
systemd-resolve --statistics # Linux
3 Nginx基于域名的虚拟主机配置基础
3.1 Nginx配置文件结构
# 主配置文件:nginx.conf
http {# 全局配置include /etc/nginx/mime.types;default_type application/octet-stream;# 虚拟主机配置include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}
3.2 server_name指令详解
# server_name指令语法
server_name name1 name2 ...;
参数说明:
- name1 name2 ...:一个或多个域名,用空格分隔
- 支持的域名类型:
- 精确域名:www.example.com
- 通配符域名:*.example.com、www.example.*
- 正则表达式:~^www\d+\.example\.com$
3.3 基础配置示例
# 虚拟主机1:www.site1.com
server {listen 80;server_name www.site1.com;root /var/www/site1;index index.html;location / {try_files $uri $uri/ =404;}
}# 虚拟主机2:www.site2.com
server {listen 80;server_name www.site2.com;root /var/www/site2;index index.html;location / {try_files $uri $uri/ =404;}
}# 虚拟主机3:www.site3.com
server {listen 80;server_name www.site3.com;root /var/www/site3;index index.html;location / {try_files $uri $uri/ =404;}
}
3.4 创建网站目录和测试文件
# 创建网站目录
mkdir -p /var/www/{site1,site2,site3}# 设置权限
chown -R www-data:www-data /var/www
chmod -R 755 /var/www# 创建测试页面
echo "<h1>Site 1 - www.site1.com</h1><p>Welcome to Site 1</p>" | tee /var/www/site1/index.html
echo "<h1>Site 2 - www.site2.com</h1><p>Welcome to Site 2</p>" | tee /var/www/site2/index.html
echo "<h1>Site 3 - www.site3.com</h1><p>Welcome to Site 3</p>" | tee /var/www/site3/index.html
3.5 重启Nginx服务
# 测试配置文件语法
nginx -t# 重启Nginx服务
systemctl restart nginx
3.6 测试访问
# 测试各个虚拟主机
curl -H "Host: www.site1.com" http://192.168.1.100
curl -H "Host: www.site2.com" http://192.168.1.100
curl -H "Host: www.site3.com" http://192.168.1.100
4 域名匹配规则详解
4.1 server_name匹配优先级

- 精确匹配:完全匹配请求的域名
- 通配符匹配:支持*.example.com或www.example.*格式
- 正则表达式匹配:使用正则表达式进行匹配
- 默认server块:如果都没有匹配,使用默认的server块
4.2 精确匹配
# 精确匹配示例
server {listen 80;server_name www.site1.com; # 精确匹配root /var/www/site1;index index.html;
}server {listen 80;server_name site1.com; # 精确匹配root /var/www/site1-alt;index index.html;
}
4.3 通配符匹配
# 通配符匹配示例
server {listen 80;server_name *.site1.com; # 匹配所有site1.com的子域名root /var/www/site1-wildcard;index index.html;
}server {listen 80;server_name www.site.*; # 匹配www.site.anydomainroot /var/www/site-wildcard;index index.html;
}
4.4 正则表达式匹配
# 正则表达式匹配示例
server {listen 80;server_name ~^www\d+\.site1\.com$; # 匹配www1.site1.com, www2.site1.com等root /var/www/site1-regex;index index.html;
}server {listen 80;server_name ~^(?<subdomain>\w+)\.site1\.com$; # 捕获子域名root /var/www/site1-capture;index index.html;# 使用捕获的变量location / {echo "Subdomain: $subdomain";}
}
4.5 默认虚拟主机配置
# 默认虚拟主机
server {listen 80 default_server;listen [::]:80 default_server;server_name _;root /var/www/default;index index.html;location / {try_files $uri $uri/ =404;}
}# 普通虚拟主机
server {listen 80;server_name www.site1.com;root /var/www/site1;index index.html;location / {try_files $uri $uri/ =404;}
}
4.6 域名匹配实战示例
# 多域名配置
server {listen 80;server_name www.site1.com site1.com; # 多个精确域名root /var/www/site1;index index.html;
}# 通配符域名
server {listen 80;server_name *.site2.com; # 匹配所有site2.com的子域名root /var/www/site2;index index.html;
}# 正则表达式域名
server {listen 80;server_name ~^blog\d+\.site3\.com$; # 匹配blog1.site3.com, blog2.site3.com等root /var/www/site3-blog;index index.html;
}# 默认域名
server {listen 80 default_server;server_name _;root /var/www/default;index index.html;
}
5 高级配置技巧
5.1 多域名配置
# 一个server块处理多个域名
server {listen 80;server_name www.site1.com site1.com api.site1.com;root /var/www/site1;index index.html;# 根据路径处理不同功能location / {try_files $uri $uri/ =404;}location /api {proxy_pass http://localhost:3000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}
5.2 泛域名配置
# 泛域名配置
server {listen 80;server_name *.site1.com; # 匹配所有site1.com的子域名# 根据子域名设置不同的根目录set $subdomain "";if ($host ~* ^(?<subdomain>\w+)\.site1\.com$) {set $root_path "/var/www/site1/$subdomain";}root /var/www/site1/default;index index.html;location / {try_files $uri $uri/ =404;}
}
5.3 HTTPS配置
# HTTPS虚拟主机配置
server {listen 443 ssl;server_name www.site1.com;root /var/www/site1;index index.html;ssl_certificate /etc/nginx/ssl/site1.crt;ssl_certificate_key /etc/nginx/ssl/site1.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;location / {try_files $uri $uri/ =404;}
}# HTTP重定向到HTTPS
server {listen 80;server_name www.site1.com;return 301 https://$host$request_uri;
}
5.4 反向代理配置
# 反向代理配置
server {listen 80;server_name api.site1.com;location / {proxy_pass http://localhost:3000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 超时设置proxy_connect_timeout 30s;proxy_send_timeout 30s;proxy_read_timeout 30s;}
}
5.5 负载均衡配置
# 负载均衡配置
upstream backend {least_conn;server 192.168.1.101:3000;server 192.168.1.102:3000;server 192.168.1.103:3000 backup;
}server {listen 80;server_name www.site1.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
6 总结
基于域名的虚拟主机配置是Nginx的重要功能之一,掌握这一技能对于Web服务器管理和运维工作具有重要意义。