Linux加强篇010-使用Apache服务部署静态网站

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 山重水复疑无路,柳暗花明又一村

一、前言

悟已往之不谏知来者之可追实迷途其未远觉今而昨非。舟遥遥以轻飏风飘飘而吹衣。问征夫以前路恨晨光之熹微

第一版我已经全部放到我的精选里了,大家可以点开我的头像主页,选择精选观看,本系列依照《Linux就该这么学》第二版随书学习练习操作,将一些课本上不顺畅的地方,全部以最简方式免费开源展示给大家,资源大家可以自行百度,学习起来我们既要多巴胺也要内啡肽。

终于我们要开始做网站了,如果前9章用成长来形容,就是在地上学怎么爬,而网站搭建是我们站起来的第一步,跟着这个系列学到这里的人,出去找个基础运维的工作应该是十拿九稳的,找到工作不代表能胜任,从这一章开始我们要大步流星,古语说:勿意、勿必、勿固、勿我。正所谓承认自己的认知局限。得服高人,要留后路,做事果敢执着,且不执拗,别人劝你你要听,别太自以为是,送上天王的一首《听妈妈的话》希望可以继续好好学习,不忘初心牢记使命。

同时我也想说点别的,我其实也有惰性,有时候懒得学习,但是我相信知识改变命运,不要靠投机取巧,这是我对我专业的热爱和对职业的基本操守,希望大家以后入职或者现在工作的人能够得到一些启发。

10.1 网站服务程序

Web网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,最终用于提供服务程序的Web服务器会通过HTTP(超文本传输协议)或HTTPS(安全超文本传输协议)把请求的内容传送给用户。目前能够提供Web网络服务的程序有IIS、Nginx和Apache等。

1702879164151.jpg

Apache程序是目前拥有很高市场占有率的Web服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。Apache服务程序可以运行在Linux系统、UNIX系统甚至是Windows系统中,它支持基于IP、域名及端口号的虚拟主机功能,支持多种认证方式,集成有代理服务器模块、安全Socket层(SSL),能够实时监视服务状态与定制日志消息,并支持各类丰富的模块。

1702879267872.jpg

动手安装Apache服务程序。

[root@localhost ~]# dnf install -y httpd

启用httpd服务程序并将其加入到开机启动项中

[root@localhost ~]# systemctl start httpd

[root@localhost ~]# systemctl enable httpd

Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

在虚拟机的网页上输入http://127.0.0.1

image.png

10.2 配置服务文件参数

在Linux系统中配置服务,其实就是修改服务的配置文件,知道这些配置文件的所在位置以及用途。httpd服务程序的主要配置文件及存放位置

 Linux系统中的配置文件

作用 文件名称
服务目录 /etc/httpd
主配置文件 /etc/httpd/conf/httpd.conf
网站数据目录 /var/www/html
访问日志 /var/log/httpd/access_log
错误日志 /var/log/httpd/error_log

主配置文件中保存的是最重要的服务参数,一般会被保存到/etc目录中以软件名称命名的一个文件夹之中,名字为“服务名称.conf”在httpd服务程序的主配置文件中,存在3种类型的信息:注释行信息、全局配置、区域配置

1702943593138.jpg

阿帕奇的配置是我们以后学运维会经常用到的,这是重点内容

配置httpd服务程序时最常用参数及用途描述

参数 作用
ServerRoot 服务目录
ServerAdmin 管理员邮箱
User 运行服务的用户
Group 运行服务的用户组
ServerName 网站服务器的域名
DocumentRoot 网站数据目录
Listen 监听的IP地址与端口号
DirectoryIndex 默认的索引页页面
ErrorLog 错误日志文件
CustomLog 访问日志文件
Timeout 网页超时时间,默认为300秒

DocumentRoot参数用于定义网站数据的保存路径,其参数的默认值是/var/www/html(即把网站数据存放到这个目录中);而当前网站普遍的首页面名称是index.html,因此可以向/var/www/html/index.html文件中写入一段内容,替换掉httpd服务程序的默认首页面。该操作会立即生效。

