共计 10456 个字符,预计需要花费 27 分钟才能阅读完成。
1、建立连接:接收或拒绝链接请求2、接受请求:接收客户端请求报文中对某资源的一次请求的过程
Web 访问响应模型(Web I/O)单进程 I / O 模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应;多进程 I / O 模型:并行启动多个进程,每个进程响应一个链接请求;复用 I / O 结构:启动一个进程,同时响应 N 个链接请求;实现方法:多线程模型和事件驱动;多线程模型:一个进程生成 N 个线程,每线程响应一个连接请求;事件驱动:一个进程处理 N 个请求。复用的多进程 I / O 模型:启动 M 个进程,每个进程响应 N 个连接请求,同时接收M*N 个请求。
3、处理请求:
服务器对请求报文进行解析,并获取请求的资源及请求方法
等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理元数据:请求报文首部<method> <URL> <VERSION>HEADERS 格式 name:value<request body>
示例:Host : www.magedu.com 请求的主机名称Server: Apache/2.4.7HTTP 常用请求方式,Method GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
4、访问资源:
服务器获取请求报文中请求的资源 web 服务器,即存放了 web 资源的服务器,负责向请求者提供对方请求的静态资源,或 动态运行后生成的资源。资源放置于本地文件系统特定的路径:DocRoot –> /var/www/html/var/www/html/images/logo.jpghttp://www.magedu.com/images/logo.jpgweb 服务器资源路径映射方式:
(a) docroot(b) alias(c) 虚拟主机 docroot(d) 用户家目录 docroot
5、构建响应报文:
一旦 Web 服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体。
1)响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:描述了响应主体 MIME 类型的 Content-Type 首部描述了响应主体长度的 Content-Length 实际报文的主体内容2)URL 重定向:web 服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径:
永久重定向:http://www.360buy.com临时重定向:http://www.taobao.com
3)MIME 类型:
Web 服务器要负责确定响应主体的 MIME 类型。有很多配置服务器的方法可以将 MIME 类型与资源管理起来 ;魔法分类:Apache web 服务器可以扫描每个资源的内容,并将其与一个已知模式表 (被称为魔法文件) 进行匹配,以决定每个文件的 MIME 类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名的时候;显式分类:可以对 Web 服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个 MIME 类型。类型协商:有些 Web 服务器经过配置,可以以多种文档格 式来存储资源。在这种情况下,可以配置 Web 服务器,使其可 以通过与用户的协商来决定使用哪种格式(及相关的 MIME 类型)”最好”
6、发送响应报文
Web 服务器通过连接发送数据时也会面临与接收数据一 样的问题。服务器可能有很多条到各个客户端的连接,有些是空 闲的,有些在向服务器发送数据,还有一些在向客户端回送响应 数据。服务器要记录连接的状态,还要特别注意对持久连接的处 理。对非持久连接而言,服务器应该在发送了整条报文之后,关 闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状 态,在这种情况下,服务器要正确地计算 Content-Length 首部,不然客户端就无法知道响应什么时候结束了
7、记录日志
最后,当事务结束时,Web 服务器会在日志文件中添加 一个条目,来描述已执行的事务
特性:
高度模块化:core+modulesDSO:Dynamic Shared Object 动态加 / 卸载MPM:multi-processing module 多路处理模块MPM 工作模式:
prefork:多进程 I / O 模型,每个进程响应一个请求,默认模型。一个主进程:生成和回收 n 个子进程,创建套接字,不响应请求多个子进程:工作 work 进程,每个子进程处理一个请求;系统初始 时,预先生成多个空闲进程,等待请求,最大不超过 1024 个。worker:复用的多进程 I / O 模型, 多进程多线程,IIS 使用此模型。一个主进程:生成 m 个子进程,每个子进程负责生成 n 个线程,每个 线程响应一个请求,并发响应请求:m*nevent:事件驱动模型(worker 模型的变种)一个主进程:生成 m 个子进程,每个进程直接响应 n 个请求,并发响 应请求:m*n,有专门的线程来管理这些 keep-alive 类型的线程,当有 真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样 增强了高并发场景下的请求处理能力。httpd-2.2: event 测试版,centos6 默认httpd-2.4:event 稳定版,centos7 默认
版本:centos6:2.2centos7:2.4安装方式:rpm:centos 发行版,稳定,建议使用编译:定制或特殊需求Centos 6 程序环境:httpd-2.2配置文件:/etc/httpd/conf/httpd.conf/etc/httpd/conf.d/*.conf检查配置语法:httpd -t
service httpd configtest
进行语法检测时,会报错,虽然没有影响,但是也不好看;解决方法:
方法一:
方法二:vim /etc/hosts 进行本地地址解析
服务脚本:/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd服务控制和启动:
chkconfig httpd on|offservice {start|stop|restart|status|configtest|reload} httpd
站点网页文档根目录:/var/www/html模块文件路径:
/etc/httpd/modules
/usr/lib64/httpd/modules
主程序文件:
/usr/sbin/httpd/usr/sbin/httpd.worker/usr/sbin/httpd.event主进程文件:/etc/httpd/run/httpd.pid/var/run/httpd/httpd.pid
日志文件目录:
/var/log/httpdaccess_log: 访问日志error_log:错误 日志
帮助文档包:
httpd-manual
如果上不了网时,可以手动安装文档包,进行查看
Httpd 2.2 常见配置模块文件路径:
/usr/lib64/httpd/modules
httpd 配置文件的组成:
# grep“Section”/etc/httpd/conf/httpd.conf 主配置文件### Section 1: Global Environment 全局环境匹配### Section 2:‘Main’server configuration 主服务的的配置### Section 3: Virtual Hosts 虚拟主机配置
配置格式:
directive + value 指令 + 值
directive: 不区分字符大小写value: 为路径时,是否区分大小写,取决于文件系统
下面先介绍一个小实验,再介绍 HTTPD 的基本配置:
在客户端机器连接服务器时,显示出 Apache 版本信息,不安全。编辑 HTTPD 主配置文件,加上下面一行就可以了
#vim /etc/httpd/conf/httpd.conf
ServerTokens productonly(可以简写 prod)
service restart httpd
HTTPD 基本配置及用法:
1、切换工作模式:
vim /etc/sysconfig/httpdHTTPD=/usr/sbin/httpd.worker
2、修改监听的 IP 和 Port
Listen [IP:]PORT(1) 省略 IP 表示为 0.0.0.0;表示监听本机所有 IP;(2) Listen 指令可重复出现多次Listen 80Listen 8080(3) 修改监听 socket,重启服务进程方可生效
4、MPM(Multi-Processing Module)多路处理模块:
prefork, worker, event(试验阶段)httpd-2.2 不支持同时编译多个模块,所以只能编译时选定一个;rpm 安装的包提供三个二进制程序文件,
分别用于实现对不同 MPM 机制的支持
确认方法:
ps aux | grep httpd默认为 /usr/sbin/httpd, 即 prefork 模式查看静态编译的模块:httpd -l查看静态编译及动态装载的模块:httpd –M动态模块加载:不需重启即生效动态模块路径:/usr/lib64/httpd/modules/
更换使用的 httpd 程序:vim /etc/sysconfig/httpdHTTPD=/usr/sbin/httpd.worker重启服务生效httpd.worker -l 查看pstree -p |grep httpd 查看进程和线程测试:yum install httpd-toolsab -c 1000 -n 10000 http://192.168.164.129/
prefork 的默认配置:
<IfModule prefork.c>StartServers 8 开机启动时,默认开启 8 个进程MinSpareServers 5 最小空闲进程MaxSpareServers 20 最大空闲进程ServerLimit 256 最多进程数, 最大 20000MaxClients 256 最大并发MaxRequestsPerChild 4000 子进程最多能处理的请求 数量。在处理 MaxRequestsPerChild 个请求之后,
子进程将 会被父进程终止,这时候子进程占用的内存就会释放(为 0 时 永远不释放)
</IfModule>worker 的默认配置:<IfModule worker.c>StartServers 4 开机启动时,默认开启 4 个进程MaxClients 300 最大支持多少客户端并发访问MinSpareThreads 25 最小的空闲线程MaxSpareThreads 75 最大的空闲线程ThreadsPerChild 25 每个子进程生成的线程数量MaxRequestsPerChild 0 无限制</IfModule>
5、DSO:Dynamic Shared Object 动态共享对象
加载动态模块配置:/etc/httpd/conf/httpd.conf配置指令实现模块加载格式:LoadModule <mod_name> <mod_path>模块文件路径可使用相对路径:相对于 ServerRoot(默认 /etc/httpd)指向的路径而言:/etc/httpd/modules/
示例:要使用某个某块,需按照下面格式,加载到主配置文件里即可:
LoadModule auth_basic_module modules/mod_auth_basic.so
6、定义’Main’server 的文档页面路径 :
DocumentRoot“/path”网站主页目录文档路径映射:DocumentRoot 指向的路径为 URL 路径的起始位置
下面先介绍一下,什么是 URL:
URL 组成<scheme>://<user>:<password>@<host>:<port>/<path>;<params> ?<query>#<frag>schame: 方案,访问服务器以获取资源时要使用哪种协议user: 用户,某些方案访问资源时需要的用户名password: 密码,用户对应的密码,中间用:分隔Host: 主机,资源宿主服务器的主机名或 IP 地址port: 端口, 资源宿主服务器正在监听的端口号,很多方案有默认端口号path: 路径, 服务器资源的本地名,由一个 / 将其与前面的 URL 组件分隔params: 参数,某些方案用这个组件来指定输入的参数,参数为名 / 值对,URL 中可多含多个参数,用; 分隔 .query: 查询,某些方案会用这个组件传递参数以激活程序,如数据库,用?分隔, 多个查询用 & 分隔frag: 片段, 一小片或一部分资源的名字,此组件在客户端使用,用 #分隔
好了,通过以上已经了解了什么事 URL 了,下面介绍怎么设置主页等相关操作:
实验:更改 HTTPD 主页;实验环境在 centos6.9 主机上搭建的 HTTPD 服务,
(主机 IP:192.168.164.129)
首先自定义一个主页目录以及文件:
#vim /etc/httpd/conf/httpd.confDocumentRoot“/app/website1”#service httpd reload访问测试:
如果以上自定义的主页文件不存在时,会出现以下情景:
默认情况下, 会在 /var/www/html 目录下找 index.html 这个主页文件,如果找不到,则显示下图主页。DirectoryIndex index.html index.html.varInclude conf.d/*.conf下图主页文件:/etc/httpd/conf.d/welcome.conf
如果 welcome.conf 这个文件也找不到,会出现下图的情景:
cd /etc/httpd/conf.d
mv welcome.conf welcome.conf.bak
如果把主配置文件里的主页目录再改回去,cd /var/www/html/mv index.html b.html
下图把主页目录下的文件都列出来了,不安全vim /etc/httpd/conf/httpd.confOption -Indexes FollowSymLinksservice httpd reload
下图中,再次访问网站时,主目录下的文件就显示不了,变得安全点。
注意:SELinux 和 iptables 的状态
7、站点访问控制常见机制
可基于两种类型的路径指明对哪些资源进行何种访问控制访问控制机制有两种:客户端来源地址,用户账号文件系统路径:<Directory“/path“>…</Directory><File“/path/file”>…</File><FileMatch“PATTERN”>…</FileMatch>URL 路径:<Location””>…</Location><LocationMatch”“>….</LocationMatch>
示例:
<FilesMatch“.(gif|jpe?g|png)$”><Files“?at.*”> 通配符<Location /status><LocationMatch“/(extra|special)/data”>访问控制机制:基于来源地址基于账号Directory 中“基于来源地址”实现访问控制
(1)Options:后跟 1 个或多个以空白字符分隔的选项列表 在选项前的+,- 表示增加或删除指定选项所有可用特性:Indexes Includes FollowSymLinksSymLinksifOwnerMatch ExecCGI MultiViews常见选项:Indexes:指明的 URL 路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户。没写时默认是不开启的。
FollowSymLinks:允许访问主页目录下的符号链接文件所指向的源文件 ; 没写时默认是开启的。None:全部禁用All:全部允许
(2) AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的 .htaccess(由AccessFileName 指定)文件中,覆盖之前的配置指令只对 <directory> 语句有效AllowOverride All: 所有指令都有效AllowOverride None:.htaccess 文件里定义的策略无效AllowOverride AuthConfig Indexes 除了 AuthConfig 和Indexes 的其它指令都无法覆盖示例:实现 AllowOverride , 基于指定目录.htaccess, 以及 FollowSymlinks 的用法
# vim /etc/httpd/conf/httpd.conf
touch /app/website1/.htaccess访问测试,访问软链接,直接指向源文件的内容。
(3)基于来源地址的访问控制机制
Order:定义生效次序;写在最后面的表示默认法则Order allow,deny:默认拒绝Order deny,allow:默认允许Allow from
Deny from
来源地址:IPNetAddr: 172.16172.16.0.0172.16.0.0/16
具体用法:下图中定义了 order allow,deny 先允许,后拒绝;根据法则后定义的生效
#curl http://192.168.164.29 是被拒绝访问的
8、定义默认主页面
DirectoryIndex index.html inex.html.var
9、日志设定
日志类型:访问日志 错误日志错误日志:
ErrorLog logs/error_logLogLevel warn 定义日志级别,默认值 warn
loglevel 可选值: debug, info, notice, warn,error crit, alert, emerg访问日志:/var/log/httpd/access_log定义日志格式:LogFormat format stringsLogFormat“%h %l %u %t”%r”%>s %b”%{Referer}i””%{User-Agent}i””combined使用日志格式:CustomLog logs/access_log combined参考帮助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h 客户端 IP 地址%l 远程用户, 启用 mod_ident 才有效,通常为减号“-”%u 验证(basic,digest)远程用户, 非登录访问时,为 一个减号“-”%t 服务器收到请求时的时间%r First line of request,即表示请求报文的首行;记录了 此次请求的“方法”,“URL”以及协议版本%>s 响应状态码%b 响应报文的大小,单位是字节;不包括响应报文 http 首部%{Referer}i 请求报文中首部“referer”的值;即从哪个页 面中的超链接跳转至当前页面的%{User-Agent}i 请求报文中首部“User-Agent”的值;即 发出请求的应用程序
10、定义路径别名
格式:Alias /URL/“/PATH/”DocumentRoot“/www/htdocs”http://www.magedu.com/download/bash.rpm==>/www/htdocs/download/bash.rpm
Alias /download/“/rpms/pub/”
http://www.magedu.com/download/bash.rpm==>/rpms/pub/bash.rpmhttp://www.magedu.com/images/logo.png
==>/www/htdocs/images/logo.png注意:以上红色字体标识,是一一对应的,注意 / 路径和别名的区分。
11、设定默认字符集AddDefaultCharset UTF-8中文字符集:GBK, GB2312, GB1803012、基于用户的访问控制
认证质询:WWW-Authenticate: 响应码为 401,拒绝客户端请求,并说明要求客户端提供账号和密码认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源认证法式两种:basic:明文–不安全,可以基于 https 访问digest:消息摘要认证,兼容性差安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便告知用户认证的原因用户的账号和密码虚拟账号:仅用于访问某服务时用到的认证标识存储:文本文件,SQL 数据库,ldap 目录存储,nis 等
basic 认证配置示例:
(1) 定义安全域<Directory“/path”>Options NoneAllowOverride None 是否允许验证.htaccess 文件AuthType Basic 认证类型AuthName“String”管理目录提示语句AuthUserFile“/PATH/HTTPD_USER_PASSWD_FILE”验证配置文件Require user username1 username2 …指定用户</Directory>允许账号文件中的所有用户登录访问:Require valid-user
(2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理htpasswd 命令来源于 httpd-tools 包htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用-m:md5 格式加密-s:sha 格式加密-D:删除指定用户
实验:基于用户账号密码认证的访问控制;
实验环境在 centos6.9 上搭建 httpd 服务,(192.168.8.128)
也可以定义在.htaccess 文件里:
vim /etc/httpd/conf/httpd.conf
实验:基于用户组的安全认证, 在上个实验基础上实现
示例:
Require valid-user
14、虚拟主机
站点标识:socketIP 相同,但端口不同IP 不同,但端口均为默认端口FQDN 不同;请求报文中首部Host: www.magedu.com有三种实现方案:
基于 ip:为每个虚拟主机准备至少一个 ip 地址;基于 port:为每个虚拟主机使用至少一个独立的 port;基于 FQDN:为每个虚拟主机使用至少一个 FQDN
注意:一般虚拟机不要与 main 主机混用;因此,要使用虚拟主机,一般先禁用 main 主机禁用方法:注释中心主机的 DocumentRoot 指令即可虚拟主机的配置方法:
<VirtualHost IP:PORT>ServerName FQDNDocumentRoot“/path”</VirtualHost>建议:上述配置存放在独立的配置文件中
其它可用指令:
ServerAlias:虚拟主机的别名;可多次使用ErrorLog:错误日志CustomLog:访问日志<Directory“/path”> </Directory>Alias
15、status 页面帮助我们实现 http 服务器的一些功能状态的查看, 以页面的方式查看他的工作情况:进程编号,负载状态。vim /etc/httpd/conf/httpd.conf
LoadModule status_module modules/mod_status.so要想实现 status 功能, 模块必须加载。
可以在虚拟机设置里面定义,也可以单独定义在 conf.d 目录下。
<Location /server-status>SetHandler server-statusOrder allow,denyAllow from 172.16</Location>ExtendedStatus On 显示扩展信息