Apache 配置虚拟主机
一 :虚拟web 主机概述
1.1 什么是虚拟web 主机
虚拟web 主机指的是在同一台服务器中运行多个web 站点,其中每一个站点实际上并不独立占用整个服务器,因此被称为“虚拟” web 主机。通过虚拟web 主机服务可以充分利用服务器的硬件资源,从而大大降低网站构建及运行成本。
1.2 虚拟主机的分类
使用httpd 服务可以非常方便地构建虚拟主机服务器。值需要运行一个httpd 服务,就能够同时支撑大量的 web 站点。httpd服务支持的虚拟主机类型有
-
基于域名:为每个虚拟主机使用不同的域名,但是其对应的IP 地址是相同的。例如,www.mynet.com 和 www.benet.com 对应的地址都是 192.168.23.13. 这是使用最普遍的虚拟web 主机类型
-
基于ip地址:为每个虚拟主机使用不同的域名,且各自对应的IP地址也不相同。这种方式需要服务器配置读个网络接口,因此使用的不是非常广泛
-
基于端口:这种方式并不使用域名,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目录
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>
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 服务,最后一行已经默认打开
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
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
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
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
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
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
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
三: 构建基于ip 的虚拟主机
3.1 配置额外的一张网卡(添加网卡,或者设置虚拟网卡)
ifconfig ens33:0 192.168.23.130 netmask 255.255.255.0
#设置临时虚拟网卡 ens33:0 192.168.23.130/24
ifconfig
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
3.4 重启服务,查看端口
systemctl restart httpd
netstat -natp | grep 80
3.5 客户端访问
curl http://192.168.23.13
curl http://192.168.23.130
四 配置基于端口的虚拟主机
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
4.4 客户端访问
curl http://192.168.23.13:80
curl http://192.168.23.13:8080
总结
如果使用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 里的两个例子没有注释
解决:
将 /usr/local/httpd/conf/extra/httpd-vhosts.conf 虚拟主机配置文件里的两个例子注释
配置基于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
解决:
因为主配置文件 /usr/local/httpd/conf/httpd.conf 里Listen 项,配置错误(如图)
要么设置监听所有地址的80端口 ,直接配置 Listen 80
要么设置监听具体ip的80端口
Listen 192.168.23.13:80
Listen 192.168.23.130:80
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现