Linux之Web服务(2)Httpd服务配置之一
Apache HTTP Server
Apache HTTP 服务器,简称Apache,是非常留下的Web服务器软件。通常和脚步语言比如PHP,数据库MySQL一起工作,合成为LAMP栈(Linux, Apache, MySQL, PHP). 当然流行的Web服务器还有nigix,但是nigix虽然轻量级很稳定,但是功能并不如Apache HTTP功能丰富,并且现在的Apache HTTP还支持模块化功能,及可以开发自己的功能模块并加入到此Web服务器软件中,更灵活的满足Web业务甚至是和http协议相关的实现。
本篇主要讲解在CentOS 7 上安装Httpd2.4和相应的配置。
Httpd2.4具体配置介绍
1、Httpd2.4的安装
#使用yum安装
[[email protected] ~]# yum install httpd -y
#安装后查看httpd信息,可以检查是否已经安装
[[email protected] ~]# yum info httpd Loaded plugins: fastestmirror Determining fastest mirrors Installed Packages Name : httpd Arch : x86_64 Version : 2.4.6 Release : 40.el7.centos Size : 9.4 M Repo : installed From repo : centos6 Summary : Apache HTTP Server URL : http://httpd.apache.org/ License : ASL 2.0 Description : The Apache HTTP Server is a powerful, efficient, and extensible : web server.
2、Httpd2.4 默认配置
主程序文件:/usr/sbin/httpd
模块文件:/usr/lib64/httpd/modules/*.so
注:可以使用httpd -M 查看当前服务加载的模块文件列表
主配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d*/.conf
/etc/httpd/conf.modules.d/*.conf
站点文档路径:
/var/www/html
日志文件路径:
/var/log/httpd/access_log :访问日志
/var/log/httpd/error_log: 错误日志
Systemd Unit File:
/usr/ib/systemd/system/httpd.service
自带脚步文件:
/usr/sbin/apachectl
注意:在CentOS6及以前使用SysV风格启动的服务脚步使用的就是此脚本。
3、Http2.4 服务的启动和关闭
#启动服务
[[email protected] ~]# systemctl start httpd.service
#关闭服务
[[email protected] ~]# systemctl stop httpd.service
#查看服务是否启动成功
[[email protected] ~]# systemctl status httpd.service
#通过查看默认端口80查看是否开启监听
[[email protected] ~]# netstat -tnlp | grep ‘:80\>‘ tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 88660/httpd
#也可以通过查看进程来查看httpd相关的进程组
[[email protected] ~]# ps -axu | grep ‘httpd\>‘ | grep -v ‘\<grep\>‘ root 88660 0.0 0.5 222032 5104 ? Ss 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88661 0.0 0.3 222032 3108 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88662 0.0 0.3 222032 3108 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88663 0.0 0.3 222032 3100 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88664 0.0 0.3 222032 3100 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88665 0.0 0.3 222032 3108 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND
解析:这里发现进程的发起者居然都是apache,这是为了保护系统而产生的一个系统用户,该用户只负责Httpd守护进程操作,这样如果Httpd服务被入侵,而保护了操作系统。在某些低版本如Httpd2.2版本中使用的系统账户名可能为httpd。
4、Http2.4 准配前工作
#对80或Httpd指定监听的端口开发防火墙
[[email protected] ~]# iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
#保存此防火墙规则配置
[[email protected] ~]# iptables-save
5、Httpd2.4 基础配置检查
配置文件格式:
DIRECTIVE VALUE
DIRECTIVE:指令,不区分字符大小写;例如ServerRoot;
VALUE:该值除了文件系统指定路径除外,大多数也不区分大小写;
配置修改完后注意事项:
(1)检查语法; 注:可以使用 httpd -t 来检查,如果显示OK则无错误
(2)让服务重新重载配置文件
实例:
#检查配置文件语法是否有误,OK表示无语法错误
[[email protected] ~]# httpd -t
Syntax OK
#重载服务配置
[[email protected] ~]# systemctl reload httpd.service
#当然也可以通过发送1号信号让 Httpd守护进程重新生成
[[email protected] ~]# pkill -SIGHUP -f ‘.*\/httpd\>‘
6、具体的配置指令及其选项介绍
1、基本配置指令
ServerTokens OS #会显示当前apache版本和系统版本 ServerRoot "/etc/httpd" #默认服务器配置跟目录 PidFile run/httpd.pid #进程信息的存放路径,相对路径,相对于/etc/httpd/下 Timeout 60 #超时时间,60秒后端口并重新连接 Listen [ip:]port #监听的地址和端口
注:Listend可以重复定义多次,默认监听本机可用的所有地址;当需要修改监听多个监听端口或者添加多个监听端口时,需要重新启动httpd服务守护进程,及:
$ systecml restart httpd.service
2、保存连接的限制类指令
提示persistent connection : tcp连接建立后,资源获取完成后不会断开连接,而会继续等待。
而如何进行控制其他多个资源通过端口访问进程?
方案猜想:进行访问的数量限制,进行同一进程访问的时间限制。
具体配置举例说明:
是否开启保存连接
KeepAlive on|off
举例说明:在Tcp进行通信需要3次握手来建立连接,而假设如果需要进行传输文件时使用此协议,则传送一次文件后端口连接然后再次3次连接建立一次连接来进行下一次文件传输。
如果改为On,则表示只在传输第一个文件时建立一次Tcp连接,而不会断开,接下来继续进行下面的传输不在进行建立连接的请求过程。
单一用户的保持连接最大请求次数
MaxKeepAliveRequest 100
解析:当输出此时为100次才端口一次连接,然后再次建立Tcp连接。
注意:只有KeepAlive 设为为On 时此选项才会跟着生效。因为传输文件时不能总保持不断开连接,因此这里设置一个最大的传输请求次数来控制,防止网络请求队列堵塞。
单一用户的一次保持连接的超时时间,默认为s秒,httpd2.4可以设置ms表示毫秒
KeepAliveTimeout 15
解析:假设当进行文件传输时,速度很慢,那么此此文件传输超过15秒会自动断开进行如下一次传输连接的建立。
2、MAP多处理模块
prefork MAP 可靠性、兼容性强的MAP,多进程,一个进程处理一次请求;
worker MAP 更高伸缩性的线程MAP,多线程,一个线程程处理一个请求;
event MAP 多线程,每线程处理一次请求,基于事件驱动机制;
这里主要列出perfork MAP介绍
StartServers 8 #httpd进程组默认会开启8个守护进程 MinSpareServers 5 #当有多个用户来进行访问,会至少有5个进程用来备份使用 MaxSpareServers 20 #最大值预留 ServerLimit 256 #限制允许多少个用户进行连接 MaxClients 256 #允许多少个用户同时连接,及同一时间段的并发量 MaxRequestsPerChild 4000 #最大请求模块子进程
3、模块的加载和查看
使用httpd 命令选项查看已经加载的模块
-t -D DUMP_MODULES : show all loaded modules
-M : a synonym for -t -D DUMP_MODULES
模块加载具体配置LoadModule
#httpd服务启动时默认加载的模块
LoadModule mod_name modules/mod_filename
注意:这里的LoadModule指定的模块名会在httpd -M命令中显示,而后面第二个参数才是真正对应的模块文件路径,此路径为相对路径,相对于ServerRoot配置节点指定的路径,一般默认为:
ServerRoot /etc/httpd/ #Httpd服务的根目录 Include conf.d/*.conf #读取包含指定目录下的配置文件
4、用户相关配置:
User apache #系统用户,用于执行httpd守护进程 Group apache #系统组,用于此组用户来管理httpd
注意:此系统用户一般不会轻易修改,就算要修改也要指定为一个系统用户,并且此用户的默认shell类型为/sbin/nologin,一次来就算Web服务站点出现的问题或被入侵,但是此进程的执行为系统用户,保证了系统的安全。
5、网站Main Server主要配置
#web服务站点邮箱,如:
ServerAdmin [email protected]
解析:一般为管理员邮箱,当站点出现问题会发送服务的相关日志信息给指定邮箱。
#设置站点域名,可以设置,如:
ServerName www.example.com:80
注意:此域名默认一般机器不会有,当启动服务时会出现一个提示说找不到ServerName指定域名,因此,可以设置为直接的主机名或者DNS配置的域名即可。
#站点文档及网页根路径
DocumentRoot “/var/www/html”
6、站点文档访问授权及众多服务特性的配置:
1、基于文件系统路径:
<Directory “/PTATH/TO/DIR”>
</Directroy>
<File “”>
</File>
2、基于URL访问:
<Location “URL”>
</Location>
<Location "URL">
</Location>
<LocationMatch ~ "URL_PATTERN">
</LocationMatch>
3、访问的选项节点
Options
选项固定参数:
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None #表示都不选 All #表示选择所有参数功能 Indexes: #索引 FollowSymLinks: #允许使用符号链接访问资源 ExecCGI: #允许执行CGI模块配置的脚本
具体案例解析:
1、Indexes 功能展示
#修改默认配置添加
<Directoiry "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
<DIrectoiry/>
说明:Indexes表示当访问这个设定的目录下是,如果没有index.html文件,则把此目录下的所有文件列表显示在网页中。如:
#在默认站点文档根目录/var/www/html 下创建xx目录
[[email protected] ~]# mkdir /var/www/html/xx
#切换到xx目录
[[email protected] ~]# cd /var/www/html/xx/
#创建两个带测试内容的文本文件
[[email protected] xx]# echo aa > aa.txt [[email protected] xx]# echo bb > bb.txt [[email protected] xx]# sync
#重新启动服务
[[email protected] xx]# service httpd restart
#再次进行访问
[[email protected] xx]# links http://10.1.249.185:80/xx/
解析:这里因为没有检查当前目录下有index.html文件,所以会把当前目录下的其它所有文件列表给列出来。
说明:如果去掉Indexes 则表示如果目录下没有index.html文件,则会隐藏该目录下的其它所有文件,如显示以下信息:
[[email protected] xx]# links http://10.1.249.185:80/xx/
Forbidden#forbidden #表示为被禁用的意思
解析:这里最后一行就把系统的版本以及web站点服务器软件的版本以及端口后都显示出来。也是当全局设置有ServerTokens OS才会显示。这里显示的Forbidden就是上篇所列出的response响应介接收返回的状态码status code对应的403,及无权限访问此目录下除了默认文件名的默认文档及index.html的其它任何文件。
注意:Directory配置不能指定文件访问,为全局的,因此但如果指定该目录有文件,任然可以直接全路径进行访问指定资源,如查找 aa.txt,如:
[[email protected] xx]# links http://10.1.249.185/xx/aa.txt aa
解析:那为什么任然可以通过此指定资源全路径来访问呢?因为这里的配置只是对Directory定义的整个目录生效,但是如果目录里的资源文件路径被获取,那么文件还是可以访问的,要拒绝通过指定文件资源路径访问可以通过配置File标签,及添加:
<Files ~ "/var/www/html/xx/.*\.txt$"> Require all deiend </Files>
说明:这里访问/var/www/thml/xx/以.txt结尾的文件都不能访问了。当然如果建立了其它非以.txt 结尾的文件还是可以访问的,如:
#新建一个以为.txt的文件,这时访问此文件时无权限的
[[email protected] ~]# echo hello > /var/www/html/xx/hello.txt
#那么给这个修改此文件名的后缀为.log
[[email protected] ~]# rename txt log /var/www/html/xx/hello.txt
#则再次使用资源文件全路径去访问hello.log
[[email protected] ~]# links http://10.1.249.185/xx/hello.log
说明:这里可以访问说明只对.txt后缀的文件做了访问限制,那么是不是通过全资源路径就无法访问刚才的aa.txt路径了呢?非也,使用curl命令就可以抓取资源,如:
#使用curl将指定路径资源文档页面源代码读取打印
[[email protected] ~]# curl http://10.1.249.185/xx/aa.txt aa
#当然直接打印此路径下的所有文件列表还是不行的
[[email protected] ~]# curl http://10.1.249.185/xx/
解析:curl能够根据资源记录来捕获对应的资源的源代码,当然在/var/www/html/xx目录下是没有index.html命名的文件,所以要想打印出下面的文件列表,还是不行的。那么添加一个index.html 文件。
#在xx目录下添加一个index.html默认首页文档
[[email protected] ~]# echo ‘<html><head><title>新的默认页<title></head><body><h1>Default<h1></body></html>‘ > > /var/www/html/xx/index.html
#使用curl尝试访问并读取其资源
[[email protected] ~]# curl http://10.1.249.185/xx
解析:这里似乎明白了什么,curl只是抓取资源的原代码或原内容,并不会解析对应的html标记,显示了301状态码表示这个目录下的文件被移动过。
#那么显示刚刚建立的/var/www/html/xx/index.html
[[email protected] ~]# curl http://10.1.249.185/xx/index.html <html><head><title>新的默认页<title></head><body><h1>Default<h1></body></html>
说明:这样直接就将源码截获了,那么怎么办,只有给此文件设置访问控制facl了吗?和linux中的rwx基本权限类似,如果一个目录不能访问那么其下的所有资源如果设置了不能访问,那么就完全不能访问了。如,修改Directory对/var/www/html/xx目录的配置:
<Directory "/var/www/html/xx"> Options FollowSymLinks AllowOverride AuthConfig Require all deined#将允许所有修改过为拒绝所有 </Directory>
#这次再次使用curl去抓取资源源码
[[email protected] ~]# curl http://10.1.249.185/xx/index.html
说明:这样设置了直接对当前整个目录设置了访问控制,那么想要访问此目录的任何文件都不行了,403表示没有权限,curl使用读取web资源内容来打印,但是现在也没有权限去获取此资源文件了,那么使用浏览器或者links更没法了。
总结:
其实这里没必要这么麻烦,一般如果在一个目录下有多种类型的文件,这时可以通过设置对应的<Files> 标签来对指定文件名设置访问权限。而去掉<Directory>里Options中的Indexes是为了安全考虑。Indexes的生效主要跟是否有index.html默认页有关,如果没有此默认页,那么去掉此项并设置访问拒绝才不会显示访问到所有文件。如果需要将不想让指定的文件在此目录下被访问,如果在现在的CentOS系统中,就好办了,直接将不想被访问并且被打印在文件列表中:
1、将此文件设置为隐藏文件
2、给对应的文件设置<Files >标签控制访问
验证总结案例实现:
#删除刚才创建的index.html默认页
[[email protected] ~]# rm -f /var/www/html/xx/index.html
#修改FIles标签拒绝所有人html/xx目录下所有以.开头并以txt结尾的文件
[[email protected] ~]# vim /etc/httpd/conf/http.conf <Directory "/var/www/html/xx"> Options Indexes FollowSymLinks AllowOverride AuthConfig Require all granted <Files ~ "/var/www/html/xx/\..*txt$"> Require all deined </Files>
#修改aa.txt文件名为.aa.txt及为隐藏文件
[[email protected] ~]# rename aa .aa /var/www/html/xx/aa.txt
#此时通过ls默认选项查看xx目录已经无法找出隐藏文件.aa.txt了
[[email protected] ~]# ls /var/www/html/xx/ bb.txt
#通过links访问此目录
[[email protected] ~]# links http://10.1.249.185/xx/
解析:因为没有index.html及默认页,所有打印当前目录下的所有资源文件,但不包括隐藏文件,因此.aa.txt并没有被打印。
#同时为了防止curl抓取内容,删除所有用户的r及读权限
[[email protected] ~]# chmod -r /var/www/html/xx/.aa.txt
#只是通过curl命令来通过web读取资源,就不行了
[[email protected] ~]# curl http://10.1.249.185/.aa.txt <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /.aa.txt was not found on this server.</p> <hr> <address>Apache/2.2.3 (Red Hat) Server at 10.1.249.185 Port 80</address> </body></html>
说明:curl是需要是一个二进制执行程序,默认有x及执行权限,而对应的文件没有读权限,因此此curl获取资源源码失效。
#当然如果使用root用户直接在本地读取此文本还是可以的,只是对web做了限制
[[email protected] ~]# whoami root [[email protected] ~]# cat /var/www/html/xx/.aa.txt aa
2、Options FollowSymLinks 允许符号链接
说明:允许Directory定义指定目录下创建符号链接来访问其他路径文件。
功能展示
#给/var/www/html默认文档路路径对应的Directory标签中添加此选项:
<Directory “/var/ww/html> Options FollowSymLinks ..........
#在根目录下创建一个目录 :
[[email protected] ~]# mkdir /xx
#在xx目录下预习建立一个默认页面
[[email protected] ~]# echo echo aa > /xx/index.html
#切换到默认文档根路径
[[email protected] ~]# cd /var/www/html/
#给创建的默认页index.html添加httpd服务所需的安全上下文
[[email protected] html]# chcon -R -t httpd_sys_content_t /xx/
#在根路径下创建一个符号链接yy文件执行刚才的/xx目录
[[email protected] html]# ln -s /xx/ yy
#查看文档目录下的所有文件的安全上下文
[[email protected] html]# ll -Z -rw-r--r-- root root root:object_r:httpd_sys_content_t index.html drwxr-xr-x root root root:object_r:httpd_sys_content_t xx lrwxrwxrwx root root root:object_r:httpd_sys_content_t yy -> /xx/
#发送 SIGHUP 信号重载Httpd服务配置
[[email protected] html]# pkill -HUP ‘httpd.*‘
#进行站点下的yy服务链接,显示结果实际为文件系统根路径下的xx目录,及/xx
[[email protected] html]# links http://10.1.249.185:80/yy echo aa
说明:这里显示的内容并不是根据规则目录标签里定义的指定为/var/www/html目录下的相对路径yy,这个yy为一个软连接,而连接的指定的是一个目录,而目录里有index.html则执行的是这个网页。
3、AllowOverride 访问控制配置
httpd的访问控制配置,允许每目录单独进行;在每个目录下建立一个.htaccess文件;
AllowOverride 表示是否允许目录中的.htaccess文件中的配置来覆盖当前配置段中的配置;
具体的参数:
Options 多选项
FileInfo 详细文件配置,一般用于文件Files标签配合
AuthConfig 允许使用Auth配置文件来读取配置设定
Limit 允许限制访问范围控制
All 所有设定
None 不使用任何设定