使用Apache服务部署静态网站
10.1 网站服务程序
Web网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,最终用于提供服务程序的Web服务器会通过HTTP(超文本传输协议)或HTTPS(安全超文本传输协议)把请求的内容传送给用户。
目前能够提供Web网络服务的程序有IIS、Nginx和Apache等。其中,IIS(Internet Information Service,互联网信息服务)是Windows系统中默认的Web服务程序,这是一款图形化的网站管理工具,不仅可以提供Web网站服务,还可以提供FTP、NMTP、SMTP等服务。但是,IIS只能在Windows系统中使用
Nginx最被认可的还是其系统资源消耗低且并发能力强的特性
Apache其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。Apache服务程序可以运行在Linux系统、UNIX系统甚至是Windows系统中,它支持基于IP、域名及端口号的虚拟主机功能,支持多种认证方式,集成有代理服务器模块、安全Socket层(SSL),能够实时监视服务状态与定制日志消息,并支持各类丰富的模块。
安装APACHE
第1步:把系统镜像挂载到/media/cdrom目录。
第2步:使用Vim文本编辑器创建软件仓库的配置文件
第3步:动手安装Apache服务程序。
第4步:启用httpd服务程序并将其加入到开机启动项中,使其能够随系统开机而运行,从而持续为用户提供Web服务。
在浏览器的地址栏中输入http://127.0.0.1并按回车键,就可以看到用于提供Web服务的默认页面
10.2 配置服务文件参数
httpd服务程序的主要配置文件及存放位置
Linux系统中的配置文件
作用 文件名称
服务目录 /etc/httpd
主配置文件 /etc/httpd/conf/httpd.conf
网站数据目录 /var/www/html
访问日志 /var/log/httpd/access_log
错误日志 /var/log/httpd/error_log
主配置文件中保存的是最重要的服务参数,一般会被保存到/etc目录中以软件名称命名的一个文件夹之中,名字为“服务名称.conf”,例如这里的“/etc/httpd/conf/httpd.conf”
在httpd服务程序的主配置文件中,存在3种类型的信息:注释行信息、全局配置、区域配置
全局配置参数就是一种全局性的配置参数,可作用于所有的子站点,既保证了子站点的正常访问,也有效降低了频繁写入重复参数的工作量。区域配置参数则是单独针对每个独立的子站点进行设置的。
配置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服务程序的默认首页面。该操作会立即生效。
如果想要修改文件默认保存位置
第1步:建立网站数据的保存目录,并创建首页文件。
[root@linuxprobe ~]# mkdir /home/wwwroot
第2步:打开httpd服务程序的主配置文件,将约第122行用于定义网站数据保存路径的参数DocumentRoot修改为/home/wwwroot,同时还需要将约第127行与第134行用于定义目录权限的参数Directory后面的路径也修改为/home/wwwroot。
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
117 #
118 # DocumentRoot: The directory out of which you will serve your
119 # documents. By default, all requests are taken from this directory, but
120 # symbolic links and aliases may be used to point to other locations.
121 #
122 DocumentRoot "/home/wwwroot"
123
124 #
125 # Relax access to content within /var/www.
126 #
127 <Directory "/home/wwwroot">
128 AllowOverride None
129 # Allow open access:
130 Require all granted
131 </Directory>
132
133 # Further relax access to the default document root:
134 <Directory "/home/wwwroot">
………………省略部分输出信息………………
第3步:重新启动httpd服务程序并验证效果
10.3 SELinux安全子系统
SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。Linux系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
SELinux服务有3种配置模式,具体如下。
enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
permissive:遇到服务越权访问时,只发出警告而不强制拦截。
disabled:对于越权的行为不警告也不拦截。
修改selinux为enforcing
[root@linuxprobe ~]# vim /etc/selinux/config
SELINUX=enforcing
SELinux服务的主配置文件中,定义的是SELinux的默认运行状态,可以将其理解为系统重启后的状态,因此它不会在更改后立即生效。可以使用getenforce命令获得当前SELinux服务的运行模式:
[root@linuxprobe ~]# getenforce
可以用setenforce [0|1]命令修改SELinux当前的运行模式(0为禁用,1为启用)。注意,这种修改只是临时的,在系统重启后就会失效:[root@linuxprobe ~]# setenforce 0
[root@linuxprobe ~]# getenforce
Permissive
在ls命令中,-Z参数用于查看文件的安全上下文值,-d参数代表对象是个文件夹。
[root@linuxprobe ~]# setenforce 1
[root@linuxprobe ~]# ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
[root@linuxprobe ~]# 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命令,将当前网站目录/home/wwwroot的SELinux安全上下文修改为跟原始网站目录的一样就行了。
semanage命令用于管理SELinux的策略,英文全称为“SELinux manage”
SELinux服务极大地提升了Linux系统的安全性,将用户权限牢牢地锁在笼子里。semanage命令不仅能够像传统的chcon命令那样设置文件、目录的策略,还能够管理网络端口、消息接口(这些新特性将在本章后文中涵盖)。使用semanage命令时,经常用到的几个参数及其作用
semanage命令中常用参数以及作用
参数 作用
-l 查询
-a 添加
-m 修改
-d 删除
向新的网站数据目录中新添加一条SELinux安全上下文,让这个目录以及里面的所有文件能够被httpd服务程序访问到:
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*
在执行上述设置之后,还无法立即访问网站,还需要使用restorecon命令将设置好的SELinux安全上下文立即生效。在使用restorecon命令时,可以加上-Rv参数对指定的目录进行递归操作,以及显示SELinux安全上下文的修改过程
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot/
10.4 个人用户主页功能
如果想在系统中为每位用户建立一个独立的网站,httpd服务程序提供的个人用户主页功能完全可以胜任这个工作。该功能可以让系统内所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。
第1步:
在httpd服务程序中,默认没有开启个人用户主页功能。为此,我们需要编辑下面的配置文件,然后在第17行的UserDir disabled参数前面加上井号(#),表示让httpd服务程序开启个人用户主页功能;同时再把第24行的UserDir public_html参数前面的井号(#)去掉(UserDir参数表示网站数据在用户家目录中的保存目录名称,即public_html目录)。
第2步:在用户家目录中建立用于保存网站数据的目录及首页面文件。另外,还需要把家目录的权限修改为755,保证其他人也有权限读取里面的内容。
[root@linuxprobe home]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ mkdir public_html
[linuxprobe@linuxprobe ~]$ echo "This is linuxprobe's website" > public_html/index.html
[linuxprobe@linuxprobe ~]$ chmod -R 755 /home/linuxprobe
第3步:重新启动httpd服务程序,在浏览器的地址栏中输入网址,其格式为“网址/~用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格)。
getsebool命令查询并过滤出所有与HTTP协议相关的安全策略。其中,off为禁止状态,on为允许状态。
可以用setsebool命令来修改SELinux策略中各条规则的布尔值了。记得在setsebool命令后面加上-P参数,让修改后的SELinux策略规则永久生效且立即生效。
[root@linuxprobe ~]# setsebool -P httpd_enable_homedirs=on
通过身份验证的用户看到里面的内容,这时就可以在网站中添加密码功能了。
第1步:先使用htpasswd命令生成密码数据库。-c参数表示第一次生成;后面再分别添加密码数据库的存放文件,以及验证要用到的用户名称(该用户不必是系统中已有的本地账户)。
[root@linuxprobe ~]# htpasswd -c /etc/httpd/passwd linuxprobe
第2步:继续编辑个人用户主页功能的配置文件。把第31~37行的参数信息修改成下列内容,其中以井号(#)开头的内容为添加的注释信息,可将其忽略。随后保存并退出配置文件,重启httpd服务程序即可生效。
[root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf
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>
[root@linuxprobe ~]# systemctl restart httpd
10.5 虚拟网站主机功能
利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。
Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号,提供多个网站同时为外部提供访问服务的技术。
10.5.1 基于IP地址
如果一台服务器有多个IP地址,而且每个IP地址与服务器上部署的每个网站一一对应,这样当用户请求访问不同的IP地址时,会访问到不同网站的页面资源。而且,每个网站都有一个独立的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
第2步:从httpd服务的配置文件中大约第132行处开始,分别追加写入3个基于IP地址的虚拟主机网站参数,然后保存并退出。记得需要重启httpd服务,这些配置才生效。
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
132 <VirtualHost 192.168.10.10>
133 DocumentRoot /home/wwwroot/10
134 ServerName www.linuxprobe.com
135 <Directory /home/wwwroot/10>
136 AllowOverride None
137 Require all granted
138 </Directory>
139 </VirtualHost>
140 <VirtualHost 192.168.10.20>
141 DocumentRoot /home/wwwroot/20
142 ServerName www.linuxcool.com
143 <Directory /home/wwwroot/20>
144 AllowOverride None
145 Require all granted
146 </Directory>
147 </VirtualHost>
148 <VirtualHost 192.168.10.30>
149 DocumentRoot /home/wwwroot/30
150 ServerName www.linuxdown.com
151 <Directory /home/wwwroot/30>
152 AllowOverride None
153 Require all granted
154 </Directory>
155 </VirtualHost>
[root@linuxprobe ~]# systemctl restart httpd
第3步:由于当前的/home/wwwroot目录及里面的网站数据目录的SELinux安全上下文与网站服务不吻合,因此httpd服务程序无法获取到这些网站数据目录。我们需要手动把新的网站数据目录的SELinux安全上下文设置正确,并使用restorecon命令让新设置的SELinux安全上下文立即生效
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30/*
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot
7/8中修改 semanage 修改selinux
5/6中通过chcon修改 selinux
semanage是对chcon的增强
本机访问自己的服务不会受到防火墙限制
10.5.2 基于主机域名
当服务器无法为每个网站都分配一个独立IP地址的时候,可以尝试让Apache自动识别用户请求的域名,从而根据不同的域名请求来传输不同的内容。在这种情况下的配置更加简单,只需要保证位于生产环境中的服务器上有一个可用的IP地址
因此需要手动定义IP地址与域名之间的对应关系。/etc/hosts是Linux系统中用于强制把某个主机域名解析到指定IP地址的配置文件。
第1步:手动定义IP地址与域名之间对应关系的配置文件,保存并退出后会立即生效。
[root@linuxprobe ~]# 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.linuxprobe.com www.linuxcool.com www.linuxdown.com
第2步:分别在/home/wwwroot中创建用于保存不同网站数据的3个目录,并向其中分别写入网站的首页文件。
[root@linuxprobe ~]# mkdir -p /home/wwwroot/linuxprobe
[root@linuxprobe ~]# mkdir -p /home/wwwroot/linuxcool
[root@linuxprobe ~]# mkdir -p /home/wwwroot/linuxdown
第3步:从httpd服务的配置文件中大约第132行处开始,分别追加写入3个基于主机名的虚拟主机网站参数,然后保存并退出。记得需要重启httpd服务,这些配置才生效。
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
132 <VirtualHost 192.168.10.10>
133 Documentroot /home/wwwroot/linuxprobe
134 ServerName www.linuxprobe.com
135 <Directory /home/wwwroot/linuxprobe>
136 AllowOverride None
137 Require all granted
138 </Directory>
139 </VirtualHost>
140 <VirtualHost 192.168.10.10>
141 Documentroot /home/wwwroot/linuxcool
142 ServerName www.linuxcool.com
143 <Directory /home/wwwroot/linuxcool>
144 AllowOverride None
145 Require all granted
146 </Directory>
147 </VirtualHost>
148 <VirtualHost 192.168.10.10>
149 Documentroot /home/wwwroot/linuxdown
150 ServerName www.linuxdown.com
151 <Directory /home/wwwroot/linuxdown>
152 AllowOverride None
153 Require all granted
154 </Directory>
155 </VirtualHost>
………………省略部分输出信息………………
[root@linuxprobe ~]# systemctl restart httpd
第4步:因为当前的网站数据目录还是在/home/wwwroot目录中,因此还是必须要正确设置网站数据目录文件的SELinux安全上下文,使其与网站服务功能相吻合。最后记得用restorecon命令让新配置的SELinux安全上下文立即生效,这样就可以立即访问到虚拟主机网站了
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxprobe
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxprobe/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxcool
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxcool/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxdown
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxdown/*
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot
10.5.3 基于端口号
基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。
第1步:分别在/home/wwwroot中创建用于保存不同网站数据的3个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息
[root@linuxprobe ~]# mkdir -p /home/wwwroot/6111
[root@linuxprobe ~]# mkdir -p /home/wwwroot/6222
[root@linuxprobe ~]# mkdir -p /home/wwwroot/6333
第2步:在httpd服务配置文件的第46行~48行分别添加用于监听6111、6222和6333端口的参数。
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
37 # Listen: Allows you to bind Apache to specific IP addresses and/or
38 # ports, instead of the default. See also the
39 # directive.
40 #
41 # Change this to Listen on specific IP addresses as shown below to
42 # prevent Apache from glomming onto all bound IP addresses.
43 #
44 #Listen 12.34.56.78:80
45 Listen 80
46 Listen 6111
47 Listen 6222
48 Listen 6333
第3步:从httpd服务的配置文件中大约第134行处开始,分别追加写入3个基于端口号的虚拟主机网站参数,然后保存并退出。记得需要重启httpd服务,这些配置才生效
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
134 <VirtualHost 192.168.10.10:6111>
135 DocumentRoot /home/wwwroot/6111
136 ServerName www.linuxprobe.com
137 <Directory /home/wwwroot/6111>
138 AllowOverride None
139 Require all granted
140 </Directory>
141 </VirtualHost>
142 <VirtualHost 192.168.10.10:6222>
143 DocumentRoot /home/wwwroot/6222
144 ServerName www.linuxcool.com
145 <Directory /home/wwwroot/6222>
146 AllowOverride None
147 Require all granted
148 </Directory>
149 </VirtualHost>
150 <VirtualHost 192.168.10.10:6333>
151 DocumentRoot /home/wwwroot/6333
152 ServerName www.linuxdown.com
153 <Directory /home/wwwroot/6333>
154 AllowOverride None
155 Require all granted
156 </Directory>
157 </VirtualHost>
………………省略部分输出信息………………
第4步:因为我们把网站数据目录存放在/home/wwwroot目录中,因此还是必须要正确设置网站数据目录文件的SELinux安全上下文
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333/*
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot/
[root@linuxprobe ~]# systemctl restart httpd
可以使用semanage命令查询并过滤出所有与HTTP协议相关且SELinux服务允许的端口列表。[root@linuxprobe ~]# semanage port -l | grep http
第5步:SELinux允许的与HTTP协议相关的端口号中默认没有包含6111、6222和6333,因此需要将这3个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。
[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6111
[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6222
[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6333
10.6 Apache的访问控制
Apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。它通过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问。在允许或禁止访问网站资源时,还会用到Order指令,这个指令用来定义Allow或Deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。
第1步:先在服务器上的网站数据目录中新建一个子目录,并在这个子目录中创建一个包含Successful单词的首页文件。
[root@linuxprobe ~]# mkdir /var/www/html/server
[root@linuxprobe ~]# echo “Successful” > /var/www/html/server/index.html
第2步:打开httpd服务的配置文件,在第161行后面添加下述规则来限制源主机的访问。这段规则的含义是允许使用Firefox浏览器的主机访问服务器上的首页文件,除此之外的所有请求都将被拒绝。
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
161 <Directory “/var/www/html/server”>
162 SetEnvIf User-Agent “Firefox” ff=1
163 Order allow,deny
164 Allow from env=ff
165
[root@linuxprobe ~]# systemctl restart httpd
[root@linuxprobe ~]# firefox
除了匹配源主机的浏览器特征之外,还可以通过匹配源主机的IP地址进行访问控制。可以在httpd服务配置文件的第161行后面添加下述规则。这样在重启httpd服务程序后再用本机来访问网站的首页面时就会提示访问被拒绝了
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
161 <Directory “/var/www/html/server”>
162 Order allow,deny
163 Allow from 192.168.10.20
164
[root@linuxprobe ~]# systemctl restart httpd
[root@linuxprobe ~]# firefox