在单台服务器上托管多个网站是现代Web托管的基础,它能极大地节约成本并简化管理,在CentOS 7系统中,使用高性能的Nginx Web服务器来配置多虚拟主机(也称为服务器块)是一种非常流行且高效的做法,本文将详细介绍如何在CentOS 7上一步步配置Nginx以支持多个虚拟主机。

准备工作
在开始之前,请确保您已经具备以下条件:
- 一台运行CentOS 7的服务器。
- 一个具有
sudo权限的非root用户。 - Nginx已成功安装在服务器上,如果尚未安装,可以通过
sudo yum install epel-release和sudo yum install nginx命令进行安装。 - 两个(或更多)指向您服务器公网IP地址的域名,在本教程中,我们将使用
site1.com和site2.com作为示例。
第一步:创建网站目录结构
为了保持清晰和有序,我们为每个虚拟主机创建独立的目录来存放其网站文件,这些目录通常位于/var/www下。
使用以下命令为两个示例站点创建目录:
sudo mkdir -p /var/www/site1.com/html sudo mkdir -p /var/www/site2.com/html
为了确保Nginx进程(通常以nginx用户运行)能够读取这些目录中的文件,我们需要修改它们的所有权:
sudo chown -R nginx:nginx /var/www/site1.com/html sudo chown -R nginx:nginx /var/www/site2.com/html
我们可以适当调整一下权限,确保Web服务器能够访问目录内容:
sudo chmod -R 755 /var/www
第二步:为每个站点创建示例页面
我们在每个站点的根目录中创建一个简单的index.html文件,这样做便于我们稍后测试配置是否成功。
为site1.com创建首页:
sudo vim /var/www/site1.com/html/index.html
在文件中输入以下内容:
<html>
<head>欢迎来到 Site1.com</title>
</head>
<body>
<h1>成功!这是 site1.com 的首页。</h1>
</body>
</html> 保存并退出,同样,为site2.com创建首页:
sudo vim /var/www/site2.com/html/index.html
输入略有不同的内容以便区分:

<html>
<head>欢迎来到 Site2.com</title>
</head>
<body>
<h1>成功!这是 site2.com 的首页。</h1>
</body>
</html> 第三步:为每个虚拟主机创建Nginx配置文件
Nginx的主配置文件是/etc/nginx/nginx.conf,但最佳实践是为每个虚拟主机创建独立的配置文件,并将其存放在/etc/nginx/conf.d/目录下,这样便于管理和维护。
配置第一个虚拟主机
为site1.com创建配置文件:
sudo vim /etc/nginx/conf.d/site1.com.conf
将以下配置粘贴到文件中:
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_log /var/log/nginx/site1.com.error.log;
access_log /var/log/nginx/site1.com.access.log;
} 配置说明:
listen 80;:监听80端口(HTTP)。server_name site1.com www.site1.com;:指定此服务器块响应哪些域名的请求。root /var/www/site1.com/html;:设置该网站的根目录。index index.html index.htm;:定义默认的首页文件。location / { ... }:定义URL匹配规则,try_files指令会尝试按顺序查找文件,若找不到则返回404错误。error_log和access_log:为该站点指定独立的日志文件,便于排查问题。
配置第二个虚拟主机
同样,为site2.com创建配置文件:
sudo vim /etc/nginx/conf.d/site2.com.conf
粘贴类似配置,只需修改server_name和root指令:
server {
listen 80;
listen [::]:80;
server_name site2.com www.site2.com;
root /var/www/site2.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_log /var/log/nginx/site2.com.error.log;
access_log /var/log/nginx/site2.com.access.log;
} 第四步:测试并重新加载Nginx配置
在应用新配置之前,务必检查Nginx配置文件的语法是否正确:
sudo nginx -t
如果一切正常,您会看到类似以下的输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful 测试通过后,重新加载Nginx以使更改生效:
sudo systemctl reload nginx
如果您的防火墙(如firewalld)正在运行,请确保HTTP服务已被允许:

sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload
第五步:测试虚拟主机
您的多虚拟主机已经配置完成,您可以通过修改本地计算机的hosts文件来模拟DNS解析,从而进行测试。
在您的本地电脑上找到hosts文件:
- Linux/Mac:
/etc/hosts - Windows:
C:WindowsSystem32driversetchosts
在文件末尾添加以下两行(将your_server_ip替换为您服务器的实际IP地址):
your_server_ip site1.com
your_server_ip site2.com 保存文件后,在浏览器中分别访问http://site1.com和http://site2.com,您应该能看到之前为每个站点创建的专属首页内容,这证明多虚拟主机配置已成功。
相关问答FAQs
Q1:如果我直接用服务器的IP地址访问,Nginx会显示哪个网站的内容?
A1: 当Nginx收到一个HTTP请求时,它会根据请求头中的Host字段与server_name进行匹配,如果使用IP地址直接访问,或者访问一个未被任何server_name定义的域名,Nginx会使用一个“默认”虚拟主机,它会选择按字母顺序排在第一个或者配置文件中加载的第一个server块作为默认,为了精确控制,您可以在某个server块的listen指令后添加default_server参数,listen 80 default_server;,这样该块就会明确成为默认主机。
Q2:我可以在一个Nginx配置文件(服务器块)中托管多个域名吗?
A2: 是的,完全可以,您只需要在server_name指令中用空格分隔列出所有需要指向该网站文件的域名即可,如果site1.com和another-domain.net都希望显示相同的内容,您可以这样配置:server_name site1.com www.site1.com another-domain.net www.another-domain.net;
这样,所有指向这四个域名的请求都会被同一个服务器块处理,并从同一个root目录提供服务。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复