[root@bogon ~]# echo "weihongbin" > /var/www/html/index.html

打开虚拟机的浏览器,输入http://127.0.0.1

image.png

把保存网站数据的目录修改为/home/wwwroot目录

第1步:建立网站数据的保存目录,并创建首页文件。

[root@bogon ~]# mkdir /home/wwwroot

[root@bogon ~]# echo "new web" > /home/wwwroot/index.html

第2步:打开httpd服务程序的主配置文件,修改相关网站路径参数和目录权限参数

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

122 DocumentRoot "/home/wwwroot"

123  

124 #

125 # Relax access to content within /var/www.

126 #

127 "/home/wwwroot">

128     AllowOverride None

129     # Allow open access:

130     Require all granted

131

132  

133 # Further relax access to the default document root:

134 "/home/wwwroot">

第3步:重新启动httpd服务程序并验证效果

[root@bogon ~]# systemctl restart httpd

刷新后看到如下结果不要惊慌,权限不足的原因是selinux的问题

image.png

10.3 SELinux安全子系统

Linux系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。

SELinux服务有3种配置模式,具体如下。

enforcing:强制启用安全策略模式,将拦截服务的不合法请求。

permissive:遇到服务越权访问时,只发出警告而不强制拦截。

disabled:对于越权的行为不警告也不拦截。

查看SELinux服务主配置文件中定义的默认状态

[root@bogon ~]# cat /etc/selinux/config  

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=enforcing

# SELINUXTYPE= can take one of these three values:

#     targeted - Targeted processes are protected,

#     minimum - Modification of targeted policy. Only selected processes are protected.  

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

使用getenforce命令获得当前SELinux服务的运行模式:

[root@bogon ~]# getenforce

Enforcing

用setenforce [0|1]命令修改SELinux当前的运行模式(0为禁用,1为启用)。注意,这种修改只是临时的,在系统重启后就会失效:

[root@bogon ~]# setenforce 0

[root@bogon ~]# getenforce  

Permissive

再次刷新网页,就会看到正常的网页内容了

image.png

httpd服务程序的功能是允许用户访问网站内容,因此SELinux肯定会默认放行用户对网站的请求操作,但是我们将网站数据的默认保存目录修改为/home/wwwroot,/home目录是用来存放普通用户的家目录数据的,而现在,httpd提供的网站服务却要去获取普通用户家目录中的数据,这显然违反了SELinux的监管原则。

把SELinux服务恢复到强制启用安全策略模式,然后分别查看原始网站数据的保存目录与当前网站数据的保存目录是否拥有不同的SELinux安全上下文值。在ls命令中,-Z参数用于查看文件的安全上下文值,-d参数代表对象是个文件夹。

[root@bogon ~]# setenforce 1

[root@bogon ~]# ls -Zd /var/www/html/

system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

[root@bogon ~]# ls -Zd /home/wwwroot/

unconfined_u:object_r:user_home_dir_t:s0 /home/wwwroot/

用户段system_u代表系统进程的身份,角色段object_r代表文件目录的角色,类型段httpd_sys_content_t代表网站服务的系统文件。

semanage命令用于管理SELinux的策略,语法格式为“semanage [参数] [文件]”。

semanage命令中常用参数及作用

参数 作用
-l 查询
-a 添加
-m 修改
-d 删除

向新的网站数据目录中新添加一条SELinux安全上下文,让这个目录以及里面所有文件能够被httpd服务程序访问到:

