Apache 配置虚拟主机

apache 配置虚拟主机

一 :虚拟web 主机概述

1.1 什么是虚拟web 主机

虚拟web 主机指的是在同一台服务器中运行多个web 站点,其中每一个站点实际上并不独立占用整个服务器,因此被称为“虚拟” web 主机。通过虚拟web 主机服务可以充分利用服务器的硬件资源,从而大大降低网站构建及运行成本。

 

1.2 虚拟主机的分类

使用httpd 服务可以非常方便地构建虚拟主机服务器。值需要运行一个httpd 服务,就能够同时支撑大量的 web 站点。httpd服务支持的虚拟主机类型有

  1. 基于域名:为每个虚拟主机使用不同的域名,但是其对应的IP 地址是相同的。例如,www.mynet.comwww.benet.com 对应的地址都是 192.168.23.13. 这是使用最普遍的虚拟web 主机类型

  2. 基于ip地址:为每个虚拟主机使用不同的域名,且各自对应的IP地址也不相同。这种方式需要服务器配置读个网络接口,因此使用的不是非常广泛

  3. 基于端口:这种方式并不使用域名,IP地址来区分不同的站点内容,而是使用了不同的TCP 端口号。因此,用户在浏览不同的虚拟站点的时候,需要同时制定端口号才能访问

 

 

二 : 构建基于域名的虚拟主机

2.1 为虚拟主机 提供域名解析

方法一:部署DNS 域名解析服务器来提供域名解析服务

(配置DNS方法请见DNS 章)

方法二:在/etc/hosts文件中临时表配置域名和IP地址的映射关系

 echo "192.168.23.13   www.mynet.com" >> /etc/hosts
 echo "1921.168.23.13  www.benet.com"  >> /etc/hosts

 

 

2.2 为虚拟住进准备网页文档

 cd /usr/local/httpd/htdocs/mkdir mynet
  echo "<h1>www.mynet.com</h1>" > mynet/index.html
  
  mkdir benet
  echo "<h1>www.benet.com</h1>" > benet/index.html
  
  #注:源码编译安装的apache网站根目录默认是安装目录下的htdos目录
  #使用yum或者rpm从下载的apache网站根目录默认在/var/www/html目录

 

image-20210809213559291

 

2.3 配置虚拟主机

 vim /usr/local/httpd/conf/extra/httpd-vhosts.conf   #源码编译安装的虚拟主机配置文件
 #如果是yum 下载的,可以在主配置文件/etc/httpd/conf/httpd.conf 里面添加,也可以在 /etc/httpd/conf.d/ 目下,自己创建以 .conf 结尾的文件
 ​
 #配置文件末尾,将两个虚拟主机例子全部注释
 ​
 <VirtualHost 192.168.23.13:80>
     # ServerAdmin webmaster@dummy-host2.example.com
     DocumentRoot "/usr/local/httpd/htdocs/mynet"   #该网站所有网页存放在这个目录
     ServerName  www.mynet.com
     #ServerAlias www.dummy-host.example.com
     ErrorLog "logs/mynet.com-error-log"      #这里是相对路径,从apache的工作目录开始,/usr/local/httpd 开始
     CustomLog "logs/mynet.com-access-log" common
 </VirtualHost>
 ​
 ​
 <VirtualHost 192.168.23.13:80>
     # ServerAdmin webmaster@dummy-host2.example.com
     DocumentRoot "/usr/local/httpd/htdocs/benet"
     ServerName  www.benet.com
     #ServerAlias www.dummy-host.example.com
     ErrorLog "logs/benet.com-error-log"
     CustomLog "logs/benet.com-access-log" common
 </VirtualHost>
 

 

image-20210809215323249

image-20210809224400717

 

2.4 设置访问控制

 vim /usr/local/httpd/conf/extra/httpd-vhosts.conf 
 <Directory />
    Options None          #不是使用任何服务器特性
    AllowOverride None    #不允许重写配置
    Require all granted   #允许所有
 </Directory>
 ​
 ​
 主配置文件里,默认是拒绝所有,先注释
 vim  /usr/local/httpd/conf/httpd.conf
 #<Directory />     #表示apache 网站根目录,也就是/usr/local/httpd/htdocs
 #    AllowOverride none    
 #    Require all denied    #拒绝所有
 #</Directory>

2.5 加载独立的配置文件

 vim /usr/local/httpd/conf/httpd.conf
 Include conf/extra/httpd-vhosts.conf   #打开这行注释。大致在484 行
 ​
 #yum 安装的httpd 服务,最后一行已经默认打开

 

image-20210809223803978

 

2.6 重启服务,并使用客户端访问

 #服务端检查语法,重启服务
 apachectl -t
 systemctl restart httpd
 ​
 #客户端将域名和ip映射写入到/etc/hosts 文件中,然后使用浏览器访问
 echo "192.168.23.13 www.mynet.com" >> /etc/hosts
 echo "192.168.23.13 www.benet.com" >> /etc/hosts
 ​
 curl http://www.mynet.com
 curl http://www.benet.com

 

