httpd服务之创建虚拟主机----基于不同域名的虚拟主机(含脚本)
一、虚拟主机
在服务器上安装好httpd服务后运行时只有一个站点,那么在现实的生产环境中由于运营成本、服务器数量有限等多种因素造成,在同一台服务器中运行多个站点的现实情况。那么既然一台服务器安装好httpd服务后只有一个站点可以运行,该如何在一台服务器中运行多个站点呢?这时就需要虚拟主机的帮助。
httpd服务支持的虚拟主机的类型有:基于不同域名的虚拟主机、基于不同IP地址的虚拟主机和基于不同端口的虚拟主机。
二、基于不同域名的虚拟主机安装
-
首先准备好环境。因为本次虚拟主机是基于httpd服务的而不同的域名是根据DNS域名解析得来的,所以要提前安装好httpd和bind。图2.1
图2.1
-
关闭防火墙,不然会影响实验结果。
-
实验环境安装好了之后,首先对httpd服务进行配置。因为是虚拟主机所以在httpd服务的配置文件路径下传建一个名为extra的目录。图2.2
图2.2
-
在extra目录下创建vhost.conf作为虚拟主机的配置文件。图2.3 最重要的是虚拟主机配置文件内容。图2.4
图2.3
图2.4
-
配置好了虚拟主机配置文件后,现在此文件依然无法与httpd服务的主配置文件进行关联,所以在运行后是无法运行站点的。所以这时要进入**/etc/httpd/conf/httpd.conf**中添加一条命令是虚拟主机的路径使其与主配置文件关联。图2.5
图2.5
-
现在httpd服务已经完成了,下面要做的就是配置DNS域名解析服务也就是named服务。首先修改其主配置文件路径为:/etc/named,修改其监听地址和允许访问的地址都为any。图2.6
图2.6
-
下面配置区域配置文件,在**/etc/name.rfc1912.zones**中设置相应的域名和相关联的区域数据配置文件名。图2.7
图2.7
-
在**/var/named目录里将原有的named.localhoist**文件进行保留权限的复制并改为相应的名称与上一步的域名对应。具体配置如图2.8
图2.8
-
这时启动所有服务,就可以在游览器中输入相对应的域名就可以进入设置好的虚拟主机。图2.9
图2.9
三、脚本安装虚拟主机及总结
为此我特地只做了一个安装不同域名的虚拟主机脚本。具体内容如下:
#!/bin/bash
#这是httpd添加虚拟主机的脚本
#不同域名相同IP和端口号
#关闭防火墙
systemctl stop firewalld
setenforce 0 > /dev/null
#判断是否安装了httpd、bind服务
while true
do
rpm -q httpd bind &> /dev/null
if [ $? -eq 0 ];then
echo "已安装了httpd、bind服务"
break
else
echo "正在安装httpd、bind"
yum install httpd bind -y &> /dev/null
rpm -q httpd &> /dev/null
if [ $? -eq 0 ];then
echo "安装成功"
break
else
echo "安装失败"
read -p "是否再次安装?(y/n)" a
if [ $a = "y" ];then
continue
else
echo "退出脚本"
exit 1
fi
fi
fi
done
#ip地址
echo "获取IP地址。"
ip=`ifconfig | grep "inet" | awk 'NR==1 {print $2}'`
#创建extra
cd /etc/httpd/conf
mkdir extra
#建立虚拟主机配置文件
cd extra
touch vhost.conf
#输入域名
while true
do
#配置虚拟主机
read -p "请输入你想要的域名(如,www.xxx.com中的xxx):" name
cat >> /etc/httpd/conf/extra/vhost.conf <<EOF
<VirtualHost *:80>
DocumentRoot "/var/www/html/$name/"
ServerName www.$name.com
ErrorLog "logs/www.$name.com.error_log"
CustomLog "logs/www.$name.com.access_log" common
<Directory "/var/www/html/">
Require all granted
</Directory>
</VirtualHost>
EOF
#创建家目录
mkdir /var/www/html/$name
touch /var/www/html/$name/index.html
echo "this is test $name" > /var/www/html/$name/index.html
#DNS数据文件
sed -i "12azone \"$name.com\" IN {\n type master;\n file \"$name.com.zone\";\n allow-update { none; };\n};\n" /etc/named.rfc1912.zones
#DNS区域数据文件
cp -p /var/named/named.localhost /var/named/$name.com.zone
sed -i '10d' /var/named/$name.com.zone
echo "www IN A $ip" >> /var/named/$name.com.zone
read -p "是否继续添加域名(y/n)?" xz
if [ $xz = "y" ];then
continue
else
break
fi
done
#配置httpd配置文件
echo "Include conf/extra/vhost.conf" >> /etc/httpd/conf/httpd.conf
#DNS主配置文件
sed -i 's/127.0.0.1/any/' /etc/named.conf
sed -i '/allow-query/s/localhost/any/' /etc/named.conf
systemctl start named
systemctl start httpd
echo "配置完成"
echo "当前IP地址为$ip"
在写这篇脚本时我犯了许多错误,尤其是在使用正则表达式时,没有很好的使用提取出相关信息导致域名解析服务无法正常开启,这时我就要返回去继续修改脚本。还有一点要注意的是虚拟主机的配置文件一定要与httpd的主配置文件相关联否则虚拟主机无法生效!