Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术。本文介绍三种方式的服务请求方式。
1. 基于IP地址。
1.1 首先创建三个IP地址,基于这三个IP地址来访问服务器,理论上对服务器切分出来三个部分资源。使用nmtui添加三个地址分别是10;20;30 ;添加完后重启服务生效systemctl restart network
1.2 在之前做实验的个人目录下添加三个文件夹,用来保存三个网站数据,同时分别写入网站首页文件。
mkdir -p /home/lwyroot/10; echo "IP:192.168.10.10" > /home/lwyroot/10/index.html
mkdir -p /home/lwyroot/20; echo "IP:192.168.10.20" > /home/lwyroot/20/index.html
mkdir -p /home/lwyroot/30; echo "IP:192.168.10.30" > /home/lwyroot/30/index.html
1.3 在httpd服务的主配置文件中添加三个基于IP地址的虚拟主机网站参数vim /etc/httpd/conf/httpd.conf;然后重启服务。
<VirtualHost 192.168.10.10>
DocumentRoot /home/lwyroot/10
ServerName www.linuxprobe.com
<Directory /home/lwyroot/10>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.10.20>
DocumentRoot /home/lwyroot/20
ServerName bbs.linuxprobe.com
<Directory /home/lwyroot/20>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.10.30>
DocumentRoot /home/lwyroot/30
ServerName tech.linuxprobe.com
<Directory /home/lwyroot/30>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
1.4 查看网站数据保存目录的安全上下文值 ls -Zd /home/lwyroot/10 是否是httpd_sys_content_t,如果不是的话分别设置:
setmanage fcontext -a -t httpd_sys_content_t /home/lwyroot
setmanage fcontext -a -t httpd_sys_content_t /home/lwyroot/10
setmanage fcontext -a -t httpd_sys_content_t /home/lwyroot/10/*
setmanage fcontext -a -t httpd_sys_content_t /home/lwyroot/20
setmanage fcontext -a -t httpd_sys_content_t /home/lwyroot/20/*
setmanage fcontext -a -t httpd_sys_content_t /home/lwyroot/30
setmanage fcontext -a -t httpd_sys_content_t /home/lwyroot/30/*
设置完成后重置生效:restorecon -Rv /home/lwyroot
1.5 打开firefox浏览器,输入IP地址,查看网页内容的不同。
2. 基于主机域名访问。如果服务器无法为每个网址分配一个独立的IP地址,只要有一个有效的IP地址即可,手工定义IP地址和域名之间的对应关系。
2.1 定义关系,/etc/hosts是Linux强制把某个主机域名解析到指定IP地址的配置文件
vim /etc/hosts
>>192.168.10.10 域名1 域名2 域名3
使用ping 域名 的方式测试一下
2.2 创建三个目录保存不同网站数据,并加入网站首页文件
mkdir -p /home/lwyroot/www
mkdir -p /home/lwyroot/bbs
mkdir -p /home/lwyroot/tech
echo "www.linuxprobe.com.cn" > /home/lwyroot/www/index.html
echo "bbs.linuxprobe.com.cn" > /home/lwyroot/bbs/index.html
echo "tech.linuxprobe.com.cn" > /home/lwyroot/tech/index.html
2.3 编辑httpd的主配置文件,写入三个基于主机名的虚拟主机网站参数,保存退出后,需要重启httpd服务才能生效。
<VirtualHost 192.168.10.10>
DocumentRoot "/home/lwyroot/www"
ServerName "www.linuxprobe.com"
<Directory "/home/lwyroot/www">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.10.10>
DocumentRoot "/home/lwyroot/bbs"
ServerName "bbs.linuxprobe.com"
<Directory "/home/lwyroot/bbs">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.10.10>
DocumentRoot "/home/lwyroot/tech"
ServerName "tech.linuxprobe.com"
<Directory "/home/lwyroot/tech">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
systemctl restart httpd
2.4 将三个目录设为httpd_sys_content_t安全上下文,设置完成后重置生效:restorecon -Rv /home/lwyroot
3. 基于端口号。基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。与之前两种方式相比,基于端口号这种方式更加复杂一点,除了配置httpd服务、考虑SElinux对httpd数据存放路径监控意外还要考虑SELinux对端口号的限制。通常来讲,80/443/8080这些端口号是默认提供网站访问服务的法定默认端口,现在要换其他端口则必须考虑SELinux域这个问题。
3.1 创建两个文件夹,并分别在两个文件夹中添加网页文件
mkdir -p /home/lwyroot/6111
mkdir -p /home/lwyroot/6222
echo "66666666666111111111111" > /home/lwyroot/6111/index.html
echo "66666666666222222222" > /home/lwyroot/6222/index.html
3.2 编辑httpd主配置文件
vim /etc/httpd/conf/httpd.conf
Listen 6111 # 监听6111端口
Listen 6222 # 监听6222端口
<VirtualHost 192.168.10.10:6111> # 注意IP地址和端口号之间只有一个冒号,端口号也是此次配置最重要的地方
DocumentRoot "/home/lwyroot/6111"
ServerName www.linuxprobe1.com
<Directory "/home/lwyroot/6111">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.10.10:6222> # 注意IP地址和端口号之间只有一个冒号
DocumentRoot "/home/lwyroot/6222"
ServerName www.linuxprobe2.com
<Directory "/home/lwyroot/6222">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
3.3 设置SELinux对于网页数据保存目录的安全上下文,设置为httpd_...的,记得设置完重置restorecon
3.4 此时网站还是没有出来,因为SELinux服务检测到6111和6222端口原本并不属于APache服务 应该需要的资源,但是现在却以httpd服务的名义监听使用了,所以SELinux拒绝APache使用这两个端口,需要设置。首先使用semanage命令查询并过滤所有与HTTP协议相关且SELinux服务允许的端口列表。
semanage port -l | grep http 然后查看http_port_t tcp一行,都是当前服务的默认端口,需要在这里添加6111和6222
添加:semanage port -a -t http_port_t -p tcp 6111
semanage port -a -t http_port_t -p tcp 6222
3.5 最后成功重启httpd服务,在网页输入IP:端口(192.168.10.10:6111),查看网页内容。