[root@bogon ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot

[root@bogon ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*

在执行上述设置之后,还无法立即访问网站,还需要使用restorecon命令将设置好的SELinux安全上下文立即生效。

使用restorecon命令时,可以加上-Rv参数对指定的目录进行递归操作,以及显示SELinux安全上下文的修改过程

[root@bogon ~]# restorecon -Rv /home/wwwroot/

Relabeled /home/wwwroot from unconfined_u:object_r:user_home_dir_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

Relabeled /home/wwwroot/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

image.png

10.4 个人用户主页功能

让系统内所有的用户在自己的家目录中管理个人的网站,在系统中为每位用户建立一个独立的网站

第1步需要编辑下面的配置文件,然后在UserDir disabled参数前面加上井号(#),表示让httpd服务程序开启个人用户主页功能;同时再把UserDir public_html参数前面的井号(#)去掉(UserDir参数表示网站数据在用户家目录中的保存目录名称,即public_html目录)。

[root@bogon ~]# vim /etc/httpd/conf.d/userdir.conf  

   #

   # UserDir is disabled by default since it can confirm the presence

   # of a username on the system (depending on home directory

   # permissions).

   #

#    UserDir disabled

   #

   # To enable requests to /~user/ to serve the user's public_html

   # directory, remove the "UserDir disabled" line above, and uncomment

   # the following line instead:

   #  

   UserDir public_html

#

# Control access to UserDir directories.  The following is an example

# for a site where these directories are restricted to read-only.

#

   AllowOverride FileInfo AuthConfig Limit Indexes

   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

   Require method GET POST OPTIONS


第2步:在用户家目录中建立用于保存网站数据的目录及首页面文件,把家目录的权限修改为755,保证其他人也有权限读取里面的内容。(我的个人用户是root1,根据你的用户来调节)

[root@bogon ~]# su - root1

Last login: Mon Dec 18 16:08:00 PST 2023 on tty2

[root1@bogon ~]$ mkdir weihongbin

[root1@bogon ~]$ echo "weihongbin" > weihongbin/index.html

[root1@bogon ~]$ chmod -R 755 /home/root1

第3步:重新启动httpd服务程序

[root1@bogon ~]$ exit

logout

[root@bogon ~]# systemctl restart httpd

第4步SELinux域确保服务程序不能执行违规的操作,只能本本分分地为用户提供服务。httpd服务中突然开启的这项个人用户主页功能需要被SELinux域默认允许

使用getsebool命令查询并过滤出所有与HTTP协议相关的安全策略。off为禁止状态,on为允许状态。

[root@bogon ~]# getsebool -a | grep http

...

httpd_enable_homedirs --> off

...

在setsebool命令后面加上-P参数,让修改后的SELinux策略规则永久生效且立即生效。

[root@bogon ~]# setsebool -P httpd_enable_homedirs=on

在浏览器的地址栏中输入网址,其格式为“网址/~用户名”

image.png

(我这里报错了,原因很简单,我瞎起名字导致的,public_html不能修改,因为这是http识别的目录,需要跟配置文件一致)发现问题后进行修正

[root@bogon ~]# su - root1

Last login: Mon Dec 18 22:36:55 PST 2023 on pts/0

[root1@bogon ~]$ mv weihongbin public_html

[root1@bogon ~]$ ll

total 0

drwxr-xr-x. 2 root1 root1  6 Dec 18 16:08 Desktop

drwxr-xr-x. 2 root1 root1  6 Dec 18 16:08 Documents

drwxr-xr-x. 2 root1 root1  6 Dec 18 16:08 Downloads

drwxr-xr-x. 2 root1 root1  6 Dec 18 16:08 Music

drwxr-xr-x. 2 root1 root1  6 Dec 18 16:08 Pictures

drwxr-xr-x. 2 root1 root1  6 Dec 18 16:08 Public

drwxr-xr-x. 2 root1 root1 24 Dec 18 22:08 public_html

修改文件的上下文

[root@bogon ~]# semanage fcontext -a -t httpd_sys_content_t /home/root1/#修改文件的上下文信息

[root@bogon ~]# restorecon -Rv /home/root1 #使SELinux 安全上下文立即生效

Relabeled /home/root1/public_html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_user_content_t:s0

Relabeled /home/root1/public_html/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_user_content_t:s0

image.png

个人主页加密

第1步:先使用htpasswd命令生成密码数据库。-c参数表示第一次生成;(自定义用户为weihongbin)

[root@bogon ~]# htpasswd -c /etc/httpd/passwd weihongbin

New password:  此处输入用于网页验证的密码

Re-type new password:  再输入一遍进行确认

Adding password for user weihongbin

第2步继续编辑个人用户主页功能的配置文件。继续编辑个人用户主页功能的配置文件(加粗部分直接替换粘贴)。重启httpd服务程序

[root@bogon ~]# vim /etc/httpd/conf.d/userdir.conf

...

     AllowOverride all

       #刚刚生成出的密码验证文件保存路径

     authuserfile "/etc/httpd/passwd"

       #当用户访问网站时的提示信息

     authname "My privately website"

       #验证方式为口令模式

     authtype basic

       #访问网站时需要验证的用户名称

     require user weihongbin

[root@bogon ~]# systemctl restart httpd

刷新后输入账号密码才能进入

image.png

10.5 虚拟网站主机功能

Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号,提供多个网站同时为外部提供访问服务的技术

10.5.1 基于IP地址

这个我们需要做三块网卡,分别对应10,11,12三个IP地址,这里我们来巩固一下我们网卡章节的知识,同时把网卡章节的内容进行梳理

image.png

此时我们的网卡配置信息是很乱的,这也是我们以后要整理的点,之前绑定的bond0合二为一后删掉了一个,现在应该是有很复杂的关系,不过不要着急我们一步一步来解除他,并且调成三个IP地址

image.png

先删除之前创建的合并网卡,此时我们应该无法再通过xshell登录虚拟机了,我们直接在虚拟机上操作

[root@bogon ~]# nmcli device status

DEVICE      TYPE      STATE                   CONNECTION          

ens160      ethernet  connected               ens160              

bond0       bond      connected               bond0              

ens256      ethernet  connected               Wired connection 1  

virbr0      bridge    connected (externally)  virbr0              

ens224      ethernet  connected               bond0-port2        

lo          loopback  unmanaged               --                  

virbr0-nic  tun       unmanaged               --                  

[root@bogon ~]# nmcli connection delete bond0

Connection 'bond0' (433b5ce0-0cd3-44b2-9cd5-611d667cd7c9) successfully deleted.

现在通过ifconfig发现目前是三块网卡,只是网卡配置的ip地址不太对,此时我们先调整ens160的,使其网卡信息变更为10(本来有的信息就别动,没有的进行填充,配置文件内容如下)

image.png

[root@bogon ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=dhcp

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

NAME=ens160

UUID=a3e2d19b-0640-429b-8be8-6f4586ea29b1

DEVICE=ens160

ONBOOT=yes

IPADDR=192.168.227.10

NETMASK=255.255.255.0

GATEWAY=192.168.227.2

DNS1=192.168.227.1

DNS2=8.8.8.8

PREFIX=24

ZONE=public

修改完一个后再把剩余两个网卡进行整理

[root@localhost ~]# cd /etc/sysconfig/network-scripts/

[root@localhost network-scripts]# ll

total 12

-rw-r--r--. 1 root root 121 Dec 10 23:11 ifcfg-bond0-port1

-rw-r--r--. 1 root root 121 Dec 10 23:11 ifcfg-bond0-port2

-rw-------. 1 root root 370 Dec 19 00:29 ifcfg-ens160

删除这两个多余的文件,ifcfg-bond0-port1和ifcfg-bond0-port2,我们来复制两个ifconfig-ens224和ifconfig-ens256文件

[root@localhost ~]# cd /etc/sysconfig/network-scripts/

[root@localhost network-scripts]# rm -rf ifcfg-bond0-port1

[root@localhost network-scripts]# rm -rf ifcfg-bond0-port2

[root@localhost network-scripts]# cp -R ifcfg-ens160 ifcfg-ens224

[root@localhost network-scripts]# cp -R ifcfg-ens160 ifcfg-ens256

修改224配置文件

[root@localhost network-scripts]# vim ifcfg-ens224

YPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=static

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

NAME=ens224

DEVICE=ens224

ONBOOT=yes

IPADDR=192.168.227.11

NETMASK=255.255.255.0

GATEWAY=192.168.227.2

DNS1=192.168.227.1

DNS2=8.8.8.8

PREFIX=24

ZONE=public

修改256配置文件

[root@localhost network-scripts]# vim ifcfg-ens256

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=static

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

NAME=ens256

DEVICE=ens256

ONBOOT=yes

IPADDR=192.168.227.12

NETMASK=255.255.255.0

GATEWAY=192.168.227.2

DNS1=192.168.227.1

DNS2=8.8.8.8

PREFIX=24

ZONE=public

重启网络管理服务

[root@localhost network-scripts]# systemctl restart NetworkManager

image.png

此时我们发现256的配置不太对,查看一下网卡相关情况,删除一下 Wired connection 1的默认配置信息

[root@localhost network-scripts]# nmcli device status

DEVICE      TYPE      STATE                   CONNECTION          

ens160      ethernet  connected               ens160              

ens224      ethernet  connected               ens224              

ens256      ethernet  connected               Wired connection 1  

virbr0      bridge    connected (externally)  virbr0              

lo          loopback  unmanaged               --                  

virbr0-nic  tun       unmanaged               --  

[root@localhost network-scripts]# nmcli connection delete Wired\ connection\ 1  

Connection 'Wired connection 1' (8e6c518e-8002-3421-90ef-9fbf342bfb48) successfully deleted.

然后再查看一下,发现已经正常使用了,学习要融会贯通,以往的知识要及时用起来

image.png

第1步分别在/home/wwwroot中创建用于保存不同网站数据的3个目录

[root@localhost ~]# mkdir -p /home/wwwroot/10

[root@localhost ~]# mkdir -p /home/wwwroot/11

[root@localhost ~]# mkdir -p /home/wwwroot/12

[root@localhost ~]# echo "10" > /home/wwwroot/10/index.html

[root@localhost ~]# echo "11" > /home/wwwroot/11/index.html

[root@localhost ~]# echo "12" > /home/wwwroot/12/index.html

第2步从httpd服务的配置文件中分别追加写入3个基于IP地址的虚拟主机网站参数(加粗为新增),重启httpd服务

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

...

<Directory "/home/wwwroot">

   AllowOverride None

   # Allow open access:

   Require all granted

</Directory>

<VirtualHost 192.168.227.10>

   DocumentRoot /home/wwwroot/10

   ServerName www.weihongbin.com

   <Directory /home/wwwroot/10>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

<VirtualHost 192.168.227.11>

   DocumentRoot /home/wwwroot/11

   ServerName www.weihongbin.com

   <Directory /home/wwwroot/10>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

<VirtualHost 192.168.227.12>

   DocumentRoot /home/wwwroot/12

   ServerName www.weihongbin.com

   <Directory /home/wwwroot/10>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

[root@localhost ~]# systemctl restart httpd

第3步SELinux赋权,不想用selinux可以百度自行关闭

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot

ValueError: File context for /home/wwwroot already defined

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/11

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/12

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10/*

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/11/*

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/12/*

[root@localhost ~]# restorecon -Rv /home/wwwroot

Relabeled /home/wwwroot/10 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

Relabeled /home/wwwroot/11 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

Relabeled /home/wwwroot/12 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

展示成果

image.png

10.5.2 基于主机域名

当服务器无法为每个网站都分配一个独立IP地址的时候,可以尝试让Apache自动识别用户请求的域名,只需要保证位于生产环境中的服务器上有一个可用的IP地址,网络参数中没有DNS信息也依然能够将域名解析为某个IP地址。

第1步手动定义IP地址与域名之间对应关系的配置文件

[root@localhost ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.227.10   www.weihongbin.com www.weihongbin.cn www.weihongbin.net

[root@localhost ~]# ping -c 4 www.weihongbin.com

PING www.weihongbin.com (192.168.227.10) 56(84) bytes of data.

64 bytes from www.weihongbin.com (192.168.227.10): icmp_seq=1 ttl=64 time=0.047 ms

64 bytes from www.weihongbin.com (192.168.227.10): icmp_seq=2 ttl=64 time=0.047 ms

64 bytes from www.weihongbin.com (192.168.227.10): icmp_seq=3 ttl=64 time=0.051 ms

64 bytes from www.weihongbin.com (192.168.227.10): icmp_seq=4 ttl=64 time=0.070 ms

--- www.weihongbin.com ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3059ms

rtt min/avg/max/mdev = 0.047/0.053/0.070/0.013 ms

第2步:分别在/home/wwwroot中创建用于保存不同网站数据的3个目录

[root@localhost ~]# mkdir -p /home/wwwroot/weihongbin.com

[root@localhost ~]# mkdir -p /home/wwwroot/weihongbin.cn

[root@localhost ~]# mkdir -p /home/wwwroot/weihongbin.net

[root@localhost ~]# echo "com" > /home/wwwroot/weihongbin.com/index.html

[root@localhost ~]# echo "cn" > /home/wwwroot/weihongbin.cn/index.html

[root@localhost ~]# echo "net" > /home/wwwroot/weihongbin.net/index.html

第3步从httpd服务的配置文件中分别追加写入3个基于主机名的虚拟主机网站参数(加粗部分修改),重启httpd服务

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

<Directory "/home/wwwroot">

   AllowOverride None

   # Allow open access:

   Require all granted

</Directory>

<VirtualHost 192.168.227.10>

   DocumentRoot /home/wwwroot/weihongbin.com

   ServerName www.weihongbin.com

   <Directory /home/wwwroot/weihongbin.com>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

<VirtualHost 192.168.227.10>

   DocumentRoot /home/wwwroot/weihongbin.cn

   ServerName www.weihongbin.cn

   <Directory /home/wwwroot/weihongbin.com>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

<VirtualHost 192.168.227.10>

   DocumentRoot /home/wwwroot/weihongbin.net

   ServerName www.weihongbin.net

   <Directory /home/wwwroot/weihongbin.com>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

[root@localhost ~]# systemctl restart httpd

第4步SELinux赋权,不想用selinux可以百度自行关闭

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot

ValueError: File context for /home/wwwroot already defined

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/weihongbin.com

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/weihongbin.com/*

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/weihongbin.cn

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/weihongbin.cn/*

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/weihongbin.net

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/weihongbin.net/*

[root@localhost ~]# restorecon -Rv /home/wwwroot

image.png

10.5.3 基于端口号

基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。使用80、443、8080等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到SELinux服务的限制。

第1步分别在/home/wwwroot中创建用于保存不同网站数据的3个目录

[root@localhost ~]# mkdir -p /home/wwwroot/6111

[root@localhost ~]# mkdir -p /home/wwwroot/6222

[root@localhost ~]# mkdir -p /home/wwwroot/6333

[root@localhost ~]# echo "6111" > /home/wwwroot/6111/index.html

[root@localhost ~]# echo "6222" > /home/wwwroot/6222/index.html

[root@localhost ~]# echo "6333" > /home/wwwroot/6333/index.html

第2步在httpd服务配置文件分别添加用于监听6111、6222和6333端口的参数,分别追加写入3个基于端口号的虚拟主机网站参数

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

...

#Listen 12.34.56.78:80

Listen 80

Listen 6111

Listen 6222

Listen 6333

...

<Directory "/home/wwwroot">

   AllowOverride None

   # Allow open access:

   Require all granted

</Directory>

<VirtualHost 192.168.227.10:6111>

   DocumentRoot /home/wwwroot/6111

   ServerName www.weihongbin.com

   <Directory /home/wwwroot/6111>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

<VirtualHost 192.168.227.10:6222>

   DocumentRoot /home/wwwroot/6222

   ServerName www.weihongbin.com

   <Directory /home/wwwroot/6222>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

<VirtualHost 192.168.227.10:6333>

   DocumentRoot /home/wwwroot/6333

   ServerName www.weihongbin.com

   <Directory /home/wwwroot/6333>

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

第3步SELinux赋权,不想用selinux可以百度自行关闭

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot

ValueError: File context for /home/wwwroot already defined

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/*

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/*

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333

[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333/*

[root@localhost ~]# restorecon -Rv /home/wwwroot/

第4步SELinux允许的与HTTP协议相关的端口号中默认没有包含6111、6222和6333,需要将这3个端口号手动添加进去,然后重启。

[root@localhost ~]# semanage port -a -t http_port_t -p tcp 6111

[root@localhost ~]# semanage port -a -t http_port_t -p tcp 6222

[root@localhost ~]# semanage port -a -t http_port_t -p tcp 6333

[root@localhost ~]# 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      6333, 6222, 6111, 80, 81, 443, 488, 8008, 8009, 8443, 9000

pegasus_http_port_t            tcp      5988

pegasus_https_port_t           tcp      5989

[root@localhost ~]# systemctl restart httpd

image.png

10.6 Apache访问控制

Apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。它通过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问。在允许或禁止访问网站资源时,还会用到Order指令,这个指令用来定义Allow或Deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。

第1步:先在服务器上的网站数据目录中新建一个子目录

[root@localhost ~]# mkdir /var/www/html/server

[root@localhost ~]# echo "成功" > /var/www/html/server/index.html

第2步:打开httpd服务的配置文件,添加下述规则来限制源主机的访问(加粗部分,只有火狐可以访问)

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

...

#DocumentRoot "/home/wwwroot"

DocumentRoot "/var/www/html/"

#

# Relax access to content within /var/www.

#

#<Directory "/home/wwwroot/">

<Directory "/var/www/html/">

   AllowOverride None

   # Allow open access:

   Require all granted

</Directory>

...

<VirtualHost 192.168.227.10>

   DocumentRoot /var/www/html

   ServerName www.weihongbin.com

#   <Directory /home/wwwroot/weihongbin.com>

#    AllowOverride None

#    Require all granted

#   </Directory>

   <Directory "/var/www/html/server">

   SetEnvIf User-Agent "Firefox" ff=1

   Order allow,deny

   Allow from env=ff

   </Directory>

</VirtualHost>

...

[root@localhost ~]# systemctl restart httpd

没有谷歌的话可以下载一个,火狐浏览器直接输入:google.cn/chrome/

image.png

找到包的地址,并安装

[root@localhost tmp]# cd /tmp

[root@localhost tmp]# dnf install -y google-chrome-stable_current_x86_64.rpm

再下载安装两个依赖包(作用不大,想卸载用dnf remove -y

[root@localhost ~]# dnf install -y lsb

[root@localhost ~]# dnf install -y libXScrnSaver

完成谷歌浏览器安装,重启一下(我这系统太垃圾了,安装了谷歌也用不了)

image.png

进行测试,其他的浏览器的也不用测,肯定进不去

image.png

二、巩固练习

1.什么是Web网络服务?

答:一种允许用户通过浏览器访问互联网中各种资源的服务。

2.相较于Nginx服务程序,Apache服务程序最大的优势是什么?

答:Apache服务程序具备跨平台特性、安全性,而且拥有快速、可靠、简单的API扩展。

3.httpd服务程序没有检查到首页文件,会提示报错信息吗?

答:不会,httpd服务在未找到网站首页文件时,会向访客显示一个默认页面。

4.简述Apache服务主配置文件中全局配置参数、区域配置参数和注释行信息的作用。

答:全局配置参数是一种全局性的配置参数,可作用于所有的子站点;区域配置参数则是单独针对每个独立的子站点设置的;而注释行信息一般是对服务程序的功能或某一行参数进行介绍的。

5.简述SELinux服务的作用。

答:为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。

6.在使用getenforce命令查看SELinux服务模式时,发现其配置模式为permissive,这代表强制开启模式吗?

答:不是,强制开启模式是enforcing,而permissive是只发出警告而不强制拦截的模式。

7.在使用semanage命令修改了文件上应用的SELinux安全上下文后,还需要执行什么命令才可以让更改立即生效?

答:还需要执行restorecon命令即可让新的SELinux安全上下文参数立即生效。

8.要想查询并过滤出所有与HTTP协议相关的SELinux域策略有哪些,应该怎么做呢?

答:可以结合管道符来实现,即执行getsebool -a | grep http命令。

9.Apache服务程序可以基于哪些资源来创建虚拟主机网站呢?

答:可以基于IP地址、主机名(域名)或者端口号创建虚拟主机网站。

10.相对于基于IP地址和基于主机名(域名)配置的虚拟主机网站来说,使用端口号配置虚拟主机网站有哪些特点?

答:在使用端口号来配置虚拟主机网站时,必须要考虑到SELinux域对httpd服务程序所用端口号的控制策略,还要在httpd服务程序的主配置文件中使用Listen参数来开启要监听的端口号。

三、跋文

如果想上手操作的同学们可以通过阿里云ecs服务器免费试用参与或低价购买专属于自己的服务器入口如下

入口一:新老同学免费试用

入口二:上云第一站

入口三:学生版超低价云服务器

入口四:云服务器专享特惠版

入口五:云服务器特惠1.5折起

入口七:阿里云最新活动中心

入口八:中小企业权益满减礼包

说明:最后的链接只是想方便大家免费试用产品和找到最佳优惠政策。

学习是一件需要投入的事情,无论是精力、金钱、时间,每天花费1小时,坚持一年,你也能成为行业里的大牛。





相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
11天前
|
SQL 关系型数据库 MySQL
Linux系统部署Yearning SQL审核平台结合内网穿透实现公网访问
Linux系统部署Yearning SQL审核平台结合内网穿透实现公网访问
|
2天前
|
网络协议 Linux 开发工具
|
5天前
|
Ubuntu Linux
Linux(Ubuntu)系统临时IP以及静态IP配置(关闭、启动网卡等操作)
请注意,以上步骤是在临时基础上进行配置的。如果要永久保存静态IP地址,通常还需要修改 `/etc/network/interfaces`文件,以便在系统重启后保持配置。同时,确保备份相关配置文件以防止出现问题。
22 1
|
7天前
|
Ubuntu Linux 测试技术
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试(下)
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试
38 1
|
7天前
|
Ubuntu Linux 网络安全
Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案
Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案
51 0
|
8天前
|
资源调度 JavaScript Ubuntu
Linux系统之部署briefing视频聊天系统
【4月更文挑战第21天】Linux系统之部署briefing视频聊天系统
42 2
|
11天前
|
数据可视化 Linux Docker
Linux系统使用Docker部署Dashy导航页服务并实现公网环境访问
Linux系统使用Docker部署Dashy导航页服务并实现公网环境访问
|
11天前
|
数据可视化 数据挖掘 Linux
如何在Linux部署DataEase数据分析服务并实现无公网IP远程分析内网数据信息
如何在Linux部署DataEase数据分析服务并实现无公网IP远程分析内网数据信息
|
11天前
|
网络协议 数据管理 Linux
如何在Linux部署OpenGauss数据管理系统并实现固定公网地址访问
如何在Linux部署OpenGauss数据管理系统并实现固定公网地址访问