[RHEL]-16-使用Apache服务部署网站

引言

这篇文章将详解RHEL系统中Apache服务的部署与三种主机服务(基于IP的虚拟主机,基于域名的虚拟主机,基于端口号的虚拟主机)的搭建。

文章目录

0×1.Apache安装与配置

实验环境:

安装了RHEL7系统的虚拟机,模拟服务器,IP 192.168.1.103/24;
模拟外部访问的主机Ubuntu,模拟客户机,IP 192.168.1.105/24;
两台主机处于同一局域网中,并能够互相ping通;

Apache在RHEL7中默认没有安装,在配置好yum源后,可以使用下面的命令安装并设置成开机启动:

					#安装httpd服务
					[root@qingsword.com ~]# yum install -y httpd

					#安装完成后,启动服务
					[root@qingsword.com ~]# systemctl start httpd

					#设置成开机自启动,想移除httpd的开机自启动,只需要将enable改为disable即可
					[root@qingsword.com ~]# systemctl enable httpd
					

Ps:服务启动成功后在服务器浏览器上自己能访问自己,但局域网中的客户机无法打开103默认页面,这是因为RHEL的iptables防火墙的原因,如果懂iptables防火墙的朋友可以将httpd的80端口加到防火墙的配置中,并允许所有外部的访问,本例直接使用"iptables -F"清空防火墙的规则,之后客户机就能顺利访问服务机的默认页面了。

Apache有下面这几个重要的文件和文件夹:

					# /etc/httpd/ 服务配置主目录
					# /etc/httpd/conf/httpd.conf 服务主配置文件(重要)
					[root@qingsword.com ~]# ls /etc/httpd/
					conf  conf.d  conf.modules.d  logs  modules  run

					# /var/log/httpd/access_log 服务访问日志
					# /var/log/httpd/error_log 服务错误日志
					[root@qingsword.com ~]# ls /var/log/httpd/
					access_log  error_log

					# /var/www/html/ 网站默认的根目录(可以在httpd.conf主配置文件中修改)
					[root@qingsword.com ~]# ls -dl /var/www/html/
					drwxr-xr-x. 2 root root 6 Jul 18 11:30 /var/www/html/
					

使用vim打开/etc/httpd/conf/httpd.conf服务主配置文件,内容非常之多,但实际应用中能够用到的重要参数主要有下面这几个:

					[root@qingsword.com ~]# vim /etc/httpd/conf/httpd.conf

					#服务主目录位置
					ServerRoot "/etc/httpd"

					#管理员邮箱地址,当网站出现问题时,错误信息中会携带这个邮箱地址
					ServerAdmin root@localhost
					
					#服务是以哪个用户和用户组运行的
					User apache
					Group apache
					
					#服务默认监听的端口号
					Listen 80

					#网站默认的根目录地址
					DocumentRoot "/var/www/html"

					# Relax access to content within /var/www.
					#对包含网站根目录的目录做权限设置,保持原样即可,如果更改了上面的DocumentRoot地址,也需要更改下面的地址,稍后会实例演示
					<Directory "/var/www">
					    AllowOverride None
					    # Allow open access:
					    Require all granted
					</Directory>

					# Further relax access to the default document root:
					#对网站根目录的权限设置,建议去掉Options参数中的Indexes权限,当目录中没有找到默认页面时,这个权限会将目录中所有文件都遍历显示出来,这样非常的不安全
					<Directory "/var/www/html">
					    Options Indexes FollowSymLinks
					    AllowOverride None
					    Require all granted
					</Directory>

					#DirectoryIndex可以设定网站默认访问的文件名称,如果客户端仅输入一个IP或域名,httpd服务就会查找网站根目录中的index.html文件,并将它作为默认的主页,可以用逗号分隔添加多个默认主页,httpd服务会按照先后顺序去查找并且调用(即找到一个文件后,立即返回,并结束查找)
					<IfModule dir_module>
					    DirectoryIndex index.html
					</IfModule>
					
					#相对于主配置文件的错误日志文件路径,实际上在/etc/httpd/中的logs文件夹只是个软连接,指向了/var/log/httpd/,所以这里指定的错误日志文件,就是/var/log/httpd/error_log
					ErrorLog "logs/error_log"
					

