概述
虚拟主机指的是在一台主机上运行了多个网站。虚拟主机可以基于ip、基于名称。这些站点运行在统一物理服务器上,同时不会被用户发现。
基于名称的虚拟主机
使用基于名称的虚拟主机时,服务器依靠客户端将主机名报告为HTTP标头的一部分,这样一来,不同的虚拟主机可以共享相同的IP地址。
基于名称的虚拟主机通常很简单,只需要配置DNS服务器将每个主机名映射到正确的ip地址,然后配置apache http server即可识别不同的主机名。基于名称的虚拟主机还可以缓解对稀缺ip地址的需求。
原理
基于名称的虚拟主机解析的第一步是基于ip的解析。基于名称的虚拟主机解析仅在将候选范围缩小到基于ip的最佳匹配之后才选择最合适的基于名称的虚拟主机。在所有VirtualHost指令中对IP地址使用通配符,使基于ip的映射无关紧要。
当请求达到时,服务器将VirtualHost根据请求使用的ip地址和端口找到最佳的配置参数。如果包含该参数的组合的虚拟主机不止一个,apache将进一步将Servername和ServerAlias指令与请求中存在的参数进行比较。
如果任何虚拟主机的配置项中都没有配置ServerName,则服务器将会默认从系统主机名派生的标准域名。
实际应用
基于单IP一个端口不同域名
[root@apache html]# cat /etc/httpd/conf.d/vhosts.conf
<VirtualHost *:80>
ServerAdmin www.apache1.com
DocumentRoot "/var/www/html/apache1"
ServerName www.apache1.com
ServerAlias www.apache1.com
ErrorLog "logs/apahce1.com-error_log"
CustomLog "logs/apache1.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin www.apache2.com
DocumentRoot "/var/www/html/apache2"
ServerName www.apache2.com
ServerAlias www.apache2.com
ErrorLog "logs/apahce2.com-error_log"
CustomLog "logs/apache2.com-access_log" common
</VirtualHost>
cd /var/www/html/
ls
mkdir apache1 apache2
ls
echo "<h1>www.apache1.com</h1>" > /var/www/html/apache1/index.html
echo "<h1>www.apache2.com</h1>" > /var/www/html/apache2/index.html
#同样内网环境下配置一台主机的hosts域名解析到apache服务器地址
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.25.130 www.apache1.com
192.168.25.130 www.apache2.com
基于多ip地址一个端口
#单机下网卡绑定多个ip地址
[root@apache html]# ip a add 192.168.25.131 dev ens33
[root@apache html]# ip a add 192.168.25.132 dev ens33
[root@apache html]# cat /etc/httpd/conf.d/vhosts.conf
<VirtualHost 192.168.25.131:80>
ServerAdmin www.apache3.com
DocumentRoot "/var/www/html/apache3"
ServerName www.apache3.com
ServerAlias www.apache3.com
ErrorLog "logs/apahce3.com-error_log"
CustomLog "logs/apache3.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.25.132:80>
ServerAdmin www.apache4.com
DocumentRoot "/var/www/html/apache4"
ServerName www.apache4.com
ServerAlias www.apache4.com
ErrorLog "logs/apahce4.com-error_log"
CustomLog "logs/apache4.com-access_log" common
</VirtualHost>
mkdir apache3 apache4
echo "<h1>wwww.apache3.com</h1>" > /var/www/html/apache3/index.html
echo "<h1>wwww.apache4.com</h1>" > /var/www/html/apache4/index.html
基于单个ip多个socket端口
vim /etc/httpd/conf/httpd.conf
#添加端口
listen 8080
<VirtualHost 192.168.25.132:80>
ServerAdmin www.apache4.com
DocumentRoot "/var/www/html/apache4"
ServerName www.apache4.com
ServerAlias www.apache4.com
ErrorLog "logs/apahce4.com-error_log"
CustomLog "logs/apache4.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.25.132:8080>
ServerAdmin www.apache5.com
DocumentRoot "/var/www/html/apache5"
ServerName www.apache5.com
ServerAlias www.apache5.com
ErrorLog "logs/apahce5.com-error_log"
CustomLog "logs/apache5.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.25.132:8080>
ServerAdmin www.apache6.com
DocumentRoot "/var/www/html/apache6"
ServerName www.apache6.com
ServerAlias www.apache6.com
ErrorLog "logs/apahce6.com-error_log"
CustomLog "logs/apache6.com-access_log" common
</VirtualHost>
#重启服务
systemctl restart httpd