深入浅出web服务

对于没有做过web开发的人来说,web开发涉及到的名词似乎特别多,apache,nginx,cgi,php,http,cookie,session。这一大坨东西到底是什么,这里我们就从网络的层面去理清楚这些东西。

1. 什么是HTTP

对于web来说贯穿始终的东西就是HTTP,那么什么是HTTP?官方说法就是Hyper Text Transfer Protocol,从这个名字上面还判断,HTTP是一种协议,并且是一种应用层协议,其对应的传输层协议TCP。所以说到底,HTTP就是建立在TCP基础上的一种应用层协议。

对于服务器来说,是一个被动连接的过程,所以一般是由客户端发起tcp连接请求,并发送数据,由于tcp流无边界的特点,必须约定一种协议来判断数据的结尾,http规定的协议格式如下:

所以对于一个http server来说,只需要按照上述报文格式来收包解包就可以了。

2. 什么是COOKIE/SESSION

先说cookie,其由浏览器来进行管理,所以通过js可以对其进行修改。其一般保存在客户端内存中,所以生命周期为浏览器会话期间,关闭浏览器以后,cookie会自动消失。当然如果cookie设置了过期时间,也会由浏览器同步在磁盘当中。在每次http请求的过程当中,浏览器会在后台选择一部分cookie放在http包头当中发给web服务器。所以cookie过长导致的直接结果就是http包体过大,因此http协议对cookie的长度是有限制的。

而session可以看做是服务器端的一个hash表,默认是以文件的形式存储的,key就是session id,session id会保存在cookie当中,所以每次服务器解开http包以后,根据cookie中的session id就可以在hash表中数据。那么问题就来了,如果用户在浏览器禁掉了cookie,是不是就找不到session了呢?当然不是,仅仅是禁掉cookie还有很多其他的方式可以将其拼在http包当中传回来呀,可以放在包头的其他字段里比如说get参数,也可以放在包体当中,例如post参数,这种事情是不能难倒程序员的

3. 什么是Apache和Nginx

如果他们作为http server(当然还有其他的feature),比较简单地理解就是他们是对http协议的一种实现,即解包->过滤->转包->过滤->回包,下图是nginx的一个简要示意图。

4. 一般的web架构是怎样的

上图是一个常见的web架构,由反向代理服务器,http服务器组成,http服务器又分成nginx进程和php进程,任何一个环节出现问题都可能导致浏览器的错误页面。

首先,暴露给用户的是一个反向代理服务器,反向代理的存在有几个作用,一是负载均衡,反向代理服务器收到数据包以后会按照一定的负载均衡算法转发到真正的业务服务器上面去,另一个作用是防止攻击,它会按照一定的规则过滤掉很多不合法的请求,从而降低业务机的负载,因为其只是简单地转发,没有真正的业务逻辑,所以即使黑客攻击到了这一层也没有太大的危害。同时反向代理服务器也可以缓存一些静态的资源,进一步降低业务机的负载。

nginx作为http服务器,在整个架构中主要负责hold连接,并不做请求的真正处理,在上图中被画成了一个方块,但其本身也是多进程的结构。

加入对同一台机器上面配置了8个nginx worker,每个worker配置的连接数是1024,那么这台机器hold连接的能力就是8*1024。

nginx worker和php-fpm的通信方式是通过socket来通信的,所以说nginx和php-fpm可以部署在同一台机器上也可以部署在不同的机器上。现在数据被转发给了php-fpm,其结构和nginx基本类似。php-fpm是php的一个插件,现在已经集成到了php的核心代码中,是fast-cgi的一种实现。fastcgi规定每过来一个请求,都从进程池里挑选一个进程,来加载并执行一段php脚本,脚本结束以后将进城归还给进程池。所以php-fpm说到底就是一个进程管理器,正如其名字所示(FastCGI Process Manager)。我们可以看到在fastcgi模式下,一个进程是对应一个请求的,假如说在一台机器上我们配置了300个fastcgi进程,那么其能同时处理的最大请求数就是300个,是远远小于nginx的接入能力的。如果php有一些阻塞调用,当前进程不能异步处理其他的请求,所以说php-fpm在在这套架构里是瓶颈。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。