image-20210809230607856

 

2.7 配置文件Directory 目录下的配置说明

2.7.1访问控制项 options 指令:

options 指令的主要作用是控制特定目录将启用哪些服务器特性。可以在Apache 服务配置文件的虚拟主机配置(Directory)以及 .htaccess 文件使用

Options 指令常用选项

None : 表示不启用任何的服务器特性

FollowSymLinks: 服务器允许在此目录中使用符号链接(软连接)

 mkdir /data
 echo "<h1>hello</h1>" > /data/hello.html
 mkdir /usr/local/httpd/htdocs/hello
 ln -s  /data/hello.html  /usr/local/httpd/htdocs/hello/index.html  #网站首页为软连接文件
 ​
 vim /usr/local/httpd/conf/extra/httpd-vhosts.conf 
 <VirtualHost 192.168.23.13:80>  #配置虚拟主机
     DocumentRoot "/usr/local/httpd/htdocs/hello"
     ServerName  www.hello.com
     ErrorLog "logs/hello.com-error-log"
     CustomLog "logs/hello.com-access-log" common
 </VirtualHost>
 <Directory />
    Options FollowSymLinks   #设置允许使用符号链接
    AllowOverride None
    Require all granted
 </Directory>
 ​
 ​
 systemctl restart httpd
 echo "192.168.23.13 www.hello.com" >> /etc/hosts

 

image-20210809233722332

 

Indexes:如果输入的网址对应服务器上的一个文件目录,而此目录中又没有Apache配置文件中的DirectorIndex 指令指定的文件(如 DirectoryIndex index.html index.php),则列出该目录下的所有文件.

 #将 /usr/local/httpd/htdocs 目录下的首页文件,如index.html,index.php 文件都删除
 ​
 vim /usr/local/httpd/conf/extra/httpd-vhosts.conf 
 #将  /usr/local/httpd/conf/extra/httpd-vhosts.conf 所有的虚拟主机都注释
 <Directory />
    Options Indexes   #使用Indexes 选项
    AllowOverride None
    Require all granted
 </Directory>
 ​
  systemctl restart httpd
  
  浏览器访问 http://192.168.23.13

 

image-20210809234546922

 

MultiViews : 如果客户对岸请求的路径可能对应多种类型的文件,name服务器将根据客户端请求的具体情况自动选择一个最匹配客户端要求的文件。

正常说,如果我们访问http://192.168.23.13/file/abc ,则会给我们显示 网站根目录/file/abc目录下的网页文件。如果file目录下没有abc 子目录,则报错。但是当开启本MultiViews 项后,如果file 目录下没有abc子目录,则会尝试在file目录下查找 abc.* 文件,然后根据用户请求的具体情况返回abc.jpg或者 abc.html

 cd /usr/local/httpd/htdocs/
  mkdir file
 echo "<h1>abc</h1>" > file/abc.html  #在file目录下创建abc.html目录
 ​
  vim /usr/local/httpd/conf/extra/httpd-vhosts.conf 
  <Directory />
    Options None   #不开启MultiViews 项
    AllowOverride None
    Require all granted
 </Directory>
 ​
 systemctl restart httpd
 ​
 firefox http://192.168.23.13/file/abc

 


 

image-20210809235718036

 

 vim /usr/local/httpd/conf/httpd.conf 
 LoadModule negotiation_module modules/mod_negotiation.so  
 #开启 negotiation_module 模块
 ​
 vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
 <Directory />
    Options MultiViews   #使用MultiViews项
    AllowOverride None
    Require all granted
 </Directory>
 ​
 systemctl restart httpd
 firefox http://192.168.23.13/file/abc

 


 

image-20210810005906746

image-20210810005507256

 

All : 表示出MultiViews 之外的所有特性,这也是options的默认设置

 

2.7.2AllowOverride 指令

.htaccess(分布式隐含配置文件): 提供了针对每个目录改变配置的方法,即在一个包含特定指令的文件,其中的指定作用于此目录及其所有的子目录。

当 AllowOverride 设置成None时,相应的配置目录下的 .htaccess 文件时不被读取的,即无法生效。

当AllowOverride 设置成All 时,每一次请求访问相应的目录下的文件时,都会读取 .htaccess 文件的配置。意味着源Apache指令会被 .htaccess 文件中的指令重写。

从性能和安全性考虑,一般都尽可能避免是使用 .htaccess 文件,任何希望放在.htaccess 文件中的配置,都可以放在主配置(httpd.conf)的<Directory> 段中,而且高效。因此AllowOverride属性一般都配置成None。

 

2.7.3地址限制策略

Require all granted : 允许所有主机访问 Require all denied : 拒绝所有主机访问

Require local : 仅允许本地主机访问 Require [not] host <主机名或域名列表> : 允许或者拒绝 指定主机或者域名访问