了解了上面这些常用配置后,可以尝试着往网站根目录写入一个"index.html",根据上面的配置,我们刷新页面后,就能够看到默认主页中的内容了:

					[root@qingsword.com ~]# echo "www.qingsword.com" > /var/www/html/index.html
					

0×2.SElinux子系统对Apache配置的限制

SElinux子系统是美国国防部开发的,它制定了一套详细的标准,它限制了每个服务所能访问的文件及其对应的端口,如果这些文件或端口号发生了变化,就会被SElinux子系统拒绝访问,下面会分别尝试着修改httpd主配置文件中的网站目录以及httpd对应的端口号,来测试SElinux,并且提供解决方案:

实例一:修改默认网站根目录:

					#编辑主配置文件,修改DocumentRoot位置以及后面的两个目录路径如下
					[root@qingsword.com ~]# vim /etc/httpd/conf/httpd.conf
					
					#将根目录修改成/home/www
					DocumentRoot "/home/www"

					# Relax access to content within /var/www.
					#修改对应的父目录的权限以及根目录的权限
					<Directory "/home">
					    AllowOverride None
					    # Allow open access:
					    Require all granted
					</Directory>

					# Further relax access to the default document root:
					<Directory "/home/www">
					    Options FollowSymLinks #去掉了Indexes
					    AllowOverride None
					    Require all granted
					</Directory>
					
					#创建出对应目录并修改权限为755
					[root@qingsword.com ~]# mkdir -p /home/www
					[root@qingsword.com ~]# chmod 755 /home/www
					[root@qingsword.com ~]# ls -dl /home/www
					drwxr-xr-x. 2 root root 6 Nov 24 00:00 /home/www
					
					#创建默认的主页文件
					[root@qingsword.com ~]# echo "www.qingsword.com /home/www/index.html" > /home/www/index.html

					#需要重启httpd服务
					[root@qingsword.com ~]# systemctl restart httpd
					

