在互联网中,我们经常看到一台服务器上运行着多个网站,比如公司可能同时有官网、博客、产品展示站等。如果为每个网站单独准备一台服务器,成本会很高。而Nginx的虚拟主机功能可以让我们在一台服务器上轻松部署多个网站,每个网站看起来就像独立运行在自己的服务器上一样。
一、什么是虚拟主机?¶
简单来说,虚拟主机是通过技术手段,让一台物理服务器模拟出多个“虚拟服务器”的效果。每个虚拟主机可以独立配置域名、网站文件和访问规则,互不干扰。
Nginx实现虚拟主机主要有三种方式:
- 基于域名:最常用,通过不同的域名访问不同网站(比如 www.abc.com 和 www.xyz.com)。
- 基于端口:通过不同的端口号区分网站(比如 www.abc.com:80 和 www.abc.com:8080)。
- 基于IP:通过不同的服务器IP地址区分网站(如果服务器绑定了多个IP)。
二、准备工作¶
在开始配置前,需要确保:
1. 服务器已安装Nginx:如果还没安装,可通过以下命令安装(以Ubuntu为例):
sudo apt update && sudo apt install nginx
安装后启动Nginx:sudo systemctl start nginx,并设置开机自启:sudo systemctl enable nginx。
-
网站内容准备:为每个虚拟主机准备一个网站目录和首页文件(比如
index.html)。
示例:
- 网站1目录:/var/www/site1,index.html内容:Welcome to Site 1!
- 网站2目录:/var/www/site2,index.html内容:Welcome to Site 2! -
测试域名(可选):如果用真实域名,需确保域名已解析到服务器IP(比如将
site1.com和site2.com的A记录指向服务器IP1.2.3.4)。
三、基于域名的虚拟主机(最常用)¶
假设服务器IP是 1.2.3.4,需要部署两个网站:site1.com 和 site2.com。
步骤1:创建Nginx配置文件¶
Nginx的配置文件通常在 /etc/nginx/ 目录下,推荐在 sites-available 目录中创建新配置文件(Ubuntu/Debian系统):
sudo nano /etc/nginx/sites-available/site1.com
步骤2:配置第一个网站(site1.com)¶
在配置文件中写入以下内容:
server {
listen 80; # 监听80端口(HTTP默认端口)
server_name site1.com www.site1.com; # 匹配的域名,可多个用空格分隔
root /var/www/site1; # 网站根目录
index index.html; # 默认首页文件
# 可选:配置网站访问日志
access_log /var/log/nginx/site1_access.log;
error_log /var/log/nginx/site1_error.log;
}
步骤3:配置第二个网站(site2.com)¶
同样创建配置文件 site2.com:
server {
listen 80;
server_name site2.com www.site2.com;
root /var/www/site2;
index index.html;
access_log /var/log/nginx/site2_access.log;
error_log /var/log/nginx/site2_error.log;
}
步骤4:启用配置并测试¶
- 将配置文件软链接到
sites-enabled目录(让Nginx加载):
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
- 测试配置是否有语法错误:
sudo nginx -t
如果显示 syntax is ok 和 test is successful,则配置正确。
- 重启Nginx使配置生效:
sudo systemctl restart nginx
步骤5:验证访问¶
用浏览器分别访问 site1.com 和 site2.com,应该能看到各自的首页内容。
四、基于端口的虚拟主机¶
如果没有多余域名,可通过不同端口区分网站(比如80和8080端口)。
示例:80端口和8080端口的两个网站¶
- 网站1(80端口):配置同上,
listen 80;,server_name可留空(或用_匹配任意域名)。
server {
listen 80;
server_name _; # 匹配任意域名
root /var/www/site1;
index index.html;
}
- 网站2(8080端口):新增配置:
server {
listen 8080;
server_name _;
root /var/www/site2;
index index.html;
}
- 重启Nginx后,访问:
-http://服务器IP(80端口)
-http://服务器IP:8080(8080端口)
五、基于IP的虚拟主机(需多IP服务器)¶
如果服务器绑定了多个IP(比如 1.2.3.4 和 1.2.3.5),可通过不同IP区分网站:
# 网站1绑定IP 1.2.3.4
server {
listen 1.2.3.4:80;
server_name site1.com;
root /var/www/site1;
}
# 网站2绑定IP 1.2.3.5
server {
listen 1.2.3.5:80;
server_name site2.com;
root /var/www/site2;
}
六、常见问题与解决¶
-
访问404或空白页面:
- 检查网站目录权限:sudo chown -R www-data:www-data /var/www/site1(Ubuntu默认用户是www-data)。
- 确认root路径是否正确,且index.html文件存在。 -
Nginx启动失败:
- 运行sudo nginx -t检查配置语法错误,根据提示修改。
- 检查日志:tail -n 100 /var/log/nginx/error.log。 -
域名解析未生效:
- 确保域名A记录已指向服务器IP,可通过ping site1.com检查是否解析正确。
总结¶
通过Nginx的虚拟主机功能,一台服务器可以轻松部署多个网站。核心是通过 server 块配置不同的域名、端口或IP,每个网站独立设置根目录和访问规则。初学者建议从基于域名的方式开始练习,掌握后再尝试其他方式。记住每次修改配置后,用 nginx -t 测试并重启服务,避免出错。