众所周知,一台物理服务器只能运行一个站点,但如若想实现一台服务器运行多个站点时,就不得不用到虚拟主机了。虚拟主机,顾名思义,就是一个虚拟出来的主机,当在服务单配置完成后,客户端访问时就像是访问了多个后端服务器。


    实现虚拟主机有三种不同的方式:

  1. 基于IP的虚拟主机:使用不同的IP地址提供不同的站点

  2. 基于PORT的虚拟主机:使用不同的端口提供不同的站点

  3. 基于HOSTNAME的虚拟主机:使用不同的主机名提供不同站点

    

    为了更直观的感受,下面一一实现基于三种方式的虚拟主机:

    说明一下实验环境,实验主机为centos7.3,IP地址为:192.168.1.104

    首先安装httpd服务,这里使用的是httpd2.4.6版本:

# yum -y install httpd

    安装完成后查看安装文件:

# rpm -ql httpd

     对应的文件做一些简单说明:

    服务脚本:/etc/rc.d/init.d/httpd
    脚本配置文件:/etc/sysconfig/httpd
    运行目录:/etc/httpd
    配置文件:
    主配置文件:/etc/httpd/conf/httpd.conf
    扩展配置:/etc/httpd/conf.d/*.conf
    监听的Socket:80/tcp,443/tcp
    文档根目录:/var/www/html
    CGI:/var/www/cgi-bin/
    默认主页:index.html


    在实验之前,须确保在httpd.conf配置文件中:

        httpd服务监听的端口为80

        注释掉DocumentRoot "/var/www/html/"

    

    一、基于IP的虚拟主机实现:

        本机的IP地址为192.168.1.104,需在添加一个IP地址:


# ifconfig ens36:0 192.168.1.200 netmask 255.255.255.0 broadcast 192.168.1.255  up


    用ifconfig查看:

    

wKiom1iVdKGT8xvDAACIO9hfoX4483.png-wh_50

    可看到ens36:0已添加成功。


    为了便于管理,我们在扩展配置文件中新建VirtualHost.conf文件:

]# vim VirtualHost.conf

    添加内容如下:

<VirtualHost 192.168.1.104:80>
    DocumentRoot "/var/www/test1/"
    ServerName 192.168.1.104
</VirtualHost>
<VirtualHost 192.168.1.200:80>
    DocumentRoot "/var/www/test2/"
    ServerName 192.168.1.200
</VirtualHost>

    而后为添加的两个站点添加主页

        首先创建两个目录:

# mkdir -pv /var/www/test{1,2}
mkdir: created directory ‘/var/www/test1’
mkdir: created directory ‘/var/www/test2’

    为test1提供主页文件:

# vim /var/www/test1/index.html

    添加内容如下:

<h1>Test1 Page</h1>

    保存退出。站点test2同理;


    执行语法检查:

# httpd -t
Syntax OK

    重读配置文件:

# systemctl reload httpd

    测试结果:

    站点test1:

wKiom1iVeBuhBjqUAAAfPdii7Yw166.png-wh_50

    站点test2:

wKioL1iVeDORMpTfAAAfsJDiCFI855.png-wh_50

    二、基于端口的虚拟主机实现:

    编辑扩展配置文件:

]# vim VirtualHost.conf

    添加内容如下:

<VirtualHost 192.168.1.104:80>
    DocumentRoot "/var/www/test1/"
    ServerName 192.168.1.104
</VirtualHost>
<VirtualHost 192.168.1.104:8080>
    DocumentRoot "/var/www/test2/"
    ServerName 192.168.1.200
</VirtualHost>

    在主配置文件中,监听端口下面添加一行

Listen 8080

    保存退出

    执行语法检查:

# httpd -t
Syntax OK

    注:此处由于添加了端口,需要重启服务方能生效

# systemctl restart httpd
# ss -tnl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128             *:22                          *:*                  
LISTEN     0      100     127.0.0.1:25                          *:*                  
LISTEN     0      128            :::8080                       :::*                  //8080端口已监听
LISTEN     0      128            :::80                         :::*                   //80端口已监听
LISTEN     0      128            :::22                         :::*                  
LISTEN     0      100           ::1:25                         :::*

    测试结果:

    站点1:

wKiom1iVfQCSJJYvAAAf8eUglos891.png-wh_50

    站点2:

wKiom1iVfROxk6ROAAAjTJkCclA163.png-wh_50

    三、由于基于IP和端口的虚拟主机不常用,故而此处演示基于FQDN的虚拟主机实现:

    在扩展配置文件中添加如下内容:

wKiom1iVhfPBrmp5AABPpqX-jvs299.png-wh_50

    为了使主机名解析成功,需要修改host文件,我们此处使用win下浏览器测试,故而需要修改win下hosts文件,路径为:

C:\Windows\System32\drivers\etc\hosts

    添加如下内容

wKioL1iVhuzCp-7WAAADICaB0TI036.png-wh_50

    开始测试:

    站点test1:

wKioL1iVhK3TJVPtAAAfWPsisoo473.png-wh_50

    站点test2:

wKiom1iVhMjQgqXjAAAgpFVEoZY989.png-wh_50

    以上,即使基于httpd的虚拟主机三种实现方式,但在日常生产中,常需要对特定用户实现访问控制,下面简单演示基于用户的控制访问:

    编辑扩展配置文件,并添加如下内容:

wKioL1iVrAPg_ZEQAAB0WwErg08092.png-wh_50

    接下来用htpasswd生成密码:

wKiom1iVjVTjWsCjAAAjZ9MU7oE559.png-wh_50

    创建对应的admin目录及主页文件

# mkdir /var/www/test1/admin    //创建目录
# vim /var/www/test1/admin/index.html  //创建主业文件
<h1>Authentication</h1>   //添加的内容

    如图:

wKioL1iVrPmibijBAAAHuo3p78s767.png-wh_50

    而后访问:

wKiom1iVrSPQiJjzAABPY-NDaCc732.png-wh_50

    输入用户名密码:

wKiom1iVrUWxzl0tAABGQ7V88g0541.png-wh_50

wKioL1iVrVSyGcpBAAAYEWFYa7o737.png-wh_50

    至此httpd的虚拟主机和用户认证就实现了。