apache程序是目前拥有很高的市场占有率的web服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。apache是RHEL7系统中默认的web服务程序。
在安装前,根据不同的安装方式选择不同的安装方法。在本例中,使用光盘系统镜像的方法安装apache。因为apache是centos8中默认的web服务程序,所以在iso
系统安装文件内存在apache软件。因此可以直接使用系统镜像安装。
[root@MyCentOS ~]# mkdir -p /media/cdrom ///-p参数表示迭代创建文件夹
[root@MyCentOS ~]# mount /dev/cdrom /media/cdrom ///挂载系统镜像到创建的文件夹
[root@MyCentOS ~]# vim /etc/yum.repos.d/httpd.repo
[httpd] ///仓库唯一标识符
name=httpd ///仓库名称描述,识别仓库用处
baseurl=file:///media/cdrom ////提供方式包括FTP(ftp://..)、HTTP(http://..)、本地(file://..)当使用网络安装时,填写网络下载//地址即可
enable=1 //是否可用(可用)
gpgcheck=0 //是否校验(不校验)
[root@MyCentOS ~]# yum install httpd
- Curl error (37): Couldn't read a file:// file for file:///media/cdrom/repodata/repomd.xml [Couldn \'t open file /media/cdrom/repodata/repomd.xml]
错误:Failed to download metadata for repo 'httpd': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
产生错误,无法读取repomd.xml文件。在网上查找多篇文章,均是没有挂载文件导致的,没有解决我的问题。最后在参考了一篇文章之后,先下载使用阿里云的CentOS-8.repo软件仓库 。
[root@MyCentOS ~ yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-8.repo
[root@MyCentOS ~ yum.repos.d]# yum clean all ///清除yum缓存
[root@MyCentOS ~ yum.repos.d]# yum makecache ///将服bai务器上的软件包信息 现在本地缓存du,以提高 搜索 安装软件的速度
将阿里云centos8
的软件仓库下载至/etc/yum.repos.d/
文件夹下。此时再执行yum install httpd
命令发现还是出现之前的错误。
[root@MyCentOS ~ yum.repos.d]# vim Centos-8.repo
enabled=0 /////将该项参数改为0,将此源改为禁用,或者删除这个文件也可以达到同样的效果
[root@MyCentOS yum.repos.d]# yum install httpd
yum install httpd
Repository AppStream is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository PowerTools is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
上次元数据过期检查:0:00:14 前,执行于 2020年08月07日 星期五 20时18分58秒。
依赖关系解决。
.........省略输出........
已安装:
apr-1.6.3-9.el8.x86_64 apr-util-1.6.1-6.el8.x86_64 apr-util-bdb-1.6.1-6.el8.x86_64
apr-util-openssl-1.6.1-6.el8.x86_64 centos-logos-httpd-80.5-2.el8.noarch httpd-2.4.37-21.module_el8.2.0+382+15b0afa8.x86_64
httpd-filesystem-2.4.37-21.module_el8.2.0+382+15b0afa8.noarch httpd-tools-2.4.37-21.module_el8.2.0+382+15b0afa8.x86_64 mod_http2-1.11.3-3.module_el8.2.0+307+4d18d695.x86_64
完毕!
[root@MyCentOS ]# systemctl start httpd
[root@MyCentOS ]# systemctl enable httpd
刚开始一直按照书上的操作,本地下载httpd
,但是一直未能成功。看了其他人的安装踩坑经验,觉得可能是虚拟机与实际主机网络的连接方式有关。开始一直在使用书上说的自己创建软件仓库,安装httpd
,后来不行就换了网易163的镜像仓库源,然后又用了阿里云的镜像仓库源。导致在服务器上存在重复的软件仓库,同时自行创建的httpd
仓库一直和阿里云的镜像源、网易163的镜像源产生冲突。个人见解:
-------------------------------------------------------linux系统中的配置文件--------------------------------------------------
配置文件名称 | 存放位置 |
---|---|
服务目录 | /etc/httpd |
主配置文件 |
/etc/httpd/conf/httpd.conf |
网站数据目录 | /var/www/html |
访问日志 | /var/log/httpd/access_log |
错误日志 | /var/log/httpd/error_log |
--------------------------------------------------配置httpd服务常用参数及用途----------------------------------------------
参数 | 用途 |
---|---|
ServerRoot | 服务目录 |
ServerAdmin | 管理员邮箱 |
User | 运行服务的用户 |
Group | 运行服务的用户组 |
ServerName | 网站服务器的域名 |
DocumentRoot | 网站数据目录 |
Directory | 网站数据目录的权限 |
Listen | 监听的IP地址与端口号 |
DirectoryIndex | 默认的索引页页面 |
ErrorLog | 错误日志文件 |
CustomLog | 访问日志文件 |
Timeout | 网页超时实践,默认为300秒 |
之前部署网站时在一个服务器上只能部署一个网站,资源利用不够充分,因此使用虚拟主机功能能在一台主机上部署多个网站,降低建设成本。
功能: 利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。但是无法实现硬件资源隔离。
apache虚拟主机功能: 是服务器基于用户请求的不同IP地址、主机域名或端口奥,实现提供多个网站同时为外部提供访问服务的技术。
如果一台服务器有多个IP地址,而且每个IP地址与服务器上部署的每个网站一 一对应,则用户请求访问不同IP地址时,就能访问到不同网站上的资源。
以部署两个网站为例
在SELinux子系统初探中,将/home/wwwroot
设置为了网站数据存放路径。所以在该路径下创建两个文件夹,分别存放三个网站的网站数据。
[yan@MyCentOS wwwroot]$ ll
总用量 0
drwxrwxr-x. 2 yan yan 24 8月 9 10:14 first
drwxrwxr-x. 2 yan yan 24 8月 9 10:15 second
drwxrwxr-x. 2 yan yan 24 8月 9 10:16 third
配置网卡有两种方法,分别为直接编辑在/etc/sysconfig/network-scripts
路径下的本机网卡文件或者使用nmtui
命令。
[root@MyCentOS]# nmcli connection show
NAME UUID TYPE DEVICE
ens33 5861a166-80d9-4390-bcb6-922e870be1f0 ethernet ens33
virbr0 c90f02ea-100a-4754-9b41-c54768c7eec8 bridge virbr0
company de8266c9-608e-405c-99a9-b19a604894e0 ethernet --
house c42775b6-1af7-4cd4-b59e-9eba6f0691a9 ethernet --
我的主机网卡文件为ens33。所以编辑/etc/sysconfig/network-scripts
下的ifcfg-ens33
网卡文件。
查看本机网关地址,使用route -n
查看网关及IP地址。
[root@MyCentOS network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.127.2 0.0.0.0 UG 100 0 0 ens33 《《《《网关地址
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.127.2 0.0.0.0 255.255.255.255 UH 100 0 0 ens33
如下所示。
[root@MyCentOS network-scripts]# vim ifcfg-ens33
HWADDR=00:0C:29:E6:75:0B
TYPE=Ethernet
BOOTPROTO=static 《《《《《《《关键点1:将DHCP修改为static,地址分配模式设置为静态手动指定,不自动获取
DEFROUTE=yes
PEERDNS=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=5861a166-80d9-4390-bcb6-922e870be1f0
ONBOOT=yes 《《《《《《 设置为开机自动启动
IPADDR=192.168.10.10 《《ip地址1
PREFIX=24
IPADDR1=192.168.10.20 《《《《IP地址2
PREFIX1=24
IPADDR2=192.168.10.30 《《《《IP地址3
PREFIX2=24
GATEWAY=192.168.127.2 《《《《 本机网关
DNS1=114.114.114.114 《《《《指定DNS服务器地址1
DNS2=8.8.8.8 《《《《指定DNS服务器地址2
[root@MyCentOS network-scripts]# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.043 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.042 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.063 ms
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 69ms
rtt min/avg/max/mdev = 0.042/0.060/0.094/0.022 ms
[root@MyCentOS network-scripts]# ping -c 4 192.168.10.20
PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.
64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time=0.184 ms
64 bytes from 192.168.10.20: icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from 192.168.10.20: icmp_seq=4 ttl=64 time=0.058 ms
--- 192.168.10.20 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 113ms
rtt min/avg/max/mdev = 0.048/0.086/0.184/0.057 ms
[root@MyCentOS network-scripts]# ping -c 4 192.168.10.30
PING 192.168.10.30 (192.168.10.30) 56(84) bytes of data.
64 bytes from 192.168.10.30: icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 192.168.10.30: icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from 192.168.10.30: icmp_seq=3 ttl=64 time=0.083 ms
64 bytes from 192.168.10.30: icmp_seq=4 ttl=64 time=0.078 ms
--- 192.168.10.30 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 96ms
rtt min/avg/max/mdev = 0.044/0.072/0.083/0.016 ms
bingo!!! 现在在我们主机上拥有3个内网IP地址。接下来通过,三个IP地址,配置三个网站。
在/etc/httpd/conf/httpd.conf
中修改参数,其中VirtualHost
参数表示虚拟主机功能。
第一段话翻译:
请注意,从这一点开始,您必须特别允许启用某些特性——因此,如果某些特性不像您预期的那样工作,请确保您在下面特别启用了它。
[root@MyCentOS conf]# vim httpd.conf
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#虚拟主机IP1
<VirtualHost 192.168.10.10>
DocumentRoot /home/wwwroot/first
ServerName www.boomshakaraka.com
<Directory /home/wwwroot/first>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
#虚拟主机IP2
<VirtualHost 192.168.10.20>
DocumentRoot /home/wwwroot/second
ServerName www.boomsha.com
<Directory /home/wwwroot/second>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
#虚拟主机IP3
<VirtualHost 192.168.10.30>
DocumentRoot /home/wwwroot/third
ServerName www.boom.com
<Directory /home/wwwroot/third>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
在SElinux安全子系统初探一文中,我们修改了网站数据存储路径为/home/wwwroot
。现在我们要在该目录下创建的三个文件夹作为三个网站的网站数据存放文件。正如之前修改网站数据存放路径一样,现在也需要分别对三个网站数据文件目录设置SELinux安全上下文。
[root@MyCentOS conf]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
ValueError: /home/wwwroot 的文件上下文已定义
[root@MyCentOS conf]# semanage fcontext -a -t httpd_sys_content_t /home/yang/wwwroot
[root@MyCentOS conf]# semanage fcontext -a -t httpd_sys_content_t /home/yang/wwwroot/first
[root@MyCentOS conf]# semanage fcontext -a -t httpd_sys_content_t /home/yang/wwwroot/first/*
[root@MyCentOS conf]# semanage fcontext -a -t httpd_sys_content_t /home/yang/wwwroot/second
[root@MyCentOS conf]# semanage fcontext -a -t httpd_sys_content_t /home/yang/wwwroot/second/*
[root@MyCentOS conf]# semanage fcontext -a -t httpd_sys_content_t /home/yang/wwwroot/third
[root@MyCentOS conf]# semanage fcontext -a -t httpd_sys_content_t /home/yang/wwwroot/third/*
[root@MyCentOS conf]# restorecon -Rv /home/yang/wwwroot
Relabeled /home/yang/wwwroot from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/yang/wwwroot/first from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/yang/wwwroot/first/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/yang/wwwroot/second from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/yang/wwwroot/second/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/yang/wwwroot/third from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/yang/wwwroot/third/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
基于主机域名配置多个网站的原理及流程如下图所示。
当只有一个IP地址时,可以让Apache自动识别用户请求的域名,从而根据不同的域名传输不同的内容。如果没有配置DNS解析服务,则可以使用手工定义IP地址与域名之间对应关系。在/etc/hosts
是linux系统中用于强制把某个主机域名解析到指定IP的配置文件。
首先,将IP地址还原为只有一个。即编辑ifcfg-ens33
文件将其中多余的IP地址注释,同时注释DNS地址。再使用ip addr
查看当下主机IP地址。如下所示。
[root@MyCentOS ~]# ip addr
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:e6:75:0b brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::b4ec:5340:9b56:19bb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
手工定义IP地址与域名之间对应关系的配置文件。
[root@MyCentOS ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.10 www.boomshakaraka.com wwww.boomsha.com wwww.boom.com
[root@MyCentOS ~]# ping -c 4 www.boom.com
PING www.boom.com (42.200.23.6) 56(84) bytes of data.
64 bytes from 42-200-23-6.static.imsbiz.com (42.200.23.6): icmp_seq=1 ttl=128 time=42.9 ms
64 bytes from 42-200-23-6.static.imsbiz.com (42.200.23.6): icmp_seq=2 ttl=128 time=42.3 ms
64 bytes from 42-200-23-6.static.imsbiz.com (42.200.23.6): icmp_seq=3 ttl=128 time=42.5 ms
64 bytes from 42-200-23-6.static.imsbiz.com (42.200.23.6): icmp_seq=4 ttl=128 time=42.9 ms
--- www.boom.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 175ms
rtt min/avg/max/mdev = 42.329/42.656/42.929/0.289 ms
因为前面创建了,所以这一步省略。
与上一个基于IP地址配置httpd服务的步骤相似,只需将
中的IP地址改为主机的IP地址即可。
[root@MyCentOS ~]# vim /etc/httpd/conf/httpd.conf
#虚拟主机IP1
<VirtualHost 192.168.10.10>
DocumentRoot /home/yan/wwwroot/first
ServerName www.boomshakaraka.com
<Directory /home/yan/wwwroot/first>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
#虚拟主机IP2
<VirtualHost 192.168.10.10>
DocumentRoot /home/yan/wwwroot/second
ServerName www.boomsha.com
<Directory /home/yan/wwwroot/second>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
#虚拟主机IP3
<VirtualHost 192.168.10.10>
DocumentRoot /home/yan/wwwroot/third
ServerName www.boom.com
<Directory /home/yan/wwwroot/third>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
因为再基于IP地址部署多个网站的实验中,成功配置了网站数据的SELinux安全上下文。详情见上文。在修改完网站数据目录SElinux安全上下文后,需重启httpd服务。
省略。。。。。。,详情见基于IP地址部署多个网站
[root@MyCentOS ~]# vim /etc/httpd/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 80
Listen 7123
Listen 7124
Listen 7125
[root@MyCentOS ~]# vim /etc/httpd/conf/httpd.conf
#虚拟主机IP1
<VirtualHost 192.168.10.10:7123> 《《《关键点
DocumentRoot /home/yang/wwwroot/first
ServerName www.boomshakaraka.com
<Directory /home/yang/wwwroot/first>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
#虚拟主机IP2
<VirtualHost 192.168.10.10:7124>
DocumentRoot /home/yang/wwwroot/second
ServerName www.boomshak.com
<Directory /home/yang/wwwroot/second>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
#虚拟主机IP3
<VirtualHost 192.168.10.10:7125>
DocumentRoot /home/yang/wwwroot/third
ServerName www.boomsh.com
<Directory /home/yang/wwwroot/third>
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
省略,详情见基于IP地址部署多个网站实验。
[root@MyCentOS ~]# semanage port -a -t http_port_t -p tcp 7123
[root@MyCentOS ~]# semanage port -a -t http_port_t -p tcp 7124
[root@MyCentOS ~]# semanage port -a -t http_port_t -p tcp 7125
[root@MyCentOS ~]# 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 7125, 7124, 7123, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
[root@MyCentOS ~]# systemctl restart httpd
每次设置后最好都重启httpd服务
apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。
for example
在httpd的主配置文件中
域中添加如下指令
Order allow,deny
Allow from 192.168.10.10
表示允许该IP地址的主机进行访问,否则禁止。