http请求的理解(待整理)
理解其过程:
客户端浏览器发起请求-》一些列域名解析-》通过tcp与服务器建立连接-》发起http请求-》代理服务器-》目标服务器-》fastcgi-》目标服务器-》响应给代理服务器-》再由代理服务器响应给请求客户端-》浏览器进行解析显示。
描述:
1、客户端浏览器再请求某个页面时,首先会通过域名解析找到该url的真正ip地址,(应该理解http是建立在tcp之上的连接),
2、源主机与目标服务器通过三次握手建立起连接,此时源主机就可以向目标服务器发起http请求
3、在发起http请求时,可能会经过代理服务器,由代理服务器将请求发送给目标服务器
4、目标服务器收到请求后,会在本机中的虚拟主机查找对应的server_name,如果找到则去该server_name配置目录查找对应的页面
5、如果请求的页面是html类型可以直接返回给请求主机或代理服务器,
6、如果请求的是php等需要解析的文件,此时服务器会将该文件交由fastcgi进行解析,解析成html文件后返还给服务器
7、服务器将解析后的html文件响应给代理服务器(或请求主机),代理服务器响应给请求主机
8、请求主机在收到响应后,浏览器会自动解析html文件,并显示
9、至此,请求完成
关于域名解析
域名解析就是将域名解析为ip的过程。
域名服务器分类
1、本地域名服务器 (理解为本地的hosts文件中的映射关系和本地的dns服务器)
2、根域名服务器 (全球13台根域名服务器)
3、授权域名服务器(来自百度知道什么是授权服务器:是经过上一级授权对域名进行解析的服务器,同时它可以把解析授权转授给其他人,如COM顶级服务器可以授权ABC.COM的权威服务器为NS.ABC.COM,同时NS.ABC.COM还可以把授权转授给NS.DDD.COM,这样NS.DDD.COM就成了ABC.COM实际上的权威服务器了。平时我们解析域名的结果都源自权威DNS。)
解析过程
以不同域的两个主机通信为例介绍。域xyz.com主机A(域名为x.xyz.com)欲与d.abc.com域的主机B(域名为g.d.abc.com)通信。主机A不知道主机B的IP地址。
1、首先向本地域名服务器(授权域名服务器dns.xyz.com)发出请求报文。
2、本地域名服务器没有主机B的信息,向根域名服务器(dns.com)发出请求。
3、若没有主机Bd的信息,由根域名服务器转发到另外的本地域名服务器(授权域名服务器dns.abc.com),.
4、以此类推,一直转发到最终的本地域名服务器(dnx.d.abc.com)。
5、若有主机B的信息,则将IP地址信息作为响应报文,安请求顺序传送到主机A.若没有主机B的信息,则将出错信息作为相应报文,传送到主机A
tcp三次握手过程
第一次握手:源端主机发送一个带有本次连接序号的请求
第二次握手:目的主机收到请求后,如果同意连接,则发回一个带有本次连接序号和源端主机连接序号的确认。
第三次握手:源端主机收到含有对初始信号的应答后,再向目的主机发送一个带有两次连接序号的确认。当目的主机收到确认后,双方就建立起了连接。
代理服务器
代理是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。提供这种服务的终端就是代理服务器
正向代理
正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
用途:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理
初次接触方向代理的感觉是,客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
作用:
(1)保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击
大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
(2)负载均衡,通过反向代理服务器来优化网站的负载
区别:使用一张图来说明
负载均衡
通过如下几个图来理解负载均衡。负载均衡就相当于在本来直连服务器间加了一层,使得请求必须通过负载均衡器来访问服务器端。
未使用负载均衡的web架构
使用多个负载均衡器:
使用了负载均衡的web架构
浮动 IP 的负载均衡架构示意图:
CGI
CGI是保证服务器和请求处理程序之间传输数据的一种标准.
CGI针对每个http请求都是fork一个新进程来进行处理,处理过程包括解析php.ini文件,初始化执行环境等,然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求动态资源,那么web服务器又再次fork一个新进程,周而复始的进行。
FastCGI
Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。大多数Fastcgi实现都会维护一个进程池。注:swoole作为httpserver,实际上也是类似这样的工作方式。
php-fpm
它是一个实现了Fastcgi协议的程序,用来管理Fastcgi起的进程的,即能够调度php-cgi进程的程序。现已在PHP内核中就集成了PHP-FPM,使用--enalbe-fpm这个编译参数即可。另外,修改了php.ini配置文件后,没办法平滑重启,需要重启php-fpm才可。此时新fork的worker会用新的配置,已经存在的worker继续处理完手上的活。
参考
https://www.jianshu.com/p/184ebd448c7f
https://blog.****.net/zjkC050818/article/details/78345819
https://www.cnblogs.com/Anker/p/6056540.html
维基百科,百度知道,《数据通信与计算机网络》