第八章 web服务之apache(1)
8.1 HTTP简介
说到http协议,其实大家都不陌生,我们日常上网,打开网页,使用的就是http协议,实现web浏览功能。
首先,我们需要明确的是,架设网站主要是有两部分组成:web服务器和网页。我们作为Linux运维人员负责的是web服务器的部署与维护,但是网页制作不是我们的专业,需要找专门的开发公司,制作网页。然后把网页交给我们,由我们把网页发布出来。
在Linux中也会有多种部署http服务器的工具,如:apache、nginx等,下面我们就来介绍一下Linux自带的apache工具部署web服务的细节。
8.2 apache配置
8.2.1 基本配置
首先,我们来安装一下apacche的软件包
yum -y install httpd
安装完毕后系统中会自动新建一个用户叫apache,新建一个组叫apache,作为http服务的属主和属组,即http服务器进程是以apache用户的身份启动起来的。
本章的实验环境如下
服务器:Linux 192.168.10.1 关闭防火墙
客户端:windows 192.168.10.10
其实httpd软件包安装完毕后,即可直接启动服务了,因为httpd已经为我们搭建好了测试页面,可以直接在客户端测试。
systemctl restart httpd ---启动httpd服务
systemctl enable httpd
客户端使用浏览器访问页面,可见到apache的测试页:
有了测试页,可证明apache服务器启动正常。下面我们来分析一下apache的配置文件,做出自己的设置。
vi /etc/httpd/conf/httpd.conf ---编辑配置文件,里面有如下默认项:
listen 80 ---指定本web服务的监听端口,也可自定义,一般不改
ServerAdmin ---指定本服务的管理员邮箱
ServerName ---指定本网站的FQDN
User Apache ---服务进程的所属用户
Group Apache ---服务进程的所属组
Documentroot /var/www/html ---指定网页文件的存放位置
DirectoryIndex index.html ---指定主页文件名
Errorlog logs/error_log ---错误日志
Customlog logs/access_log ---访问日志,绝对路径:/var/log/httpd/下
AddDefaultCharset UTF-8 ---指定页面传输时的编码,一般改成GB2312
其中最为常用的是Documentroot和DirectoryIndex两项,Documentroot指定了本网站的所有网页文件的存放位置,默认都在/var/www/html/目录下,但里面可能会有很多的网页文件(如下图),那么当客户端访问时,以哪个文件作为首页显示给客户端呢?则由DirectoryIndex项指定,默认指定的主页文件名为index.html,如下图:
图中,是我事先手动创建的几个网页文件,当apache相应客户时,会自动把index.html文件发送给客户端浏览器显示,而其他网页文件,可以在index.html页面内通过链接显示(这是网页制作的技术范畴工作,这里不做赘述)。
我们可以手动创建网页,命令很简单:
cd /var/www/html
echo www.rzz.com > index.html
注:这里我们只是为了做实验测试,所以不编写复杂网页,有会html网页制作的读者,可以自行发挥。
制作完毕后,客户端就可以访问了,结果如下:
另外,主配置文件中的Errorlog与Customlog两项,指定了错误日志与客户访问日志文件的位置,但并未指定绝对路径,只写明了文件名,其实日志文件的统一位置都在/var/log/http/目录下,可以看到配置文件汇总指定的文件。
再者,主配置文件中的AddDefaultCharset项容易被忽略,它指定了页面文件在传输过程中的编码格式,尤其是中文页面,编码格式指定不对,客户端显示时很容易出现乱码现象(UTF-8是国际上对中文制定的编码格式,GB2312是我国政府对中文制定的编码格式),在我国大陆地区内的网站服务器,大多使用GB2312编码。关于编码格式,生产环境中我们需要与网页开发人员对接,他们在编写网页时也会指定编码格式,我们与他们的设定保持一致即可。
8.2.2 访问控制管理
下面,我们来对站点做一些管理配置。首先来针对客户端ip做一下限制。
vi /etc/httpd/conf/httpd.conf ---编辑配置文件
大约在130+行,会有<Directory "/var/www/html"> … </Dorectory>一对容器(容器即相当于括号功能的一个封闭小模块),这个容器中是针对网页默认所在目录的配置,其中Require all granted 句表示授权所有用户访问,若我们要对客户端ip做限制需要先把这句注释掉。使用require句也可以限制客户端ip,这里我们使用的是order allow deny方式做的,这种方式更为普遍:
#Require all granted ---注释该句
order deny allow ---制定下面访问控制语句的读取顺序,后读的覆盖先读的
allow from 192.168.10.0/24 ---指定允许的客户端地址
deny from all ---指定拒绝的客户端地址
以上设置,由于order中设定的顺序是deny allow,所以在读取配置时,先读取下面的deny语句,再读取allow语句,后读的覆盖先读的,因此实现的结果是只允许10.0段的客户端访问,其他全部拒绝。当然我们也可以指定单个ip做允许。
systemctl restart httpd
重启服务后,可从客户端验证设置的生效
8.2.3 身份验证管理
除了可以限制客户端ip外,还可以要求客户端访问时必须使用账户、密码登录后才能打开网站,具体操作如下:
<directory "/var/www/html"> </directory>容器中写入:
authtype basic ---开启基本的身份验证功能
authname 163.com ---指定弹出对话窗口上显示的提示文字
authuserfile /etc/httpd/userList ---指定用户、密码文件
require valid-user ---用户文件中的所有用户,都允许访问
---require user pp qq ---仅允许文件中的指定用户
保存退出
以上,在配置文件中设置了路径访问时需要经过身份验证,并指定了验证文件的绝对路径,但是该用户文件需要手动创建,命令如下:
cd /etc/httpd
htpasswd -c userList pp ---创建用户文件,并加入用户, -c 创建
htpasswd userList qq ---加入用户,因为已创建,所以无需再用-c参数
htpasswd userList kk
chown apache.apache userList ---某些版本Linux,用户文件默认权限
不足,需要更改其所属信息
注:http设定的账号,无需是系统用户,可随意定义。
做完以上操作,即可重启服务,在客户端做验证了
systemctl restart httpd
客户端访问web时的登录页面如下:
如图可见,提示信息显示163.com即是配置文件中authname项指定的文字。输入正确的用户名、密码后即可打开页面。
有了访问控制和身份验证的设置后,我们可能会问了,客户端访问页面时,这二者是必须同时满足还是可以仅满足一项就可以打开页面了呢?其实,默认情况下是要求二者同时满足,客户端才可以打开页面。我们也可以在配置文件中写入satisfy any设置为二者满足其一就允许访问。具体如下:
vi /etc/httpd/conf/httpd.conf
<directory "/var/www/html"> </directory>容器中写入:
satisfy any ---设置二者满足其一即可访问
注:若设置为satisfy all 表示二者都必须满足,不该句,默认是all
systemctl restart httpd ---重启后客户端访问,以验证功能
8.2.4 其他参数解释
在配置文件的<directory "/var/www/html"></directory>容器中,还有很多默认的设置,我们未做解释,下面就来说明其功能:
options indexes ---开启本目录的浏览功能。当目录下没有指定的主页文件时,显示目录下内容,支持下载, -indexes表示关闭
options followsymlinks ---表示允许使用软链接,建立虚拟目录指向
注:-followsymlinks表示关闭
allowoverride none ---访问控制、身份验证以本配置文件中的设置为准
注:若设置为allowoverride all 则表示本配置文件中的设置失效,以目录下.htaccess 文件中的设置为准,称为访问控制文件
有了以上解释,我们来逐一验证:
首先,indexes表示浏览权限,即当目录下没有指定的主页文件(index.html)时,是否允许给客户端显示目录下的内容。我们可以cd到/var/www/html下,给index.html改名,然后在客户端查看效果。命令、效果如下:
cd /var/www/html
mv index.html inn
ls
客户端访问会发现显示的是apache默认的测试页,这是因为/var/www/html目录下没有主页时,apache会自动显示默认测试页,为了验证indexes浏览权限,我们现在把默认测试页去除:
cd /etc/httpd/conf.d
mv welcome.conf welcome.conf.old ---给默认主页配置文件改名,即失效了
注:/etc/httpd/conf.d/welcome.conf是测试页的配置文件,并非测试页本身,该文件里面指定了测试页的实际位置。
systemctl restart httpd
重启服务后,客户端再次访问页面即会显示目录下的内容了:
总结可知,indexes表示当目录下没有主页文件时,显示目录下的所有文件。我们也可以冲着某个文件点击右键,选择另存为,即下载该文件,所以说indexes也支持下载。
再来介绍一下followsymlinks,表示允许目录下使用软链接,指向其他位置内的目录。案例如下:
cd /var/www/html
ln -s /var movie ---建立软链接
客户端访问: http://192.168.10.1/movie ---访问软链接,查看到/var下内容。由此可证明软链接功能的生效。
最后,来看一下allowoverride的功能,当设置为allowoverride all时,说明配置文件中关于访问控制、身份验证的语句失效,转而遵守目录下的.access文件中的设置。我们可以操作以下实验来验证:
cd /var/www/html
vi .access ---写入
orderdeny,allow
allow from 192.168.10.10
deny from all
authtype basic
authname 163
authuserfile /etc/httpd/userList
require user pp qq ---仅允许pp、qq访问
satisfy all
vi /etc/httpd/conf/httpd.conf
<directory "/var/www/html"> </directory>容器中设置:
allowoverride all
systemctl restart httpd
重启服务后,客户端访问可验证是.access文件中的设置生效了。
服务器端改回allowoverride none后,重启服务,可证明.access文件失效了。