虚拟Web主机指的是在同一台服务器中运行多个Web站点,其中的每个站点实际并不独立占用整个服务器,因此被称为“虚拟”Web主机。通过虚拟Web主机服务可以充分利用服务器的硬件资源,从而大大降低网站构建及运行成本。
使用httpd服务可以非常方便地构建虚拟主机服务器,只需要运行一个httpd服务就能同事支撑大量的Web站点。
httpd服务支持的虚拟主机类型包括以下三种:
基于域名:为每个虚拟主机使用不同的域名,但是其对应的IP地址是相同的;
基于IP地址:为每个虚拟主机使用不同的域名,其各自对应的IP地址也不相同;
基于端口:这种方式并不使用域名、IP地址来区分不同的站点内容,而是使用不同的TCP端口,因此用户在浏览不同的虚拟站点时需要同时指定端口号才能访问。
这几种虚拟Web主机中,基于域名的虚拟主机是使用最为广泛的;基于IP地址和基于端口的虚拟主机一般只适用于公司内部。
基于域名主机的虚拟主机实现步骤:
1.为虚拟主机提供域名解析
首先需要搭建DNS服务以便提供域名解析,搭建DNS服务详细步骤可以参考博文CentOS 7搭建DNS服务,这里只介绍关键配置信息:
[root@localhost /]# vim /etc/named.conf //修改DNS服务主配置文件 ………… //省略部分内容 zone "a.com" IN { type master; file "a.com.zone"; }; zone "b.com" IN { type master; file "b.com.zone"; }; [root@localhost /]# vim /var/named/a.com.zone //编写a.com区域配置文件 $TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS www.a.com. www IN A 192.168.1.1 [root@localhost /]# vim /var/named/b.com.zone //编写b.com区域配置文件 $TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS www.b.com. www IN A 192.168.1.1 [root@localhost /]# systemctl start named //启动DNS服务 [root@localhost /]# nslookup > www.a.com Server: 127.0.0.1 Address: 127.0.0.1#53 Name: www.a.com Address: 192.168.1.1 > www.b.com Server: 127.0.0.1 Address: 127.0.0.1#53 Name: www.b.com Address: 192.168.1.1 //测试解析
2.为虚拟主机准备网页文档
[root@localhost /]# mkdir -p /var/www/html/acom [root@localhost /]# mkdir -p /var/www/html/bcom [root@localhost /]# echo "<h1>www.a.com</h1>" > /var/www/html/acom/index.html [root@localhost /]# echo "<h1>www.b.com</h1>" > /var/www/html/bcom/index.html //文件存放位置可以自定义
3.添加虚拟主机配置
当虚拟Web主机的数量较多时,建议使用独立的虚拟主机配置文件,然后在httpd服务的主配置文件通过Include加载这些配置。这样可以将对httpd服务的主配置文件的修改减至最少,更方便配置内容的维护。
root@localhost /]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf //创建独立的配置文件 <VirtualHost *:80> //*表示所有地址 ServerAdmin webmaster@a.com //管理员邮箱地址 DocumentRoot "/var/www/html/acom" //设置a虚拟站点区域 ServerName www.a.com //域名 ServerAlias www.dummy-host.example.com //别名 ErrorLog "logs/www.a.com.error_log" //错误日志 CustomLog "logs/www.a.com.access_log" common //访问日志 <Directory "/var/www/html"> Require all granted //允许所有主机访问 </Directory> </VirtualHost> <VirtualHost *:80> ServerAdmin webmaster@b.com DocumentRoot "/var/www/html/bcom" ServerName www.b.com ServerAlias www.dummy1-host.example.com ErrorLog "logs/www.b.com.error_log" CustomLog "logs/www.b.com.access_log" common <Directory "/var/www/html"> Require all granted </Directory> </VirtualHost> [root@localhost /]# vim /usr/local/httpd/conf/httpd.conf //编写httpd服务的主配置文件 ………… //省略部分内容 Include conf/extra/httpd-vhosts.conf //加载独立的配置文件 [root@localhost /]# systemctl start httpd //启动httpd服务
4.客户机访问测试
基于IP地址的虚拟主机实现步骤
实验环境中,所以在服务器上模拟一个IP地址
[root@localhost /]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0 //复制网卡配置文件 [root@localhost network-scripts]# vim ifcfg-ens33:0 //修改刚才复制的网卡配置文件 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33:0 //必须修改 UUID=fddc7556-c28d-4149-afb8-13356cdeb279 DEVICE=ens33:0 //必须修改 ONBOOT=yes IPADDR=192.168.1.11 //必须修改 [root@localhost network-scripts]# ifdown ens33:0;ifup ens33:0 //重新加载ens33:0网卡的配置文件 [root@localhost network-scripts]# ifconfig ens33:0 ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255 ether 00:0c:29:98:42:5d txqueuelen 1000 (Ethernet) [root@localhost /]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf //修改虚拟主机配置文件 <VirtualHost 192.168.1.1:80> //把*改为IP地址 ServerAdmin webmaster@a.com DocumentRoot "/var/www/html/acom" ServerName www.a.com ServerAlias www.dummy-host.example.com ErrorLog "logs/www.a.com.error_log" CustomLog "logs/www.a.com.access_log" common <Directory "/var/www/html"> Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.1.11:80> //把*改为IP地址 ServerAdmin webmaster@b.com DocumentRoot "/var/www/html/bcom" ServerName www.b.com ServerAlias www.dummy1-host.example.com ErrorLog "logs/www.b.com.error_log" CustomLog "logs/www.b.com.access_log" common <Directory "/var/www/html"> Require all granted </Directory> </VirtualHost> [root@localhost /]# systemctl restart httpd //重新加载httpd服务
客户机访问测试
基于端口的虚拟主机实现步骤
修改虚拟主机配置文件
root@localhost /]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf <VirtualHost *:80> ServerAdmin webmaster@a.com DocumentRoot "/var/www/html/acom" ServerName www.a.com ServerAlias www.dummy-host.example.com ErrorLog "logs/www.a.com.error_log" CustomLog "logs/www.a.com.access_log" common <Directory "/var/www/html"> Require all granted </Directory> </VirtualHost> <VirtualHost *:8080> //修改端口信息 ServerAdmin webmaster@b.com DocumentRoot "/var/www/html/bcom" ServerName www.b.com ServerAlias www.dummy1-host.example.com ErrorLog "logs/www.b.com.error_log" CustomLog "logs/www.b.com.access_log" common <Directory "/var/www/html"> Require all granted </Directory> </VirtualHost> Listen 8080 //监听8080端口,写在主配置文件或虚拟主机配置文件都可以 [root@localhost /]# systemctl restart httpd //重新加载httpd服务
强烈建议,修改端口信息的时候,千万不能修改为1~1024之间的端口,因为这些端口已经被系统服务使用!
客户机访问测试
虚拟目录实现步骤
[root@localhost httpd-2.4.25]# mkdir /yum [root@localhost httpd-2.4.25]# echo "<h1>www.yum.com</h1>" > /yum/index.html //创建虚拟目录测试文件 [root@localhost httpd-2.4.25]# vim /usr/local/httpd/conf/httpd.conf //编写httpd服务主配置文件 ………… //省略部分内容 Alias /test "/yum" //定义虚拟目录“/test”,物理路径为“/yum” <Directory "/yum"> //定义目录访问权限 Options Indexes MultiViews FollowSymLinks //固定格式,这项可以忽略 AllowOverride None //固定格式。这项可以忽略 Order allow,deny //匹配顺序为先允许,后拒绝,这项可以忽略 Allow from all //设置允许所有人访问,这项可以忽略 Require all granted //对这个目录给予授权 </Directory> [root@localhost httpd-2.4.25]# systemctl restart httpd //重新启动httpd服务
客户机测试访问
如果想针对虚拟目录开启身份验证
将上面的配置做如下修改:
[root@localhost httpd]# vim /usr/local/httpd/conf/httpd.conf //修改httpd服务主配置文件 ………… //省略部分内容 Alias /test "/yum" <Directory "/yum"> Options Indexes MultiViews FollowSymLinks //固定格式可以省略 AllowOverride None //固定格式可以省略 AuthName "test" //定义受保护的领域名称,该内容将在浏览器弹出的认证对话框中显示 AuthType Basic //设置认证的类型,Basic为基本的认证 AuthUserFile /usr/local/httpd/user //设置用于保存用户账号、密码的认证文件路径 Require valid-user //要求只有认证文件中的合法用户才能访问。valid-user表示所有合法用户 </Directory> [root@localhost htdocs]# cd /usr/local/httpd/ [root@localhost httpd]# bin/htpasswd -c /usr/local/httpd/conf/123.txt xiaozhang New password: Re-type new password: Adding password for user xiaozhang [root@localhost httpd]# systemctl restart httpd //重新启动httpd服务
针对Web网站设置用户限制,可以参考博文:CentOS 7 中httpd服务的用户限制详解
客户机访问测试
如果虚拟目录针对虚拟主机,请在虚拟主机配置文件中添加。