在搭建网站时,Nginx作为高性能的Web服务器和反向代理工具,其虚拟主机功能允许在同一台服务器上托管多个独立域名,实现资源高效利用和服务隔离,虚拟主机配置主要基于域名、IP地址或端口,通过Nginx的server块指令实现灵活管理,以下从基础配置、常见场景及优化技巧三个方面展开说明。

虚拟主机基础配置
Nginx虚拟主机配置的核心在于server块,每个server块定义一个虚拟主机的规则,包括监听地址、域名、根目录及请求处理逻辑,基础配置语法如下:
server {
listen 80; # 监听端口,默认为80(HTTP)
server_name example.com www.example.com; # 绑定域名,支持多域名和通配符
root /var/www/example; # 网站根目录路径
index index.html index.php; # 默认首页文件
location / { # 根路径请求处理
try_files $uri $uri/ =404; # 依次尝试访问文件、目录,否则返回404
}
location /images/ { # 图片目录配置
expires 7d; # 设置缓存过期时间为7天
}
}
listen指令:指定虚拟主机监听的IP和端口,如listen 192.168.1.100:8080;可绑定特定IP和非常规端口。server_name指令:支持精确域名(example.com)、通配符(*.example.com)或正则表达式(~^example\d+.com$),优先级依次为精确匹配、通配符匹配、正则匹配。root与index:root定义资源根目录,index指定默认访问的文件,可配置多个(如index.php index.html)。
多场景虚拟主机配置实践
基于域名的虚拟主机(最常用)
通过不同域名区分网站,适合多业务独立部署,同时托管site1.com和site2.com:
# site1.com配置
server {
listen 80;
server_name site1.com;
root /var/www/site1;
index index.html;
}
# site2.com配置
server {
listen 80;
server_name site2.com;
root /var/www/site2;
index index.html;
}
访问时,Nginx根据请求头的Host字段匹配对应的server_name,返回对应网站内容。
基于端口的虚拟主机
通过不同端口区分服务,适合测试环境或内部服务隔离,同一IP下通过8080和8081端口托管不同网站:

server {
listen 8080;
server_name localhost;
root /var/www/port1;
}
server {
listen 8081;
server_name localhost;
root /var/www/port2;
}
访问时需指定端口号,如http://localhost:8080。
基于IP的虚拟主机
当服务器绑定多个公网IP时,可通过IP区分虚拟主机。
server {
listen 192.168.1.100:80;
server_name ip1.example.com;
root /var/www/ip1;
}
server {
listen 192.168.1.101:80;
server_name ip2.example.com;
root /var/www/ip2;
}
需确保服务器已正确配置多个IP地址,且客户端请求目标IP与listen指令一致。
虚拟主机优化与安全技巧
- 配置访问日志:通过
access_log指令记录请求日志,可按虚拟主机分离日志文件,便于排查问题:access_log /var/log/nginx/site1.log combined;
- 启用HTTPS:为虚拟主机配置SSL证书,确保数据传输安全(需先安装
nginx-mod-http-ssl模块):listen 443 ssl; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3;
- 限制访问频率:使用
limit_req模块防止恶意请求,如限制每秒10次访问:location /api/ { limit_req zone=api burst=10 nodelay; } - 配置错误页面:自定义404、500等错误页面,提升用户体验:
error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; }
相关问答FAQs
Q1:Nginx虚拟主机中,如何配置泛域名解析?
A:在server_name中使用通配符,如*.example.com,可匹配所有子域名(如test.example.com、dev.example.com),若需限制二级域名,可结合正则表达式,如~^([a-z0-9-]+)\.example\.com$,通过$1变量捕获子域名名称,用于动态配置根目录(如root /var/www/$1)。

Q2:虚拟主机配置后,访问出现403错误,如何排查?
A:403错误通常由权限问题导致,可按以下步骤排查:
- 检查网站根目录(
root指定路径)的权限,确保Nginx运行用户(如nginx或www-data)有读取和执行权限:chmod 755 /var/www/example; - 检查目录下文件权限,HTML文件权限建议
644,目录755; - 确认
index指定的首页文件是否存在,若文件名错误或缺失,可能触发403; - 检查Nginx配置语法是否正确:
nginx -t,若提示“test is successful”,则配置无误,需进一步检查文件权限或SELinux设置(如setsebool -P httpd_can_network_connect 1)。