http的工作模式:
http请求报文:http request
http响应报文:http response
一次http事务:请求 <-->响应
web资源:web resource
静态资源(无须服务端做出额外处理):.jpg .png .gif .html .txt .js .css .mp3 .avi
动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序的运行结果): .php .jsp
注意:一个页面中展示的资源肯有多个;每个资源都需要单独请求;
一次完整的http请求处理过程:
1.建立或处理连接:接收请求或拒绝请求;
2.接收请求:接收来自于网络上的主机请求报文中对某特点资源的一次请求的过程;
3.处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
4.访问资源:获取请求报文中请求的资源;
5.构建响应报文;
6.发送响应报文;
7.记录日志:可以做用户分析
2.接收请求
接收请求的模型:
并发访问响应模型:
单进程I/O模型:启动一个进程处理用户请求;这意味着,一次只能处理一个请求,多个请求被串行响应;
多进程I/O结构:并发启动多个进程,每个进程响应一个请求;
复用的I/O结构:一个进程响应n个请求;
多线程模式:一个进程生成n个线程,一个线程处理一个请求;
事件驱动(event-driven):一个进程直接响应n个请求;
复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程;
响应的请求的数量:m*n;
3.处理请求 :分析请求报文的http请求报文首部
http协议:
http请求报文首部
http响应报文首部
请求报文首部的格式:
<method><URL><VERSION>
HEADERS:(name:value)
<request body>
4.访问资源:获取请求报文中请求的资源
web服务器,即存放了web资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果; 这些资源通常应该放置于本地文件系统某路径下;此路径称为DocRoot;
web服务器的资源路径映射方式:
1. DocRoot
2. alias
3. 虚拟主机的DocRoot
4. 用户家目录的DocRoot
http请求处理中的连接模式:
保持连接(长连接):kepp-alive
时间:
数量:
非保持连接(短连接):
http服务器程序:
httpd (apache)
nginx
lighttpd
应用程序服务器:
IIS: .Net
tomcat: .jsp
httpd的安装和使用:
ASF: apache software foundation # Apache软件基金会
httpd : apache
httpd的特性:
高度模块化:core + modules
DSO:dynamlc shared object
MPM:Multipath processing Modules (多路处理模块)
prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
n个子进程:每个子进程处理一个请求;
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
worker:多进程多线程模型,每线程处理一个用户请求;
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
多个子进程:每个子进程负责生成多个线程;
每个线程:负责响应用户请求;
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量;
event:事件驱动模型,多进程模型,每个进程响应多个请求;
一个主进程,负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
子进程:基于事件驱动机制直接响应多个请求;
httpd-2.2: 仍为测试使用模型;
httpd-2.4:event可生产环境中使用;
httpd的功能特性:
CGI: Common Gateway Interface
虚拟主机:ip, port, FQDN
反向代理:
负载均衡:
路径别名:
丰富的用户认证机制
basic
digest
支持第三方模块
安装httpd:
rpm包: centos发行版中直接提供;
编译安装:定制新功能,或其它原因;
centos 6:
程序环境:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日志文件:
/var/log/httpd/
access_log:访问日志
error_log :错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules/
centos 6服务控制和启动:
chkconfig httpd on | off
service { start | stop | restart | status | configtest | reload } httpd
centos 7: httpd-2.4
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
模块相关的配置文件:/etc/httpd/conf.modules.d/*.conf
systemd unit file:
/usr/lib/systemd/system/httpd.service
主程序文件:
/usr/sbin/httpd
httpd-2.4支持MPM的动态切换;
日志文件:
/var/log/httpd/
access_log:访问日志
error_log :错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules/
服务控制:
systemctl enable | disable httpd.service
systemctl { start | stop | restart | status } httpd.service
httpd-2.2的常用配置:
httpd-2.2的常用配置:
主配置文件:/etc/httpd/conf/httpd.conf
### Section 1: Global Environment # 第1节:全局环境
### Section 2: 'Main' server configuration # 第2节:主服务器配置
### Section 3: Virtual Hosts # 第三节:虚拟主机
配置格式:
directive value
directive #指令 :不区分字符大小写;
value #值 :为路径时,是否区分字符大小写 ,取决于文件系统;
常用配置: /etc/httpd/conf/httpd.conf
1.修改监听的IP和port
Listen 12.34.56.78:80
Listen 80
(1)省略IP表示为0.0.0.0
(2)Listen 指令可重复出现多次;
Listen 80
Listen 8080
(3)修改监听socket, 启动服务进程方可生效;
2.持久连接
Persistent Connection: tcp连接建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行;
如何断开?
数量限制
时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
折衷:使用较短的持久连接时长,以及较少的请求数量;
KeepAlive On | Off #开启持久连接时长
KeepAliveTimeout 15 #持久连接时长保持15秒
MaxKeepAliveRequests 100 #表示这个链接请求不能超过100次(一般长连接模式用到),如果设置为0表示永远可用,但为了服务器性能最好还是设置一个较大的值
测试:
[root@Centos7ip11 ~]# telnet 192.168.0.7 80
Trying 192.168.0.7...
Connected to 192.168.0.7.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host:192.168.0.7
HTTP/1.1 200 OK
Date: Sun, 31 Mar 2019 12:47:01 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Sun, 31 Mar 2019 11:53:23 GMT
ETag: "122db2-16-585628d0bde6a"
Accept-Ranges: bytes
Content-Length: 22
Content-Type: text/html; charset=UTF-8
<h1>hello word! </h1>
Connection closed by foreign host.
3.MPM
httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个; CentOS 6的rpm包为此专门提供了三个应用程序文件, httpd(prefork), httpd.worker, httpd.event, 分别用于实现对不同的MPM机制的支持;
确认现在使用的是哪个程序文件的方法:
~]# ps aux | grep httpd
~]# /usr/sbin/httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
默认使用的为/usr/sbin/httpd, 其为prefork的MPM模块;
查看httpd程序的模块列表:
查看静态编译的模块: ~]# httpd -l
查看静态编译及动态编译的模块: ~]#httpd -M
更新使用httpd程序,以支持其它MPM机制;
修改/etc/sysconfig/httpd文件
# HTTPD=/usr/sbin/httpd.{worker | event}
注意:重启服务进程方可生效;
MPM配置:
prefork的配置
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
#StartServers:要启动的服务器进程数
#minspareservers:保留备用的服务器进程的最小数目
#MaxSpareServers:保留备用的服务器进程的最大数目
#ServerLimit:服务器生存期内MaxClients的最大值
#maxclients:允许启动的最大服务器进程数
#maxrequestsperschild:服务器进程服务的最大请求数
worker的配置
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
#StartServers:要启动的服务器进程的初始数目
#maxclients:同时进行的最大客户端连接数
#minspareThreads:保留备用的最小工作线程数
#maxsparethreads:保留备用的最大工作线程数
#threadsperchild:每个服务器进程中的工作线程数保持不变
#maxrequestsperschild:服务器进程服务的最大请求数
PV, UV
page view 页面浏览量
user view
4.DSO
配置指定实现模块加载
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:
相对于ServerRoot (默认/etc/httpd)
5.定义“Main”server 的文档页面路径 Main server #主服务器
DocumentRoot "/var/www/html"
文档路径映射:
DocumentRoot 指向的路径为URL路径的起始位置
其相对于站点URL的根路径;
(FileSystem)/web/host1/index.html -->(URL) /index.html
6.站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制
文件系统路径:
<Directory "">
....
</directory>
<File "">
....
</File>
<FileMatch "PATTERN">
....
</FileMatch>
URL路径:
<Location "">
....
</Location>
</LocationMatch "">
....
</LocationMatch>
<Directory>中“基于源地址”实现访问控制:
(1)Options
后跟1个或多个以空白字符分割的“选项”列表;
Indexes: 指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
None:
All:
(2) AllowOverride
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
All:
None:
(3)order和allow, deny
order:定义生效次序;写在后面的表示默认法则;
7.定义站点主页面:
DirectoryIndex index.html index.html.var
8.定义路径别名
格式: Alias /URL/ "/PATH/TO/SOMEDIR/"
DocumentRoot "/www/htdocs"
http://www.itxuezhe.com/download/bash-4.4.2-3.el6.x86_64.rpm
/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias /download/ "/rpms/pub/"
http://www.itxuezhe.com/download/bash-4.4.2-3.el6.x86_64.rpm
/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
http://www.itxuezhe.com/images/logo.png
/www/htdocs/images/logo.png
9.设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
10.日志设定
日志类型:访问日志和错误日志
ErrorLog logs/error_log
LogLevel warn #日志级别警告 从低到高 1.debug, 2.info, 3.notice, 4.warn, 5.error, 6.crit, 7.alert, 8.emerg.
Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
访问日志:
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat format strings: #日志格式字符串
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
自定义日志格式
LogFormat
和CustomLog
指令的format参数是一个字符串。此字符串用于将每个请求记录到日志文件中。它可以包含复制到日志文件中的文字字符和C风格的控制字符“\ n”和“\ t”来表示新行和制表符。应使用反斜杠转义文字引号和反斜杠。
通过%
在格式字符串中放置“ ”指令来记录请求本身的特征,这些指令在日志文件中由值替换如下:
%h远程主机, {客户端ip地址}
%l远程日志名称,通常为一个减号(“-”);
%u远程用户(来自auth;如果返回状态(%s)为401 则可能是假的); 非为登陆访问时,其为一个减号;
%t收到请求的时间(标准英文格式)
%r请求报文的首行;记录了此次请求的“URL”以及协议版本;
%>s响应状态码;
%b响应大小(以字节为单位),不包括HTTP标头;
%{Foobar}i : 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
%{User-Agent}i :请求报文中首部“User-Agent”的值;即发出请求的应用程序;
11.基于用户的访问控制
认证质询:
www-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式有两种:
basic:明文
digest:消息摘要认证
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
用户的账号和密码存放于何处?
虚拟账号:仅用于访问某服务时用到的认证标识
存储:
文本文件;
SQL数据库;
ldap目录存储;
basic认证配置实例:
(1)定义安全域
<Directory"">
Options None
AllowOverrlde None
AuthType Basic
AuthName "String"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "PATH/TO/HTTPD_GROUP_FILE"
Require group grpname1 grpname2.....
</Directory>
(2)创建用户账号和组账号文件;
组文件:每一行定义一个组
GRP_NAME: username1 username2 .....
12.虚拟主机
13.status页面
14.