Require [not] ip <ip 地址或者网段列表> : 允许或者拒绝指定ip 地址网络访问

 vim /usr/local/httpd/conf/extra/httpd-vhosts.conf 
  
 <Directory />
    Options None
    AllowOverride None
    Require all denied   #拒绝所有连接
 </Directory>
 ​
 firefox http://192.168.23.13

 

image-20210810090100530

 

 vim /usr/local/httpd/conf/extra/httpd-vhosts.conf 
 ​
 <Directory />
    Options None
    AllowOverride None
    Require  ip  192.168.23.13 192.168.23.2 #仅允许 192.168.23.13和192.168.23.2访问
 </Directory>
 ​
 systemctl restart httpd
 firefox http://192.168.23.13

 

image-20210810091343631

image-20210810091507168

 

 

三: 构建基于ip 的虚拟主机

3.1 配置额外的一张网卡(添加网卡,或者设置虚拟网卡)

 ifconfig ens33:0 192.168.23.130 netmask 255.255.255.0
 #设置临时虚拟网卡 ens33:0  192.168.23.130/24
 ifconfig 

 

image-20210810092937107

 

3.2 配置虚拟主机配置

 vim /usr/local/httpd/conf/extra/httpd-vhosts.conf 
 VirtualHost 192.168.23.13:80>  #设置ip地址192.168.23.13,80端口
     DocumentRoot "/usr/local/httpd/htdocs/mynet"
     ServerName  www.mynet.com
     ErrorLog "logs/mynet.com-error-log"
     CustomLog "logs/mynet.com-access-log" common
 </VirtualHost>
 ​
 ​
 <VirtualHost 192.168.23.130:80>  #设置网站地址192.168.23.130,端口80
     DocumentRoot "/usr/local/httpd/htdocs/benet"
     ServerName  www.benet.com
     ErrorLog "logs/benet.com-error-log"
     CustomLog "logs/benet.com-access-log" common
 </VirtualHost><Directory />
    Options None
    AllowOverride None
    Require all granted
 </Directory>
 

 

3.3 设置主配置文件监听地址

 vim /usr/local/httpd/conf/httpd.conf
 Listen 192.168.23.13:80
 Listen 192.168.23.130:80
 

 

image-20210810093207056

 

3.4 重启服务,查看端口

  systemctl restart httpd
  netstat  -natp | grep 80

 


 

image-20210810093400937

 

3.5 客户端访问

 curl http://192.168.23.13
 curl http://192.168.23.130

 

image-20210810094122543

 

 

四 配置基于端口的虚拟主机

4.1 修改虚拟主机配置文件

 <VirtualHost 192.168.23.13:80> #mynet 使用 192.168.23.13:80 端口
     DocumentRoot "/usr/local/httpd/htdocs/mynet"
     ServerName  www.mynet.com
     ErrorLog "logs/mynet.com-error-log"
     CustomLog "logs/mynet.com-access-log" common
 </VirtualHost><VirtualHost 192.168.23.13:8080>   #benet使用 192.168.23.13:8080端口
     DocumentRoot "/usr/local/httpd/htdocs/benet"
     ServerName  www.benet.com
     ErrorLog "logs/benet.com-error-log"
     CustomLog "logs/benet.com-access-log" common
 </VirtualHost><Directory />
    Options None
    AllowOverride None
    Require all granted
 </Directory>

 

 

4.2修改主配置 文件监听项

 vim /usr/local/httpd/conf/httpd.conf
 Listen 192.168.23.13:80
 Listen 192.168.23.13:8080

 

 

4.3 重启服务,查看端口

 systemctl restart httpd
 netstat  -natp | grep 80

image-20210810094904154

 

4.4 客户端访问

 curl http://192.168.23.13:80
 curl http://192.168.23.13:8080

 

image-20210810095032935

 

 

 

 

总结

如果使用httpd -t 或者 apachect -t 检查配置文件语法出现报错

在配置虚拟主机时候使用 httpd -t 检查语法,报错

AH00112: Warning: DocumentRoot [/usr/local/httpd/docs/dummy-host.example.com] does not exist AH00112: Warning: DocumentRoot [/usr/local/httpd/docs/dummy-host2.example.com] does not exist

是因为虚拟主机配置文件 /user/local/httpd/conf/extra/httpd-vhosts.conf 里的两个例子没有注释

image-20210809224425809

 

解决:

将 /usr/local/httpd/conf/extra/httpd-vhosts.conf 虚拟主机配置文件里的两个例子注释

image-20210810095335115

 

 

配置基于ip 的虚拟主机时报错

配置完基于ip的虚拟主机后,重启服务报错

进入/var/log/messages 查看发现以下报错信息

(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80 (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80

image-20210810093536335

 

解决:

因为主配置文件 /usr/local/httpd/conf/httpd.conf 里Listen 项,配置错误(如图)

image-20210810093629514

 

要么设置监听所有地址的80端口 ,直接配置 Listen 80

要么设置监听具体ip的80端口

 Listen 192.168.23.13:80
 Listen 192.168.23.130:80

 

 

posted @ 2021-08-15 06:06  知己一语  阅读(2257)  评论(0编辑  收藏  举报