概述

虚拟主机指的是在一台主机上运行了多个网站。虚拟主机可以基于ip、基于名称。这些站点运行在统一物理服务器上,同时不会被用户发现。

基于名称的虚拟主机

使用基于名称的虚拟主机时,服务器依靠客户端将主机名报告为HTTP标头的一部分,这样一来,不同的虚拟主机可以共享相同的IP地址。
基于名称的虚拟主机通常很简单,只需要配置DNS服务器将每个主机名映射到正确的ip地址,然后配置apache http server即可识别不同的主机名。基于名称的虚拟主机还可以缓解对稀缺ip地址的需求。

原理

基于名称的虚拟主机解析的第一步是基于ip的解析。基于名称的虚拟主机解析仅在将候选范围缩小到基于ip的最佳匹配之后才选择最合适的基于名称的虚拟主机。在所有VirtualHost指令中对IP地址使用通配符,使基于ip的映射无关紧要。

当请求达到时,服务器将VirtualHost根据请求使用的ip地址和端口找到最佳的配置参数。如果包含该参数的组合的虚拟主机不止一个,apache将进一步将Servername和ServerAlias指令与请求中存在的参数进行比较。

如果任何虚拟主机的配置项中都没有配置ServerName,则服务器将会默认从系统主机名派生的标准域名。


实际应用

基于单IP一个端口不同域名

  1. [root@apache html]# cat /etc/httpd/conf.d/vhosts.conf
  2. <VirtualHost *:80>
  3. ServerAdmin www.apache1.com
  4. DocumentRoot "/var/www/html/apache1"
  5. ServerName www.apache1.com
  6. ServerAlias www.apache1.com
  7. ErrorLog "logs/apahce1.com-error_log"
  8. CustomLog "logs/apache1.com-access_log" common
  9. </VirtualHost>
  10. <VirtualHost *:80>
  11. ServerAdmin www.apache2.com
  12. DocumentRoot "/var/www/html/apache2"
  13. ServerName www.apache2.com
  14. ServerAlias www.apache2.com
  15. ErrorLog "logs/apahce2.com-error_log"
  16. CustomLog "logs/apache2.com-access_log" common
  17. </VirtualHost>
  18. cd /var/www/html/
  19. ls
  20. mkdir apache1 apache2
  21. ls
  22. echo "<h1>www.apache1.com</h1>" > /var/www/html/apache1/index.html
  23. echo "<h1>www.apache2.com</h1>" > /var/www/html/apache2/index.html
  24. #同样内网环境下配置一台主机的hosts域名解析到apache服务器地址
  25. [root@localhost ~]# cat /etc/hosts
  26. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  27. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  28. 192.168.25.130 www.apache1.com
  29. 192.168.25.130 www.apache2.com

image.png

基于多ip地址一个端口

  1. #单机下网卡绑定多个ip地址
  2. [root@apache html]# ip a add 192.168.25.131 dev ens33
  3. [root@apache html]# ip a add 192.168.25.132 dev ens33
  4. [root@apache html]# cat /etc/httpd/conf.d/vhosts.conf
  5. <VirtualHost 192.168.25.131:80>
  6. ServerAdmin www.apache3.com
  7. DocumentRoot "/var/www/html/apache3"
  8. ServerName www.apache3.com
  9. ServerAlias www.apache3.com
  10. ErrorLog "logs/apahce3.com-error_log"
  11. CustomLog "logs/apache3.com-access_log" common
  12. </VirtualHost>
  13. <VirtualHost 192.168.25.132:80>
  14. ServerAdmin www.apache4.com
  15. DocumentRoot "/var/www/html/apache4"
  16. ServerName www.apache4.com
  17. ServerAlias www.apache4.com
  18. ErrorLog "logs/apahce4.com-error_log"
  19. CustomLog "logs/apache4.com-access_log" common
  20. </VirtualHost>
  21. mkdir apache3 apache4
  22. echo "<h1>wwww.apache3.com</h1>" > /var/www/html/apache3/index.html
  23. echo "<h1>wwww.apache4.com</h1>" > /var/www/html/apache4/index.html

image.png

基于单个ip多个socket端口

  1. vim /etc/httpd/conf/httpd.conf
  2. #添加端口
  3. listen 8080
  4. <VirtualHost 192.168.25.132:80>
  5. ServerAdmin www.apache4.com
  6. DocumentRoot "/var/www/html/apache4"
  7. ServerName www.apache4.com
  8. ServerAlias www.apache4.com
  9. ErrorLog "logs/apahce4.com-error_log"
  10. CustomLog "logs/apache4.com-access_log" common
  11. </VirtualHost>
  12. <VirtualHost 192.168.25.132:8080>
  13. ServerAdmin www.apache5.com
  14. DocumentRoot "/var/www/html/apache5"
  15. ServerName www.apache5.com
  16. ServerAlias www.apache5.com
  17. ErrorLog "logs/apahce5.com-error_log"
  18. CustomLog "logs/apache5.com-access_log" common
  19. </VirtualHost>
  20. <VirtualHost 192.168.25.132:8080>
  21. ServerAdmin www.apache6.com
  22. DocumentRoot "/var/www/html/apache6"
  23. ServerName www.apache6.com
  24. ServerAlias www.apache6.com
  25. ErrorLog "logs/apahce6.com-error_log"
  26. CustomLog "logs/apache6.com-access_log" common
  27. </VirtualHost>
  28. #重启服务
  29. systemctl restart httpd

image.png