Web Server
http 与 https 都处于应用层,但他们都需要经由底层的 TCP/IP 协议簇,来完成协议报文的传输。
IANA(Internet Assigned Numbers Authority)即互联网号码分配局,下面的网址即可查看协议端口的分配:
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml
- 0-1023:众所周知,永久地分配给固定的应用使用,特权端口;
- 1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用
- 41952+:客户端程序随机使用的端口,动态端口,或私有端口;其范围定义在文件 /proc/sys/net/ipv4/ip_local_port_range 中
http 简介
http:hyper text transfer protocol,超文本传输协议,应用层协议 80/tcp。http 的一次事务即客户端的请求与服务端的响应,同时他也是用户和网站间请求和响应的标准。
我们的客户端向服务器端指定的 80 端口发送请求,而处在监听状态的服务器一旦收到请求,便会响应客户端所请求的响应资源,并返回一个状态,如常见的 404 Not Found。
method:请求方法,标明客户端希望服务器对资源执行的动作。
- GET:从服务器获取一个资源
- HEAD:只从服务器获取文档的响应首部
- POST:向服务器发送要处理的数据
- PUT: 将请求的主体部分存储在服务器上
- DELETE:请求删除服务器上指定的文档
- TRACE:追踪请求到达服务器中间经过的代理服务器
- OPTIONS:请求服务器返回对指定资源支持使用的请求方法
status(状态码)
- 1xx:100-101,信息提示
- 2xx:200-206,成功
- 3xx:300-305,重定向
- 4xx:400-415,错误类信息,客户端错误
- 5xx:500-505,错误类信息,服务器端错误
常用的状态码:
200:成功,请求的所有数据通过响应报文的entity-body 部分发送;OK
301:请求的 URL 指向的资源已经被删除;但在响应报文中通过首部 Location 指明了资源现在所处的新位置;Moved Permanently
302:与 301 相似,但在响应报文中通过 Location 指明资源现在所处临时新位置;Found
304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
401:需要输入账号和密码认证方能访问资源;Unauthorized
403:请求被禁止;Forbidden
404:服务器无法找到客户端请求的资源;Not Found
500:服务器内部错误;Internal Server Error
502:代理服务器从后端服务器收到一条伪响应;Bad Gateway
http 工作模式
http 请求报文即为 request,http 响应报文即为 response,一次 http 事务即为请求 <--> 响应
web resource (web 资源)分类:
- 静态资源:无需服务端做出额外处理
- 动态资源:服务端需要通过执行程序做出处理,发给客户端的是程序运行的结果
- 注意:一个页面中展示的资源可能有多个;每个资源都需要单独请求
资源的标识机制,统一资源定位符 URLU(Uniform Resource Locator)用于描述服务器上某特定资源的位置;其格式如下:
Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
一次完整的 http 请求的处理过程
- 建立或处理链接:接受请求或拒绝请求
- 接收请求:接收来自于网络上的主机请求报文中,对某一特定资源的一次请求过程
- 处理请求:对请求报文进行解析,或取客户端请求的资源及请求方法等相关信息
- 访问资源:获取请求报文中请求的资源
- 构建响应报文
- 发送响应报文
- 记录日志
接受请求的模型
并发访问响应模型:
单进程 I/O 模型:启动一个进程处理用户的请求;这意味着,一次只能处理一个请求,多个请求被串行响应
多进程 I/O 结构:由父进程并行启动多个进程,每个子进程响应一个请求
复用的 I/O 结构:一个进程响应多个请求,分为以下两种
;多线程模式:一个进程生成 n 个线程,一个线程处理一个请求
;事件驱动(event-driven):一个进程直接处理 n 请求
复用的多进程 I/O 结构:一个进程启动多个(m 个)进程,每个进程生成(n)个线程;响应的请求数量为 m*n
处理请求
服务器端分析 http 请求报文的首部,请求报文首部的格式如下:
<method> <URL> <VERSION>
HEADERs:(name:value)
<request body>
web 服务器,即存放了 web 资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果;这些资源通常应该放置于文本文件系统某路径下;此路径称为 DocRoot。
http 请求处理中的链接模式:
- 保持连接(长连接):keep-alive
- 非保持连接(短连接)
http 服务程序
常见的 http 服务程序:httpd(apache),nginx,lighttpd
这次以介绍 ASF(apache software foundation )的 httpd 为主。
httpd 的特性
高度模块化:core + modules
DSO:dynamic shared object
MPM:Multipath processing Modules(多路处理模块),分为以下三种
-
prefork:多进程模型,每个进程响应一个请求:
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理。
n 个子进程:每个子进程处理一个请求。
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲。
注意:linux 的进程本身就很轻量级,与线程差不多,因此使用较多的为 prefork。 -
worker:多进程多线程模型,每个线程处理一个用户请求:
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理。
多个子进程:每个子进程负责生成多个线程。
每个线程:负责响应用户请求 -
event:事件驱动模型,多进程模型,每个进程响应多个请求:
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理。
子进程:基于事件驱动机制直接响应多个请求。
htppd 的功能特性
- CGI:Common Gateway Interface
- 虚拟主机:
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制:basic 与 digest
- 支持第三方模块
CentOS 7 上的 httpd-2.4
配置文件
rpm -qc httpfd
命令进行相关配置文件的查找,大致分为以下三类:
- /etc/httpd/conf/httpd.conf
- /etc/httpd/conf.d/*.conf
- /etc/httpd/conf.modules/*.conf
systemd unit file 路径为,执行命令locate httpd.service
即可查看,
/usr/lib/systemd/system/httpd.service
查找主文件程序,执行命令which httpd
,即为/usr/sbin/httpd
其日志文件为/var/log/httpd/
下的 access_log 与 error_log 文件。
站点文档为/var/www/html
模块文件路径/usr/lib64/httpd/modules
那么现在先进行一个简单的页面显示吧,执行如下命令:
cd /etc/httpd/conf.d
sudo mv welcome.conf welcome.conf.bak
systemctl start httpd.service
cp /etc/issue /var/www/html
# 之后查看 ip 地址并输入浏览器即可
httpd-2.4 的常用配置
这里先放上官方文档 http://httpd.apache.org/docs/2.4/
其主配置文件为 /etc/httpd/conf/httpd.conf
其配置风格为 directive value
即指令 值
的形式,同时 directive 不区分大小写。
常用配置说明
修改监听的 IP 和 Port
例如 # Listen 12.34.56.78:80 或是 Listen 80.
1)省略 IP 表示为 0.0.0.0
2)Listen 指令可重复出现多次
3)修改监听 socket,重启服务进程方可生效
4)限制其必须通过 ssl 通信时,protocol 需定义为 https
持久连接(长连接)
Persistent Connection:tcp 连续建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行。数量,时间一倒限制便会断开连接。
KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequest 100
MPM (Multipath processing Modules)
查看 httpd 程序的模块列表,参数 -h 可获取帮助信息:
- -l:查看静态编译的模块
- -M:查看静态编译及动态编译的模块
prefork 的配置:
<IfMoudle Prefork.c>
StartServers 8
MinSPareServer 5
MaxPareServer 20
ServerLimit 256
....
<IfMoudle>
DSO (dynamic shared object)
配置指定实现模块加载LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径,相对于 ServerRoot(默认:/etc/httpd)
定义’Main’ server 的文档页面路径
ServerName
ServerAlias
DocumentRoot ""
文档路径映射:DocumentRoot 指向的路径为 URL 的起始位置,相当于站点 URL 的跟路径。
站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问,文件系统路径与 URL 路径。
文件系统路径:
<Directory "">
...
</Directory>
<File "">
...
</File>
<FileMatch "PATTERN">
..
</FileMatch>
URL 路径:
<Location "">
...
</Location>
<LocationMatch "PATTERN">
...
</LocationMatch>
基于用户的访问控制
认证质询:WWW-Authenticate:响应码为 401,拒绝客户端请求,并说明要求客户端提供账号和密码。
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,服务器发送响应的资源。认证方式有两种:basic(明文)与 digest(消息摘要认证)
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识。
虚拟主机
IP 相同,但端口不同
IP 不同,但端口均为默认端口
FQDN 不同;
status 页面
LoadModule status_module modules/mod_status.so
user/group
主进程由 root 启动,子进程均为系统用户 apache,或者指定以哪个用户身份运行 httpd 服务进程:
User apache
Group apache
进程属主以及,父进程与子进程:
使用 mod_deflate 模块压缩页面优化传输速度
使用场景:
1、节约带宽,额外消耗 CPU;
2、压缩适于压缩的资源,例如文本文件
https, http over ssl
SSL 会话的简化过程
1、客户端发送可供选择的加密方式,并向服务器请求证书
2、服务器端发送证书以及选定的加密方式给客户端
3、客户端取得证书并进行证书认证
如果信任给其发放证书的 CA:
a、验证证书来源的合法性;用 CA 的公钥解密证书上的数字签名
b、验证证书的内容合法性;完整性验证
c、检查证书的有效期限
d、检查证书是否被吊销
e、证书中拥有者的名字,与访问的目标主机要一直
4、客户端生成临时会话秘钥(对称秘钥),并使用服务器的公钥加密次数据发送给服务器,完成秘钥交换
5、服务器用此密钥加密用户请求的资源,响应给客户端
注意:SSL 会话是基于 IP 地址创建;所以单 IP 的主机上,仅可使用一个 https 虚拟主机
配置 httpd 支持 https:
1、为服务器申请数字证书
2、配置 httpd 支持使用 ssl,及使用的证书;yum -y install mod_ssl;配置文件:/etc/httpd/conf.d/ssl.conf
httpd 自带的工具程序
htpasswd:basic 认证基于文件实现时,用到的账号密码文件生成工具
apachectl:httpd 自带的服务控制脚本,支持 stop 和 start
rotatelogs:日志滚动工具
ab:apache bench
两个小工具
curl 命令:curl [options] [URL...]
-A/–user-agent 设置用户代理发送给服务器
-e/–referer 设置网页来源
-I/–head 只显示响应报文首部信息
–compressed 要求返回的是压缩格式
elinks 命令:elinks [OPTIONS]... [URL]...
-dump:不进入交互模式,而直接将 URL 内容输出至标准输出