应用层:
http,https
实现某类具体应用:
传输层协议:TCP,UDP,SCTP
工作模式:C/S架构
IANA:
0-1023:众所周知,永久地分配给固定的应用使用,特权端口;
1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用;3306(mysql),11211(memcached)
41952+:客户端程序随机使用的端口,动态端口或私有端口;其范围定义在/proc/sys/net/ipv4/ip_local_port_range;
BSD Socket:
IPC(进程间通信)的一种实现,允许位于不同主机或同一主机上的进程之间进行通信;
Socket API: 封装了内核中的socket相关的系统调用
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW:裸套接字
根据套接字所使用的地址格式,套接字域:
AF_INET: Address Family,IPv4
AF_INET6: IPv6
AD_UNIX: 同一主机上的不同进程间基于套接字通信使用的一种地址;Unix_Sock
TCP协议的特性:
建立链接:
1.三次握手
2.将数据打包成段: 检验和(CRC32)
3.确认、重传即超时机制
4.排序:基于逻辑序号进行
5.流量控制:滑动窗口算法
6.拥塞控制:慢启动和拥塞避免算法
HTTP: hyper text transfer protocol(超文本传输协议)
Listen: 80;
html:超文本标记语言;
<html>
<head>
<title>
<h1></h1>
<p>.....</p>
</title>
</head>
</html>
协议版本:
http/0.9:原型版本,功能简陋
http/1.0:cache,MIME,method
MIME(多用户互联网邮件扩展): 可将实际发送的非文本协议通过编码反解析为文本协议处理
method: GET、POST、PUT、HEAD、DELETE、TRACE、OPTIONS...
http/1.1: 增强了缓存功能;
http/2.0
工作模式:
http请求报文: http request
http响应报文: http response
由请求与之对应的响应称之为http的一次相关事物
web资源:web resource
静态资源(无需服务端做出额外处理):.jpg,.png,.gif,.html,.txt,.js,.css,.mp3,.avi
动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序的运行结果):.php,.jsp...
注意: 一个页面中展示的资源可能由多个;每个资源都需要单独请求;
资源的标识机制:URL
Uniform Resource Locator: 用于描述服务器某特定资源的位置
一次完整的http请求处理过程:
1.建立或处理链接: 接收请求或拒绝请求;
2.接收用户请求: 接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程;
3.处理请求: 对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
4.访问资源: 获取请求报文中请求的资源;
5.构建响应报文: 以此响应报文响应客户端;
6.记录日志;
接收请求的模型:
并发访问响应模型:
单进程I/O模型:启动一个进程处理用户请求;这意味着,一次只能处理一个请求,多个请求被串行响应;
多进程I/O结构:由父进程并行启动多个进程,每个进程响应一个请求;
复用的I/O结构:一个进程响应n个请求;
多线程模式:一个进程生成n个线程,一个线程处理一个请求;
事件驱动(event-driven):一个进程直接响应n个请求;
复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程;
响应的请求的数量:m*n
httpd的特性:
高度模块化:core + modules
MPM:多路处理模块
prefork:多进程模型,每个进程响应一个请求
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
n个子进程:每个子进程处理一个请求;
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
worker:多进程多线程模型,每线程处理一个用户请求
一个主进程:负责生成子进程;负责创建套接字;负责接收请求;并将其派发给某子进程进行处理;
多个子进程:每个子进程负责生成多个线程;
并发相应数量:m * n
m:子进程数量
n:每个子进程所能创建的最大线程数量;
event:事件驱动模型,多进程模型,每个进程响应多个请求;
一个主进程:负责生成子进程;负责创建套接字;负责接收请求;并将其派发给某子进程进行处理;
子进程:基于事件驱动机制直接响应多个请求;
httpd的功能特性:
虚拟主机:IP、PORT、FQDN
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
.....
配置文件:
配置格式:
directire value
directive: 不区分大小写;
value: 为路径时,是否区分字符大小写,取决于文件系统;
常用配置:
1.修改监听的IP和PORT
Listen [IP-address:]portnumber [protocol]
(1)省略IP表示0.0.0.0;
(2)Listen指令可重复出现多次:
Listen 80
Listen 8080
(3)修改监听socket,重启服务进程方可生效
(4)限制其必须通过ssh通信时,protocol需定义为https;
2.持久连接
tcp连接建立后,每个资源获取完成后不会断开连接,而是继续等待其他资源请求的进行l
如何断开?
数量限制
时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常的响应;
折中:使用较短的持久连接时长,以及较少的请求数量;
KeepAlive On | Off // 是否开启持久连接
KeepAliveTimeout 15 // 长连接的超时时长
MaxKeepAliveRequests 100 // 保持持久连接的最大数量
如何测试?
#####测试KeepAlive未开启状况#####
~]# vim /etc/httpd/conf.d/keepalive.conf
KeepAlive Off
~]# systemctl restart httpd
~]# telnet 192.168.23.102 80
Trying 192.168.23.102...
Connected to 192.168.23.102.
Escape character is '^]'.
GET /index.html HTTP/1.1 // 手动输入
Host:192.168.23.101 // 手动输入
HTTP/1.1 200 OK
Date: Mon, 27 May 2019 08:01:30 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 05 May 2019 09:45:59 GMT
ETag: "1a-58820d9e421eb"
Accept-Ranges: bytes
Content-Length: 26
Connection: close // 头部讯息直接关闭(因为没有打开KeepAlive)
Content-Type: text/html; charset=UTF-8
<h1>Upsream server 2</h1> // index.html信息
Connection closed by foreign host.
#####测试KeepAlive开启后状况#####
~]# vim /etc/httpd/conf.d/keepalive.conf
KeepAlive On
KeepAliveTimeout 15
MaxKeepAliveRequests 100
~]# systemctl restart httpd
~]# telnet 192.168.23.102 80
Trying 192.168.23.102...
Connected to 192.168.23.102.
Escape character is '^]'.
GET /index.html HTTP/1.1 // 手动输入
Host:192.168.23.102 // 手动输入,回车后会发现响应后会停留一段时间
Date: Mon, 27 May 2019 08:07:25 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 05 May 2019 09:45:59 GMT
ETag: "1a-58820d9e421eb"
Accept-Ranges: bytes
Content-Length: 26
Content-Type: text/html; charset=UTF-8
<h1>Upsream server 2</h1>
Connection closed by foreign host.
3.MPM
prefork的配置(http://httpd.apache.org/docs/2.4/mod/prefork.html:
<IfModule prefork.c> // 如果httpd使用的是prefork模型
StartServers 8 // 启动httpd服务后生成几个进程
MinSpareServers 5 // 最小空闲服务进程
MaxSpareServers 20 // 最大空闲服务进程
ServerLimit 256 // 对于MaxClients的值来讲,允许同时在生命周期内处于活跃状态的服务进程有多少个
MaxClients 256 // 最大允许启动的服务子进程数量
MaxRequestsPerChild 4000 // 一个子进程最多只能处理4000个请求(为0则永不过期)
</IfModule>
worker的配置:
<IfModule worker.c> // 如果httpd使用的是worker模型
StartServers 4 // 启动httpd服务后生成几个进程
MaxClients 306 // 最大允许启动的服务子进程数量
MinSpareServers 25 // 最小空闲服务进程
MaxSpareServers 75 // 最大空闲服务进程
ThreadsPerChild 25 // 每个子进程上来生成的线程数
MaxRequestsPerChild 0 // 不限制
httpd-2.4修改MPM
~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
// 将要启用的模型取消注释即可
4.DSO
配置指定实现模块加载
LoadModule <mode_name> <mode_path>
模块文件路径可使用相对路径:
相对于ServerRoot(默认为/etc/httpd)
5.定义'Main' Server的文档页面路径
ServerName // 服务器的名称,如果为空httpd会将IP地址反解为FQDN
ServerAlias // 服务器的别名
DocumentRoot ""
文档路径映射:
DocumentRoot指向的路径为URL路径的其实位置
其相对于站点URL的根路径
6.站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制
文件系统路径:
<Directory "">
...
</Directory>
<File "">
...
</File>
<FileMatch "PATTERN">
...
</FileMatch>
URL路径:
<Location "">
...
</Location>
<LocationMatch "">
...
</LocationMatch>
<Directory>中"基于源地址"实现访问控制:
(1) Options
后跟一个或多个以空白字符分割的"选项"列表
Indexes: 指明的URL路径下不存在主页文件时,返回文件夹下所有列表给用户,去除的话则删除Indexes;
FollowSymLinks: 允许跟踪符号链接文件所指向的源文件;
None: 所有选项都不启用
ALL: 所有选项都启用
资源访问控制:
httpd-2.2
order和allow、deny
order:定义生效的次序;写在后面的表示默认法则;
Allow from
Deny from
来源地址:
IP
NetAddr:
192.168
192.168.0.0
192.168.0.0./24
httpd-2.4
<RequireAll> // 配置块
Require all granted // 允许所有来源IP地址访问
Require not ip IP地址 // 阻止来源的某个IP访问
Require ip ip地址或网络地址 // 允许指定IP访问
</RequireAll>
(2)控制页面资源允许所有来源的主机可访问?
httpd-2.2
<Directory "">
...
Order allow,deny
Allow from all
</Directory>
httpd-2.4
<Directory "">
...
Require all granted
</Directory>
(3)控制页面资源拒绝所有来源的主机可访问?
<Directory "">
...
Order allow,deny
deny from all
</Directory>
httpd-2.4
<Directory "">
...
Require all denied
</Directory>
7. 定义站点主页面
DirectoryIndex index.html index.html.var
8. 定义路径别名
格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"
案例:
~]# mkdir /var/www/html/images
~]# vim /etc/httpd/conf/httpd.conf
<IfModule alias_module>
....
Alias /images "/usr/share/backgrounds" //当用户访问http://IP/images时相当于访问/var/www/html/usr/share/backgrounds
</IfModule>
<Directory "/usr/share/backgrounds">
Options Indexes FollowSymlinks
Require all granted
</Directory>
9. 设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK,GB2312,GB18030
10.日志设定
日志类型:访问日志和错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn
Possible values include: debug,info,notice,warn,error,crit,alert,emerg;
访问日志:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
LogFormat format strings:
http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats
%h: 客户端IP地址
%l: Remote User,通常为一个减号('-')
%u: Remote User(from authlmay be bogus if return status (%s) is 401);非登录访问时,为一个减号('-')
%t: 服务器收到请求时的时间
%r: 请求报文首部
%s: 服务器响应状态码
%>s: 记录最后一次的服务响应状态码
%b: 响应报文的大小,但不包含响应的首部大小
%{Referer}i: 从哪个位置跳到本次网页
%{User-Agent}i: 请求报文首部中"User-Agent"的值;即发出请求的应用程序(客户端浏览器程序);
11. 基于用户的访问控制
认证质询:
WWW-Authenticate: 响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:
Authorization: 客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式有两种:
basic: 明文
digest: 消息摘要认证
用户的账号和密码存于何处?
虚拟账号:仅用于访问某服务时用到的认证标识
存储:
文本文件
SQL数据库
LDAP目录存储
提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c: 自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
-m: md5格式加密
-s: sha格式加密
-D: 删除指定用户
-b: 批模式添加用户
htpasswd -b [options] /PATH/TO/HTTPD_PASSWD_FILE username password
示例:
~]# mkdir /var/www/html/admin // 创建测试目录
~]# echo "<h1>This is a basic test</h1>" > /var/www/html/admin/index.html // 创建测试文件
~]# htpasswd -c /etc/httpd/conf/.test.user tom // 创建第一个用户且创建/tmp/test.user文件
~]# htpasswd /etc/httpd/conf/.test.user jerry // 创建第二个用户且追加到/tmp/test.user文件中
~]# vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/admin">
Options None
AllowOverride None
AuthType basic // 认证类型
AuthName "String" // 提示用户的信息
AuthUserFile "/etc/httpd/conf/.test.user" // 用户认证的信息
Require user username1 username2... // 允许文件中哪些用户可以登录
</Directory>
允许账号文件中的所有用户登录访问:
Require valid-user
基于组账号进行认证;
(1) 定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group groupname1 groupname2...
</Directory>
(2) 创建用户账号和组账号文件
组文件: 每一行定义一个组
组名: username1 username2 ... // 用户要在/etc/httpd/conf/.test.user中包含
示例:
~]# vim /etc/httpd/conf/.htgroup
animals: tom jerry
~]# vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/admin">
Options None
AllowOverride None
AuthType Basic
AuthNmae "Admin Area,please enter username and password"
AuthUserFile "/etc/httpd/conf.d/.test.user"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group animals
</Directory>
12. 虚拟主机
站点标识:socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同;
请求报文中首部
Host www.kaikai.com
有三种实现方案:
基于IP:
为每个虚拟主机准备至少一个IP地址
基于port:
为每个虚拟主机使用至少一个独立的port
基于FQDN:
为每个虚拟主机使用至少一个FQDN
注意(专用于httpd-2.2): 一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用'main'主机
禁用方法: 注释中心主机的Documentroot即可
虚拟主机的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot ""
</VirtualHost>
其他可用指令:
ServerAlias: 虚拟主机的别名;可多次使用;
ErrorLog:
CustomLog:
虚拟主机配置案例:
基于IP地址不同:
要求:192.168.23.102:80,192.168.23.202:80
www.kaikai.com,www.kaikai.com
/var/www/html/102,/var/www/html/103
~]# ip addr add 192.168.23.202/24 dev ens33
~]# mkdir /var/www/html/{102,202}
~]# echo "<h1>This is a 102 page</h1>" > /var/www/html/102/index.html
~]# echo "<h1>This is a 202 page</h1>" > /var/www/html/202/index.html
~]# vim /etc/httpd/conf.d/102.conf
<VirtualHost "192.168.23.102:80">
ServerName www.kaikai.com
DocumentRoot "/var/www/html/102"
<Directory "/var/www/html/102">
Options None
AllowOverride None
Require all granted
</Diretory>
CustomLog "logs/102_access.log" combined
</VirtualHost>
~]# vim /etc/httpd/conf.d/202.conf
<VirtualHost "192.168.23.202:80">
ServerName www.kaikai.com
DocumentRoot "/var/www/html/202"
<Directory "/var/www/html/202">
Options None
AllowOverride None
Require all granted
</Diretory>
CustomLog "logs/202_access.log" combined
</VirtualHost>
~]# systemctl reload httpd
基于Port的不同:
~]# vim /etc/httpd/conf.d/102.conf
<VirtualHost "192.168.23.102:80">
ServerName www.kaikai.com
DocumentRoot "/var/www/html/102"
<Directory "/var/www/html/102">
Options None
AllowOverride None
Require all granted
</Diretory>
CustomLog "logs/102_access.log" combined
</VirtualHost>
~]# vim /etc/httpd/conf.d/202.conf
Listen 10080
<VirtualHost "192.168.23.102:10080">
ServerName www.kaikai.com
DocumentRoot "/var/www/html/202"
<Directory "/var/www/html/202">
Options None
AllowOverride None
Require all granted
</Diretory>
CustomLog "logs/202_access.log" combined
</VirtualHost>
基于主机名的不同:
~]# vim /etc/httpd/conf.d/102.conf
<VirtualHost "*:80">
ServerName www.kaikai.com
DocumentRoot "/var/www/html/102"
<Directory "/var/www/html/102">
Options None
AllowOverride None
Require all granted
</Diretory>
CustomLog "logs/102_access.log" combined
</VirtualHost>
~]# vim /etc/httpd/conf.d/202.conf
<VirtualHost "*:80">
ServerName www.kaikai2.com
DocumentRoot "/var/www/html/202"
<Directory "/var/www/html/202">
Options None
AllowOverride None
Require all granted
</Diretory>
CustomLog "logs/202_access.log" combined
</VirtualHost>