重启服务后,从客户端访问服务端网页的时候,发现看到的是默认页面,并不是我们上面修改的默认主页,这是因为我们虽然修改了配置文件指向了新的目录,但因为SElinux是启动的,而新建的网站根目录与原来的默认根目录的"安全上下文"并不相同,所以阻止了访问:

					#查看SElinux的启动状态
					[root@qingsword.com ~]# getenforce 
					Enforcing 

					#SElinux的配置文件,可以设置三种模式
					[root@qingsword.com ~]# more /etc/selinux/config 
					# enforcing - 启动模式,会拦截服务的不合法请求
					# permissive - 忽略模式,遇到不合法请求仅给出警告
					# disabled - 完全关闭
					SELINUX=enforcing
					SELINUXTYPE=targeted

					#在大多数文档或工作中,因为程序员不太了解SElinux,都是直接通过下面的命令(或修改上面的配置文件),将SElinux关闭,大家可以尝试着使用这种方法,会发现客户端刷新页面后,就能访问我们修改的主页了
					[root@qingsword.com ~]# setenforce 0
					
					#但现在我们需要在SElinux开启的情况下达到能够访问修改后的根目录的效果,所以,使用下面的命令,保证SElinux处于开启状态
					[root@qingsword.com ~]# setenforce 1

					#首先,查看下原默认根目录的"安全上下文",使用ls添加-Z参数来查看,注意到输出的"httpd_sys_content_t"这一段,这就是这个文件夹的默认安全上下文,只需要将新的根目录的安全上下文改成与这个相同即可
					[root@qingsword.com ~]# ls -ldZ /var/www/html
					drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

					#新目录的安全上下文如下
					[root@qingsword.com ~]# ls -ldZ /home/www
					drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 /home/www

					#将新根目录的"安全上下文"修改成"httpd_sys_content_t"
					# -a 新增或修改
					# -t 修改后的类型
					#注意:目录路径末尾不能有"/"否则会报错(例如/home/www/就是错的,必须写成/home/www)
					#下面的两条命令将/home/www目录以及目录中的所有文件的安全上下文都修改成"httpd_sys_content_t"
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/*

					#修改完成后,使用restorecon命令刷新目录的安全上下文(立即生效,如果不使用这条命令,上面的修改不会立刻生效)
					# -R 对目录进行递归处理
					# -v 显示详细信息
					#从输出中可以看到,新目录的安全上下文已被替换成功
					[root@qingsword.com ~]# restorecon -Rv /home/www
					restorecon reset /home/www context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
					restorecon reset /home/www/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
					

此时,再次从客户端访问192.168.1.103就能够看到我们创建的默认主页了。

Ps:以后对任何服务的默认路径的修改,如果SElinux做出了限制,都可以使用相同的方法,首先查看默认路径的安全上下文,然后将其替换到新目录上,这样就不需要关闭SElinux了,SElinux的配置虽然繁琐,但确实提高了系统的安全性。

实例二:修改默认网站服务端口号

					#将httpd服务默认的端口号从80,修改成2333
					[root@qingsword.com ~]# vim /etc/httpd/conf/httpd.conf
					Listen 2333

					#重启httpd服务的时候确报错了
					[root@qingsword.com ~]# systemctl restart httpd
					Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
					
					#这是因为,SElinux限制了httpd的默认端口号,当使用一个未定义的端口号时被SElinux阻止了,可以通过下面的方法查看和添加

					#http_port_t中所包含的端口都可以作为httpd对外服务端口,但却没有我们定义的2333
					[root@qingsword.com ~]# semanage port -l | grep http
					http_cache_port_t    tcp  8080, 8118, 8123, 10001-10010
					http_cache_port_t    udp  3130
					http_port_t          tcp  80, 81, 443, 488, 8008, 8009, 8443, 9000
					pegasus_http_port_t  tcp  5988
					pegasus_https_port_t tcp  5989

					#将2333添加到http_port_t中(如果要删除这个端口,就将下面参数中的-a替换成-d)
					[root@qingsword.com ~]# semanage port -a -t http_port_t -p tcp 2333

					#再次重启服务,一切正常,现在就能够使用192.168.1.103:2333来访问我们的默认页面了
					[root@qingsword.com ~]# systemctl restart httpd
					

0×3.使用Apache配置虚拟主机服务

在上面介绍的方法中,我们可以直接将网页文件放置在网页的根目录中来被客户端访问,但一般情况下一台服务器不可能只用来存放一个网站的文件,使用虚拟主机功能,可以实现在同一台服务器中同时存放多个网站的文件,不同的网站文件存放在网页根目录下不同的目录中,互不影响,下面将介绍三种最常见的虚拟主机配置方式。

a.基于IP地址的虚拟主机

实验环境:

安装了RHEL7系统的虚拟机,模拟服务器;
Ubuntu主机,模拟客户机,IP 192.168.1.105/24;
两台主机处于同一局域网中;

首先在服务器上使用nmtui工具,给服务器添加多个IP地址来模拟服务器的多网卡多IP,编辑当前正在使用的网卡,如下图所示:

rhel-apache-1.jpg

确保客户机能够ping通这三个IP地址,然后修改httpd.conf文件创建三个基于IP的虚拟主机:

					[root@qingsword.com ~]# vim /etc/httpd/conf/httpd.conf

					#将本文第二部分实验中修改的默认端口重新修改成80
					Listen 80

					#将根目录修改成/home/www(也可以直接使用默认的根目录/var/www/html,但也要替换下面所有的根目录,保持一致)
					DocumentRoot "/home/www"

					# Relax access to content within /var/www.
					#修改对应的父目录的权限以及根目录的权限
					<Directory "/home">
					    AllowOverride None
					    # Allow open access:
					    Require all granted
					</Directory>

					# Further relax access to the default document root:
					<Directory "/home/www">
					    Options FollowSymLinks #去掉了Indexes
					    AllowOverride None
					    Require all granted
					</Directory>

					#在上面这两个主目录的权限配置之下,再添加三个基于IP的虚拟主机配置,分别对应了三个IP地址
					<VirtualHost 192.168.1.233>
					    DocumentRoot "/home/www/233"
					    ServerName "233.qingsword.com"
					 <Directory "/home/www/233">
					    AllowOverride None
					    Require all granted
					 </Directory>
					</VirtualHost>

					<VirtualHost 192.168.1.234>
					    DocumentRoot "/home/www/234"
					    ServerName "234.qingsword.com"
					 <Directory "/home/www/234">
					    AllowOverride None
					    Require all granted
					 </Directory>
					</VirtualHost>

					<VirtualHost 192.168.1.235>
					    DocumentRoot "/home/www/235"
					    ServerName "235.qingsword.com"
					 <Directory "/home/www/235">
					    AllowOverride None
					    Require all granted
					 </Directory>
					</VirtualHost>

					#创建出这三个目录并写入默认的主页文件
					[root@qingsword.com ~]# mkdir -p /home/www/233
					[root@qingsword.com ~]# mkdir -p /home/www/234
					[root@qingsword.com ~]# mkdir -p /home/www/235
					[root@qingsword.com ~]# echo "www.qingsword.com 233 page." > /home/www/233/index.html
					[root@qingsword.com ~]# echo "www.qingsword.com 234 page." > /home/www/234/index.html
					[root@qingsword.com ~]# echo "www.qingsword.com 235 page." > /home/www/235/index.html

					#此时如果SElinux是开启状态,因为我们并没有使用默认的网站根目录,所以需要修改一下上面这些目录的"安全上下文",如果SElinux是关闭状态,可以跳过这一步
					[root@qingsword.com ~]# ls -ldZ /var/www/html/
					drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/233
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/233/*
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/234
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/234/*
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/235
					[root@qingsword.com ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/235/*
					[root@qingsword.com ~]# restorecon -Rv /home/www

					#重启httpd服务
					[root@qingsword.com ~]# systemctl restart httpd

					#现在在客户端上,使用上面的三个IP就能够访问到不同的虚拟主机,也可以修改客户端的hosts配置文件/etc/hosts,加入下面三条内容,就能够实现域名到独立IP的访问了(客户端中修改这个文件仅是为了模拟DNS解析)
					qing@qingsword.com:~$ sudo vim /etc/hosts
					192.168.1.233 233.qingsword.com
					192.168.1.234 234.qingsword.com
					192.168.1.235 235.qingsword.com
					

b.基于域名的虚拟主机

如果我们的服务器上只有一个IP地址,但又要对应不同的域名(即访问不同域名的时候解析到同一个IP下的不同目录中),这个时候就能够使用基于域名的虚拟主机,在上面实验的基础上,修改主配置文件:

					#其它配置全部不需要改动,只需要将三个虚拟主机配置头部中的三个IP都统一改成192.168.1.233
					[root@qingsword.com ~]# vim /etc/httpd/conf/httpd.conf
					<VirtualHost 192.168.1.233>

					#然后重启httpd服务
					[root@qingsword.com ~]# systemctl restart httpd

					#修改客户端的本地DNS解析文件,将三个域名指向同一个IP
					qing@qingsword.com:~$ sudo vim /etc/hosts
					192.168.1.233 233.qingsword.com
					192.168.1.233 234.qingsword.com
					192.168.1.233 235.qingsword.com
					

这样在客户机上访问不同域名,虽然这些域名都指向同一个IP,但每个域名对应了网站根目录下不同的目录,可以实现多域名共享同一个IP地址。

c.基于端口号的虚拟主机

如果我们想让客户端访问服务器的同一个IP的不同端口,能够访问到不同的网站内容,在上面实验的基础上,修改主配置文件:

					[root@qingsword.com ~]# vim /etc/httpd/conf/httpd.conf

					#添加三个监听端口
					Listen 2333
					Listen 7777
					Listen 8888

					#然后修改每个虚拟主机配置文件的头部如下
					<VirtualHost 192.168.1.233:2333>
					<VirtualHost 192.168.1.233:7777>
					<VirtualHost 192.168.1.233:8888>

					#根据前面的SElinux对于端口的限制可以知道,现在重启服务一定会报错,需要先将这三个端口添加到SElinux的http_port_t列表中
					[root@qingsword.com ~]# semanage port -a -t http_port_t -p tcp 2333
					[root@qingsword.com ~]# semanage port -a -t http_port_t -p tcp 7777
					[root@qingsword.com ~]# semanage port -a -t http_port_t -p tcp 8888

					#然后再重启httpd服务
					[root@qingsword.com ~]# systemctl restart httpd
					

现在就可以使用"192.168.1.233:2333"这种形式来访问到不同的网页了。