一个http请求的生命周期

以 django 为例,描述一个 http 请求大概的生命周期。本质上一个http请求就是一次端到端的通信。

流程

客户端输入网址 -> 域名解析、路由转发 -> 静态服务器(CDN) -> 服务器负载均衡(LVS、nginx) -> 应用服务器(django) -> 返回数据给客户端

域名解析、路由转发

域名解析:第一步是本地hosts文件,如果在hosts文件中找到了域名对应的IP地址,就不会再去DNS服务器里面解析。(如果说有病毒串改了你的hosts文件,你访问某个网址,就会解析出一个错误的IP,进去一个钓鱼网站,输入密码账户的时候,就可能会被坏人记录下来)

若在本机中无法查到,就会请求本地区域的域名服务器(通常是对应的网络运营商如电信),这个通过网络设置中的LDNS去查找,如果还是没有找到的话,那么就去根域名服务器查找,这里有所有因特网上可访问的域名和IP对应信息(根域名服务器全球共13台)。

路由转发:通过网卡、路由器、交换机等设备,实现两个IP地址之间的通信。

这一步我们可以找到提供服务的服务器所在的ip地址,然后根据端口号,建立tcp连接。

静态资源缓存

Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。浏览器缓存也包含很多内容: HTTP 缓存、indexDB、cookie、localstorage 等等。

有些资源不会经常动态变动,就没必要每次都专门请求,增加通信资源量,可以考虑缓存的内容:

  • css样式文件
  • js文件
  • logo、图标
  • html文件
  • 可以下载的内容
CDN缓存

客户端访问网站的过程:

没有CDN

  1. 用户在浏览器访问栏中输入要访问的域名;
  2. 浏览器向DNS服务器请求对该域名的解析;
  3. DNS服务器返回该域名的IP地址给浏览器
  4. 浏览器使用该IP地址向服务器请求内容。
  5. 服务器将用户请求的内容返回给浏览器。

使用了CDN

  1. 用户在浏览器中输入要访问的域名。
  2. 浏览器向DNS服务器请求对域名进行解析。由于CDN对域名解析进行了调整,DNS服务器会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。
  3. CDN的DNS服务器将CDN的负载均衡设备IP地址返回给用户。
  4. 用户向CDN的负载均衡设备发起内容URL访问请求。
  5. CDN负载均衡设备会为用户选择一台合适的缓存服务器提供服务。选择的依据包括:根据用户IP地址,判断哪一台服务器距离用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器的负载情况,判断哪一台服务器的负载较小。基于以上这些依据的综合分析之后,负载均衡设置会把缓存服务器的IP地址返回给用户。
  6. 用户向缓存服务器发出请求。
  7. 缓存服务器响应用户请求,将用户所需内容传送到用户。如果这台缓存服务器上并没有用户想要的内容,而负载均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉取到本地。
代理服务器缓存

Nginx 在做代理转发的时候为了减少网络开销,可以配置 proxy_cache 缓存代理,对特定的资源进行缓存,比如对 jpg|png|gif|css|js|html 等文件进行缓存。

server {
        #对特定的请求使用缓存
        location ~ .*\.(jpg|png|gif|css|js|html|ttf|svg)$ {
                proxy_cache cache_one;
                proxy_pass http://oa.zhihuikg.com;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header REMOTE-HOST $remote_addr;
                proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
        }
}

代理服务器(负载均衡)

目前django框架开发的web项目,主流使用的服务器架构是:

  1. nginx+uWSGI+django,nginx作为代理服务器,uWSGI作为中间件。
  2. uWSGI+Django,那么uWSGI是一个web服务器。

下面以 nginx 作为代理服务器为例:

  • 如果是静态资源(如javascript、css、图片等)的请求,那么nginx直接获取到该资源,返回给用户。
  • 如果是动态内容的请求,那么nginx就将负载均衡处理后的请求转发到uWSGI,使用的协议一般都是uwsgi,性能最好。

uWSGI

uWSGI监听本机IP的某个端口,譬如3308,接收到nginx转发来的请求后,通过将http协议转换为WSGI协议,和django程序之间进行通信。

django服务的handler

当django接受到一个请求时,会初始化一个WSGIHandler,可以在项目下的wsgi.py文件进行跟踪查看。

这个handler控制了从请求到响应的整个过程,首先的就是加载django的settings配置,然后就是调用django的中间件开始操作。

中间件

然后就到了 django 的中间件处理,中间件的处理主要分为以下几部分:

  1. process_request:处理请求对象。
  2. process_response:处理响应对象。
  3. process_view:视图预处理,在视图函数处理之前调用。
  4. process_exception:在视图函数或中间件处理过程抛出异常时调用。
  5. process_template_response:在视图函数完成操作后调用,默认不执行,除非视图函数返回的response中有render方法。
django请求流转

middleware的process_request:处理请求对象。
URLConf路由匹配:通过urls.py文件中的 urlpatterns 配置找到对应的 视图函数或者视图类的方法。
middleware的process_view:在视图函数前,进行预处理。
views处理数据:执行对应的视图函数。
middleware的process_response:处理响应对象。

最后再通过 uWSGI -> nginx ,将结果返回给客户端,客户端接收响应。

参考

web请求生命周期分析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tlqwanttolearnit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值