systemctl start httpd
systemctl enable httpd
配置服务文件参数
Linux 系统中的配置文件
在 httpd 服务程序的主配置文件中,存在三种类型的信息:注释行信息、全局配置、区域配置
配置 httpd 服务程序时最常用的参数以及用途描述
DocumentRoot 参数用于定义网站数据的保存路径,其参数的默认值
是把网站数据存放到/var/www/html 目录中;而当前网站普遍的首页面名称是 index.html,因
此可以向/var/www/html 目录中写入一个文件,替换掉 httpd 服务程序的默认首页面,该操作
会立即生效
想把保存网站数据的目录修改为/home/wwwroot 目录,该怎么操作呢?
vim /etc/httpd/conf/httpd.conf
DocumentRoot "/home/wwwroot"
<Directory "/home/wwwroot">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
重启,访问http://127.0.0.1/index.html页面,竟然发现页面中显示 “ Forbidden,You don't have permission to SELinux 安全子系统access /index.html on this server.”。而这一切正是 SELinux 在捣鬼。
SELinux 安全子系统
SELinux(Security-Enhanced Linux)
SELinux 服务有三种配置模式
enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
permissive:遇到服务越权访问时,只发出警告而不强制拦截。
disabled:对于越权的行为不警告也不拦截。
vim /etc/selinux/config
SELINUX=enforcing
getenforce
setenforce 0 修改 SELinux 当前的运行模式(0 为禁用, 1 为启用)
httpd 服务程序的功能是允许用户访问网站内容,因此 SELinux 肯定会默认放行用户对网
站的请求操作。但是,我们将网站数据的默认保存目录修改为了/home/wwwroot,而这就产生
问题了。 /home 目录是用来存放普通用户的家目录数据的,而现在, httpd
提供的网站服务却要去获取普通用户家目录中的数据了, 这显然违反了 SELinux 的监管原则。
把 SELinux 服务恢复到强制启用安全策略模式,然后分别查看原始网站数据
的保存目录与当前网站数据的保存目录是否拥有不同的 SELinux 安全上下文值:
setenforce 1
以下对比以下两个目录:
ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
ls -Zd /home/wwwroot
drwxrwxrwx. root root unconfined_u:object_r:home_root_t:s0 /home/wwwroot
在文件上设置的 SELinux 安全上下文是由用户段、角色段以及类型段等多个信息项共同
组成的。其中,用户段 system_u 代表系统进程的身份,角色段 object_r 代表文件目录的角色,
类型段 httpd_sys_content_t 代表网站服务的系统文件。
semanage命令:管理SELinux
格式为“ semanage [选项] [文件]”
参数及其功能如下所示:
-l 参数用于查询;
-a 参数用于添加;
-m 参数用于修改;
-d 参数用于删除
向新的网站数据目录中新添加一条 SELinux 安全上下文,让这个目录以及里面的所有文件能够被 httpd 服务程序所访问到:
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*执行上述设置之后,还无法立即访问网站,还需要使用 restorecon 命令将设置好
的 SELinux 安全上下文立即生效。在使用 restorecon 命令时,可以加上-Rv 参数对指定的目录
进行递归操作,以及显示 SELinux 安全上下文的修改过程。最后,再次刷新页面,就可以正
常看到网页内容了
restorecon -Rv /home/wwwroot/
个人用户主页功能
在 httpd 服务程序中,默认没有开启个人用户主页功能。为此,我们需要编辑下
面的配置文件/etc/httpd/conf.d/userdir.conf,然后在第 17 行的 UserDir disabled 参数前面加上井号(#),表示让 httpd 服务
程序开启个人用户主页功能;同时再把第 24 行的 UserDir public_html 参数前面的井号(#)
去掉(UserDir 参数表示网站数据在用户家目录中的保存目录名称,即 public_html 目录)。最
后,在修改完毕后记得保存。
vim /etc/httpd/conf.d/userdir.conf
第 2 步:在用户家目录中建立用于保存网站数据的目录及首页面文件。另外,还需要把
家目录的权限修改为 755,保证其他人也有权限读取里面的内容。
第 3 步:重新启动 httpd 服务程序。在浏览器的地址栏中输入网址,其格式为“网址/~用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格) ,从理论上来讲就可以看到用户的个人网站了。如果浏览个人网页出错,则是因为SELinux
接下来使用 getsebool 命令查询并过滤出所有与 HTTP 协议相关的安全策略。其中, off为禁止状态, on 为允许状态。
getsebool -a | grep http
可以发现:httpd_enable_homedirs --> off
用setsebool 命令来修改 SELinux 策略中各条规则的布尔值了。一定要记得在 setsebool 命令
后面加上-P 参数,让修改后的 SELinux 策略规则永久生效且立即生效。
setsebool -P httpd_enable_homedirs=on
有时,网站的拥有者并不希望直接将网页内容显示出来,只想让通过身份验证的用户访
客看到里面的内容,这时就可以在网站中添加口令功能了。
第 1 步:先使用 htpasswd 命令生成密码数据库。 -c 参数表示第一次生成;后面再分
别添加密码数据库的存放文件,以及验证要用到的用户名称(该用户不必是系统中已有的
本地账户)
htpasswd -c /etc/httpd/passwd linuxprobe
第 2 步:编辑个人用户主页功能的配置文件。把第 31~35 行的参数信息修改成下列内容,
其中井号(#)开头的内容为添加的注释信息,可将其忽略。随后保存并退出配置文
件,重启 httpd 服务程序即可生效。
vim /etc/httpd/conf.d/userdir.conf
27 #
28 # Control access to UserDir directories. The following is an example
29 # for a site where these directories are restricted to read-only.
30 #
31 <Directory "/home/*/public_html">
32 AllowOverride all
#刚刚生成出来的密码验证文件保存路径
33 authuserfile "/etc/httpd/passwd"
#当用户尝试访问个人用户网站时的提示信息
34 authname "My privately website"
35 authtype basic
#用户进行账户密码登录时需要验证的用户名称
36 require user linuxprobe
37 </Directory>
systemctl restart httpd
虚拟主机功能
利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。
Apache 的虚拟主机功能是服务器基于用户请求的不同 IP 地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术
基于 IP 地址
利用nmtui工具配置服务器的三个IP地址如下:
第 1 步:分别在/home/wwwroot 中创建用于保存不同网站数据的 3 个目录,并向其中分
别写入网站的首页文件。
[root@linuxprobe ~]# mkdir -p /home/wwwroot/10
[root@linuxprobe ~]# mkdir -p /home/wwwroot/20
[root@linuxprobe ~]# mkdir -p /home/wwwroot/30
[root@linuxprobe ~]# echo "IP:192.168.10.10" > /home/wwwroot/10/index.html
[root@linuxprobe ~]# echo "IP:192.168.10.20" > /home/wwwroot/20/index.html
[root@linuxprobe ~]# echo "IP:192.168.10.30" > /home/wwwroot/30/index.html
第 2 步:在 httpd 服务的配置文件中大约 113 行处开始,分别追加写入三个基于 IP 地址的虚
拟主机网站参数,然后保存并退出。记得需要重启 httpd 服务,这些配置才生效。
vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
113 <VirtualHost 192.168.10.10>
114 DocumentRoot /home/wwwroot/10
115 ServerName www.linuxprobe.com
116 <Directory /home/wwwroot/10 >
117 AllowOverride None
118 Require all granted
119 </Directory>
120 </VirtualHost>
121 <VirtualHost 192.168.10.20>
122 DocumentRoot /home/wwwroot/20
123 ServerName bbs.linuxprobe.com
124 <Directory /home/wwwroot/20 >
125 AllowOverride None
126 Require all granted
127 </Directory>
128 </VirtualHost>
129 <VirtualHost 192.168.10.30>
130 DocumentRoot /home/wwwroot/30
131 ServerName tech.linuxprobe.com
132 <Directory /home/wwwroot/30 >
133 AllowOverride None
134 Require all granted
135 </Directory>
136 </VirtualHost>
systemctl restart httpd
第 3 步:此时访问网站,则会看到 httpd 服务程序的默认首页面。大家现在应该立刻就反
应过来—这是 SELinux 在捣鬼。由于当前的/home/wwwroot 目录及里面的网站数据目录的
SELinux 安全上下文与网站服务不吻合,因此 httpd 服务程序无法获取到这些网站数据目录。
我们需要手动把新的网站数据目录的 SELinux 安全上下文设置正确(见前文的实验) ,并使用
restorecon 命令让新设置的 SELinux 安全上下文立即生效,这样就可以立即看到网站的访问效
果了
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10/*
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20/*
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30/*
restorecon -Rv /home/wwwroot
后续参考:https://blog.csdn.net/lm19770429/article/details/105846241