在互联网中,我们经常看到一台服务器上运行着多个网站,比如公司可能同时有官网、博客、产品展示站等。如果为每个网站单独准备一台服务器,成本会很高。而Nginx的虚拟主机功能可以让我们在一台服务器上轻松部署多个网站,每个网站看起来就像独立运行在自己的服务器上一样。

一、什么是虚拟主机?

简单来说,虚拟主机是通过技术手段,让一台物理服务器模拟出多个“虚拟服务器”的效果。每个虚拟主机可以独立配置域名、网站文件和访问规则,互不干扰。

Nginx实现虚拟主机主要有三种方式:
- 基于域名:最常用,通过不同的域名访问不同网站(比如 www.abc.comwww.xyz.com)。
- 基于端口:通过不同的端口号区分网站(比如 www.abc.com:80www.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

  1. 网站内容准备:为每个虚拟主机准备一个网站目录和首页文件(比如 index.html)。
    示例:
    - 网站1目录:/var/www/site1index.html 内容:Welcome to Site 1!
    - 网站2目录:/var/www/site2index.html 内容:Welcome to Site 2!

  2. 测试域名(可选):如果用真实域名,需确保域名已解析到服务器IP(比如将 site1.comsite2.com 的A记录指向服务器IP 1.2.3.4)。

三、基于域名的虚拟主机(最常用)

假设服务器IP是 1.2.3.4,需要部署两个网站:site1.comsite2.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:启用配置并测试

  1. 将配置文件软链接到 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/
  1. 测试配置是否有语法错误:
   sudo nginx -t

如果显示 syntax is oktest is successful,则配置正确。

  1. 重启Nginx使配置生效:
   sudo systemctl restart nginx

步骤5:验证访问

用浏览器分别访问 site1.comsite2.com,应该能看到各自的首页内容。

四、基于端口的虚拟主机

如果没有多余域名,可通过不同端口区分网站(比如80和8080端口)。

示例:80端口和8080端口的两个网站

  1. 网站1(80端口):配置同上,listen 80;server_name 可留空(或用 _ 匹配任意域名)。
   server {
       listen 80;
       server_name _;  # 匹配任意域名
       root /var/www/site1;
       index index.html;
   }
  1. 网站2(8080端口):新增配置:
   server {
       listen 8080;
       server_name _;
       root /var/www/site2;
       index index.html;
   }
  1. 重启Nginx后,访问:
    - http://服务器IP(80端口)
    - http://服务器IP:8080(8080端口)

五、基于IP的虚拟主机(需多IP服务器)

如果服务器绑定了多个IP(比如 1.2.3.41.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;
}

六、常见问题与解决

  1. 访问404或空白页面
    - 检查网站目录权限:sudo chown -R www-data:www-data /var/www/site1(Ubuntu默认用户是 www-data)。
    - 确认 root 路径是否正确,且 index.html 文件存在。

  2. Nginx启动失败
    - 运行 sudo nginx -t 检查配置语法错误,根据提示修改。
    - 检查日志:tail -n 100 /var/log/nginx/error.log

  3. 域名解析未生效
    - 确保域名A记录已指向服务器IP,可通过 ping site1.com 检查是否解析正确。

总结

通过Nginx的虚拟主机功能,一台服务器可以轻松部署多个网站。核心是通过 server 块配置不同的域名、端口或IP,每个网站独立设置根目录和访问规则。初学者建议从基于域名的方式开始练习,掌握后再尝试其他方式。记住每次修改配置后,用 nginx -t 测试并重启服务,避免出错。

小夜