Linux之Web服务(2)Httpd服务配置之一html
Apache HTTP Serverlinux
Apache HTTP 服务器,简称Apache,是很是留下的Web服务器软件。一般和脚步语言好比PHP,数据库MySQL一块儿工做,合成为LAMP栈(Linux, Apache, MySQL, PHP). 固然流行的Web服务器还有nigix,可是nigix虽然轻量级很稳定,可是功能并不如Apache HTTP功能丰富,而且如今的Apache HTTP还支持模块化功能,及能够开发本身的功能模块并加入到此Web服务器软件中,更灵活的知足Web业务甚至是和http协议相关的实现。web
本篇主要讲解在CentOS 7 上安装Httpd2.4和相应的配置。shell
Httpd2.4具体配置介绍数据库
一、Httpd2.4的安装apache
#使用yum安装vim
[root@root ~]# yum install httpd -y
#安装后查看httpd信息,能够检查是否已经安装
后端
[root@root ~]# 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 默认配置centos
主程序文件:/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风格启动的服务脚步使用的就是此脚本。
三、Http2.4 服务的启动和关闭
#启动服务
[root@root ~]# systemctl start httpd.service
#关闭服务
[root@root ~]# systemctl stop httpd.service
#查看服务是否启动成功
[root@root ~]# systemctl status httpd.service
#经过查看默认端口80查看是否开启监听
[root@root ~]# netstat -tnlp | grep ':80\>' tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 88660/httpd
#也能够经过查看进程来查看httpd相关的进程组
[root@root ~]# 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指定监听的端口开发防火墙
[root@root ~]# iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
#保存此防火墙规则配置
[root@root ~]# iptables-save
5、Httpd2.4 基础配置检查
配置文件格式:
DIRECTIVE VALUE
DIRECTIVE:指令,不区分字符大小写;例如ServerRoot;
VALUE:该值除了文件系统指定路径除外,大多数也不区分大小写;
配置修改完后注意事项:
(1)检查语法; 注:可使用 httpd -t 来检查,若是显示OK则无错误
(2)让服务从新重载配置文件
实例:
#检查配置文件语法是否有误,OK表示无语法错误
[root@root ~]# httpd -t
Syntax OK
#重载服务配置
[root@root ~]# systemctl reload httpd.service
#固然也能够经过发送1号信号让 Httpd守护进程从新生成
[root@root ~]# 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 root@localhost
解析:通常为管理员邮箱,当站点出现问题会发送服务的相关日志信息给指定邮箱。
#设置站点域名,能够设置,如:
ServerName www.example.com:80
注意:此域名默认通常机器不会有,当启动服务时会出现一个提示说找不到ServerName指定域名,所以,能够设置为直接的主机名或者DNS配置的域名便可。
#站点文档及网页根路径
DocumentRoot “/var/www/html”
6、站点文档访问受权及众多服务特性的配置:
一、基于文件系统路径:
<Directory “/PTATH/TO/DIR”>
</Directroy>
<File “”>
</File>
二、基于URL访问:
<Location “URL”>
</Location>
<Location "URL">
</Location>
<LocationMatch ~ "URL_PATTERN">
</LocationMatch>
三、访问的选项节点
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目录
[root@meng ~]# mkdir /var/www/html/xx
#切换到xx目录
[root@meng ~]# cd /var/www/html/xx/
#建立两个带测试内容的文本文件
[root@meng xx]# echo aa > aa.txt [root@meng xx]# echo bb > bb.txt [root@meng xx]# sync
#从新启动服务
[root@meng xx]# service httpd restart
#再次进行访问
[root@meng xx]# links http://10.1.249.185:80/xx/
解析:这里由于没有检查当前目录下有index.html文件,因此会把当前目录下的其它全部文件列表给列出来。
说明:若是去掉Indexes 则表示若是目录下没有index.html文件,则会隐藏该目录下的其它全部文件,如显示如下信息:
[root@meng xx]# links http://10.1.249.185:80/xx/
Forbidden#forbidden #表示为被禁用的意思
解析:这里最后一行就把系统的版本以及web站点服务器软件的版本以及端口后都显示出来。也是当全局设置有ServerTokens OS才会显示。这里显示的Forbidden就是上篇所列出的response响应介接收返回的状态码status code对应的403,及无权限访问此目录下除了默认文件名的默认文档及index.html的其它任何文件。
注意:Directory配置不能指定文件访问,为全局的,所以但若是指定该目录有文件,任然能够直接全路径进行访问指定资源,如查找 aa.txt,如:
[root@meng 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的文件,这时访问此文件时无权限的
[root@meng ~]# echo hello > /var/www/html/xx/hello.txt
#那么给这个修改此文件名的后缀为.log
[root@meng ~]# rename txt log /var/www/html/xx/hello.txt
#则再次使用资源文件全路径去访问hello.log
[root@meng ~]# links http://10.1.249.185/xx/hello.log
说明:这里能够访问说明只对.txt后缀的文件作了访问限制,那么是否是经过全资源路径就没法访问刚才的aa.txt路径了呢?非也,使用curl命令就能够抓取资源,如:
#使用curl将指定路径资源文档页面源代码读取打印
[root@meng ~]# curl http://10.1.249.185/xx/aa.txt aa
#固然直接打印此路径下的全部文件列表仍是不行的
[root@meng ~]# curl http://10.1.249.185/xx/
解析:curl可以根据资源记录来捕获对应的资源的源代码,固然在/var/www/html/xx目录下是没有index.html命名的文件,因此要想打印出下面的文件列表,仍是不行的。那么添加一个index.html 文件。
#在xx目录下添加一个index.html默认首页文档
[root@meng ~]# echo '<html><head><title>新的默认页<title></head><body><h1>Default<h1></body></html>' \ > > /var/www/html/xx/index.html
#使用curl尝试访问并读取其资源
[root@meng ~]# curl http://10.1.249.185/xx
解析:这里彷佛明白了什么,curl只是抓取资源的原代码或原内容,并不会解析对应的html标记,显示了301状态码表示这个目录下的文件被移动过。
#那么显示刚刚创建的/var/www/html/xx/index.html
[root@meng ~]# 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去抓取资源源码
[root@meng ~]# curl http://10.1.249.185/xx/index.html
说明:这样设置了直接对当前整个目录设置了访问控制,那么想要访问此目录的任何文件都不行了,403表示没有权限,curl使用读取web资源内容来打印,可是如今也没有权限去获取此资源文件了,那么使用浏览器或者links更无法了。
总结:
其实这里不必这么麻烦,通常若是在一个目录下有多种类型的文件,这时能够经过设置对应的<Files> 标签来对指定文件名设置访问权限。而去掉<Directory>里Options中的Indexes是为了安全考虑。Indexes的生效主要跟是否有index.html默认页有关,若是没有此默认页,那么去掉此项并设置访问拒绝才不会显示访问到全部文件。若是须要将不想让指定的文件在此目录下被访问,若是在如今的CentOS系统中,就好办了,直接将不想被访问而且被打印在文件列表中:
一、将此文件设置为隐藏文件
二、给对应的文件设置<Files >标签控制访问
验证总结案例实现:
#删除刚才建立的index.html默认页
[root@meng ~]# rm -f /var/www/html/xx/index.html
#修改FIles标签拒绝全部人html/xx目录下全部以.开头并以txt结尾的文件
[root@meng ~]# 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及为隐藏文件
[root@meng ~]# rename aa .aa /var/www/html/xx/aa.txt
#此时经过ls默认选项查看xx目录已经没法找出隐藏文件.aa.txt了
[root@meng ~]# ls /var/www/html/xx/ bb.txt
#经过links访问此目录
[root@meng ~]# links http://10.1.249.185/xx/
解析:由于没有index.html及默认页,全部打印当前目录下的全部资源文件,但不包括隐藏文件,所以.aa.txt并无被打印。
#同时为了防止curl抓取内容,删除全部用户的r及读权限
[root@meng ~]# chmod -r /var/www/html/xx/.aa.txt
#只是经过curl命令来经过web读取资源,就不行了
[root@meng ~]# 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作了限制
[root@meng ~]# whoami root [root@meng ~]# cat /var/www/html/xx/.aa.txt aa
2、Options FollowSymLinks 容许符号连接
说明:容许Directory定义指定目录下建立符号连接来访问其余路径文件。
功能展现
#给/var/www/html默认文档路路径对应的Directory标签中添加此选项:
<Directory “/var/ww/html> Options FollowSymLinks ..........
#在根目录下建立一个目录 :
[root@meng ~]# mkdir /xx
#在xx目录下预习创建一个默认页面
[root@meng ~]# echo echo aa > /xx/index.html
#切换到默认文档根路径
[root@meng ~]# cd /var/www/html/
#给建立的默认页index.html添加httpd服务所需的安全上下文
[root@meng html]# chcon -R -t httpd_sys_content_t /xx/
#在根路径下建立一个符号连接yy文件执行刚才的/xx目录
[root@meng html]# ln -s /xx/ yy
#查看文档目录下的全部文件的安全上下文
[root@meng 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服务配置
[root@meng html]# pkill -HUP 'httpd.*'
#进行站点下的yy服务连接,显示结果实际为文件系统根路径下的xx目录,及/xx
[root@meng 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 不使用任何设定