开源代码学习之Tinyhttpdcgi,fastcgi,php-fpm

开源代码学习之Tinyhttpdcgi,fastcgi,php-fpm

   
想开始陆续研究有谢谢兴趣之开源代码于是先挑一个代码量短的来接一下,写这篇博客的目的是记录下好学之过程。Tinyhttpd算是一个微型的web服务器,浏览器和Web服务器之间的通信采用的是Http,所以同样开始的切入点是HTTP协议,这里说一些假如来开HTTP通信的出要看一下RFC中对两样版本HTTP的概念,以下原理部分还是起《后台开发:核心技术与运用实践》中HTTP协议章节中推出来的,对后大感兴趣的同窗可以拘留一下,讲述后台开发所用所有的技巧点同样按部就班颇科学的开。

CGI

简介:

CGI全称是“通用网关接口”(Common Gateway
Interface),它可叫一个客户端,从网页浏览器为执行于Web服务器上的顺序要数据。
CGI描述了客户端和是次中传输数据的一律种标准/协议。

CGI的一个目的是一旦单独于任何语言的,所以CGI可以用另外一样种植语言编写,只要这种语言有标准输入、输出以及环境变量。
如php,perl,tcl等。

原理:

  • 客户端访问有 URL 地址然后,通过 GET/POST/PUT
    等艺术提交数据,并透过 HTTP 协议为 Web 服务器发出请求。
  • 服务器端的 HTTP Daemon(守护进程)启动一个子历程。然后在子进程遭到,将
    HTTP 请求里描述的音信经过正规输入 stdin 和环境变量传递给 URL 指定的
    CGI 程序,并启动之应用程序进行处理,处理结果通过规范输出 stdout
    返回给 HTTP Daemon 子进程。
  • 复由 HTTP Daemon 子进程经过 HTTP 协议返回给客户端。

缺点:

频率低下:每一个接连 fork 一个进程处理。
功用非常片:CGI只能收取一个央,输出一个应。很麻烦在CGI体系去对Web请求的控制,例如:用户征等。

一、HTTP协议

FastCGI

简介

FastCGI像是一个常驻(long-live)型的CGI,它好直接实行方,只要激活后,不会见每次都要费时间去fork一破(这是CGI最为人诟病的fork-and-execute
模式)。它还支持分布式的运算, 即 FastCGI
程序可以于网站服务器以外的主机上执行并且接受来自其他网站服务器来之呼吁。

FastCGI是言语无关之、可伸缩架构的CGI开放扩展,其利害攸关表现是用CGI解释器进程保持以内存中连为此收获比高之性。众所周知,CGI解释器的高频加载是CGI性能低下的重要原因,如果CGI解释器保持以内存中连受FastCGI进程管理器调度,则好供不错的属性、伸缩性、Fail-
Over特性等等。

原理

  • Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)。

  • FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多单php-cgi)并等来自Web
    Server的连年。

  • 当客户端请求到达Web
    Server时,FastCGI进程管理器选择并连续至一个CGI解释器。Web
    server将CGI环境变量和规范输入发送到FastCGI子进程php-cgi。

  • FastCGI子进程就处理后拿标准输出和错误信息从平连接返回Web
    Server。当FastCGI子进程关闭连接时,请求便告处理就。FastCGI子进程就等待并拍卖来自FastCGI进程管理器(运行在Web
    Server中)的产一个连连。 在CGI模式面临,php-cgi在是就是脱离了。

优点:
CGI通常列一个Web请求PHP都必还分析php.ini、重新载入全部恢宏并重初始化全部数据结构。使用FastCGI,所有这些还不过以经过启动时出同样不善。一个额外的功利是,持续数据库连接(Persistent
database connection)可以干活。

HTTP工作流程:

PHP-CGI

简介

php的fastcgi实现,同时为作为php的剧本解析器负责运行php脚本。

缺陷是过程管理调度比较不同。

  于OSI七层模型中,HTTP是冲TCP上的应用层协议而我辈所说之HTTPS基于同处应用层的TLS、SSL协议层之上。HTTP默认的捧口号也80,HTTPS默认的端口号为443。在HTTP1.1挨(通过Connection头设置)默认在HTTP传输就后不断开TCP连接,在此之前的HTTP版本则默认是断开连接的,也就是说这次要和上次请求是不同的个别只TCP连接。一涂鸦HTTP操作称为一个工作,其工作经过可以分为以下四步。

PHP-FPM

简介

PHP-FPM(FastCGI流程管理器)是同一种植替代的PHP FastCGI实现。

对此PHP 5.3.3事先的php来说,是一个补丁包
,旨在用FastCGI进程管理整合进PHP包中。PHP5.3.3已经集成php-fpm了,不再是第三方的保证了。

对立Spawn-FCGI,PHP-FPM在CPU和内存方面的决定都更胜一筹,而且前者很轻崩溃,必须用crontab进行监察,而PHP-FPM则无这种不快。

设置时于./configure的时候带 –enable-fpm参数即可打开PHP-FPM。

作用

实用控制内存和过程
自动子进程创造
骨干统计
进程优雅停止/启动
可知启动具有不同uid / gid / chroot /环境和见仁见智php.ini的worker
Stdout和stderr日志记录
当奇怪操作码缓存损坏的情状下紧急重开
增速上污染支持
支持“slowlog”
FastCGI的增长力量,如fastcgi_finish_request()

  (1)首先客户机与服务器需要树立连接 。 只要单击某个超级链接, HTTP
的工作就是开始 。
  (2)建立连接后,客户机发送一个求被服务器,请求方式的格式为:统一资源标识符(URL
)、协议版本号,后边是 MIME
信息(包括要修饰符、客户机信息和可能的内容) 。

  (3)服务器收到请求后,给予相应的应信息,其格式为一个状态行,包括信息的商事版本号、一个得逞或错的代码,后边是
MTh伍信息(包括服务器信息、实体信息及可能的始末) 。

  (4)客户端接收服务器所返的信经过浏览器显示在用户之显示屏上,然后客户机与服务器断开连接

HTTP协议结构:

  HTTP 协议无论是请求报文还是应报文,都分为以下 4 个组成部分 。

  (1)报文头( initial line ),上面的例证中之“ GET
http://www.baidu.com/favicon.icoHTTP/1.1 ”表示为此 GET 方法要
http://www.baidu.com/favicon. ic。这个文件,用底凡HTTP/1.1 协议。

  (2) 0 独或多个请求头( header line ),例如 Accept-Language: en

  (3)空行(作为 header lines 的结束) 。

  (4)可选取的音讯体 。

  HTTP 协议是基于行之商谈,每一样执行 以 \r\n 作为分隔符 。
报文头通常表明报文的类型(例如请求类型),且报文头只占一行
;请求头附带一些奇信息,每一个告求头占一实行,其格式为 name:value
,即坐分公司作为分隔; 空行也就是为一个 \r\n 分隔;可选 body
通常含数据,例如服务器返回的有静态 HTML 文件的内容 。

  HTTP请求方法:

  HTTP/ 1.1 协议中共定义了 9 种方法(有时也深受“动作”)来表 明
Request-URI 指定的资源的异操作办法,如下所陈述。

  ( 1 ) OPTIONS :返回服务器对一定资源所支持的 HTTP
请求方法;也得采用为 Web服务器发送“*”的请求来测试服务器的功能性。

  ( 2) HEAD :向服务器需要和 GET
请求相平等的响应,只不过响应体将无会见受归 。
这无异于方法可以在不必传输整个响应内容之动静下,就好收获包含在应消息头着之第一信息
。该方法常用于测试超过链接的中,是否足以看,以及最近是不是更新等消息

  ( 3) GET :向特定的资源发出请求 。 注意 : GET
方法无该给用于产生“副作用”的操作着,例如当 web app .
中之施用,其中一个原因是 GET 可能会见受网络蜘蛛等任意访问 。

  ( 4 ) POST
:向指定资源提交数据进行拍卖要(例如提交表单或者上污染文书) 。
数据为含有在求求体中 。 POST
请求或会见造成新的资源的建立或者针对已经发生资源的改动 。

  ( 5 ) PUT :向指定资源职务及传其最新内容 。

  ( 6) DELETE : 请求服务器删除 Request-URI 所标识的资源 。

  ( 7 ) TRACE :回显服务器收到的请求,主要用以测试或确诊。

  ( 8) CONNECT: HTTP/ 1.1
协议中留下给能够将接连改吗管道方式的代理服务器 。

  ( 9) PATCH :用来将片修改以被有同资源,该操作添加于规范盯C5789
中 。

  HTTP 服务器至少应该实现 GET 和 HEAD 方法,其他措施都是可选的 。
此外,除了上述措施,特定的 HTTP 服务器还会壮大自定义的道 。

  HTTP 常见的乞求头:

  于 HTTP/ l.l 协议中,所有的求求头(除 Host
外)都是可选的,因为Host主要用来请求的服务器的IP地址及端口号,请求头有Host、Connection、Accept、Accept-Encoding、User-Agent、Cookie等,请求头太多这里虽未列下了。

  HTTP回应报文:

  返回码由 3 位数字组成,第一个数字定义了响应的型,且发生 5
种可能的取值。

  ( 1 ) lxx :指示信息,表示要都收取,继续处理。

  ( 2) 2xx :成功,表示求都于成功接收、理解 、 接受 。

  ( 3) 3xx :重定向,要做到请求必须进行更进一步的操作 。

  ( 4 ) 4xx :客户端错误,请求有语法错误或请求无法兑现。

  ( 5) 5xx :服务器端错误,服务器未能贯彻合法的请 。

  Date :表示消息发送的时,时间之叙说格式由 rfc822 定义 。

  Server : 指明 Web 服务器用来拍卖要的软件信息 。

  Accept-Ranges : Web
服务器表明自己是否收到获取其有实体的同等部分(比如文件之平等有些)的乞求
。 bytes 表示接受, none 表示不接受。

  Vary: Web 服务器用该头部的情节告诉 Cache
服务器,在什么条件下才会因此本应所返的目标应后续之乞求 。

  Content-Encoding : Web 服务器表明自己以了什么压缩方法( gzip,
deflate)压缩响应中的对象。

  Content-Length: Web 服务器告诉浏览器自己应的靶子的长度 。

  Content-Type: Web 服务器告诉浏览器自己应的目标的类型 。

二、CGI

  CGI ( Common Gateway Interface ,通用网关接口)是 HTTP
协议中极着重之艺有,有着不可代替的第一位置 。 CGI 是一个 Web
服务器提供信息服务的标准接口 。 通过 CGI 接口, Web
服务器就能收获客户端提交的信,转交给劳务器端的 CGI
程序进行拍卖,最后回到结果受客户端 。 组成 CGI 通信系统的凡个别有:
一部分凡是 HTML
页面,就是在用户端浏览器上显得的页面;另一样片段则是运作于服务器上之 CG I
程序 。

  浏览器就待指定执行服务器上的哪位CGI程序即使实施,一般情况下,服务器和
CGI
程序中是经标准输入输出来展开数据传递的(就比如tinyhttpd中调用CGI程序),而这进程得环境变茸的合作方可实现。环境变量在
CGI 中颇具重大之位置,每个 CGI
程序只能处理一个用户请求,所以当激活一个CGI程序进程时为开创了属于该过程的环境变量,CGI程序会用Python、PERL、Shell、C或C++等语言来落实。

  CGI 环境变量在 CGI 程序启动时初始化,在截止时销毁。当一个 CGI
程序不是受 HTTP 服务器调用时,它的条件变盘几乎是网环境变量的复制
。当此 CGI 程序让 HTTP 服务器调用时,它的环境变量就会多了以下关于HTTP
服务器、客户端、 CGI 传输过程相当种类。CGI 相关的环境变量有 3
种:与请求相关的环境变量、与服务器相关的环境变量和跟客户端相关的环境变量,,详细呈现表
12-1 。

  图片 1

  CGI 工作规律:每当客户要 CGI 的当儿 Web
服务器就请求操作系统生成一个新的CGI
进程,该过程处理了要后脱离,下一个央来常常还创新历程 。
当然,这样以访问量很少没有出现的情况中,可是当访问量增大且并发存在时时,这种措施就不切合了,于是便出矣FastCGI。

  一般景象下, FastCGI 的整整工作流程如下所陈述。

  ( 1 ) Web Server 启动时载入 FastCGI 进程管理器( IIS ISAPI 或 Apache
Module ) 。

  ( 2 )FastCGI 进程管理器自身初始化,启动多只 CGI 进程并等候来自 Web
服务器的连接 。

  ( 3 )当客户端请求到达 Web Server 时, FastCGI
进程管理器选择并接连到一个 FastCGI进程 。 Web 服务器将 CGI
环境变量和业内输入发送至 FastCGI 进程 。

  ( 4) FastCGI 子进程就处理后将业内输出及错误信息从同连接返回 Web
Server。当FastCGI 子进程关闭连接时,请求虽被告知处理到位 。 FastCGI
进程就等待并处理来自FastCGI 进程管理器(运行在 Web
服务器中)的产一个连接 。

三、tinyhttpd解析

  关于tinyhttpd的代码解析的博客太多了,流程及注释都讲述的好详细,随便搜个tinyhttpd解析就生好多博客出现,这里要写一下友好于圈就卖源码时缺乏的知识点,因为自几没有linux下编程的更,所以本着linux下用的Glib库调用不绝熟悉,TCP协议栈也是本身偏偏拘留了过轻量级Lwip的源码。

  1.bind函数当传入的port为0时是碰头随机分配一个端口号,所以tinyhttpd中才会生展示随机的捧口号,getsockname函数获取套接字之地方将动态分配的端口号值取出。

  图片 2图片 3

  2.int stat(const char *file_name, struct stat
*buf);通过文件名filename获取文件信息,并保留于buf所依的组织体stat中,S_IXUSR:文件所有者拥有可尽权,S_IXGRP:用户组具可实施权,S_IXOTH:其他用户具可读博权限。

图片 4

  3.int pipe(int filedes[2]);

  返回值:成功,返回0,否则回-1。参数数组包含pipe使用的个别独文件的描述称。fd[0]:读管道,fd[1]:写管道。

  必须在fork()中调用pipe(),否则子进程不见面延续文件讲述称。两个经过不联合享祖先进程,就非克运用pipe。但是得应用命名管道。

  pipe(cgi_output)执行成功后,cgi_output[0]:读通道
cgi_output[1]:写通道

  图片 5

   int dup2(int oldfd,int newfd);函数的来意是复制文件讲述吻合。

  4.fork函数,创建一个子经过,fork函数之后的有的是因为以fork函数执行了后,如果创建新过程成功,则产出零星只经过,一个是子进程,一个是爸爸进程。在分进程遭到,fork函数返回0,在父亲进程被,fork返回新创建子进程的历程ID,有日更拘留fork源码是什么促成的。

  5.execl函数尽,第一参数path字符指针所据于而尽之公文路径,后面跟着可更换参数,这里说一些由GCC使用AAPCS规范,可转换参数的贯彻小于四个的说话是于r0-r3获取,大于四单之话语虽如于栈中获取参数。 

  6.pid_t waitpid(pid_t pid, int * status, int
options);会小告一段落目前过程的尽, 直到有信号到或子进程结束. 

  以编排博客边看tinyhttpd,目前协调的不够清楚的函数就点几乎只,有空再看看它的源码实现。

 

  

  

admin

网站地图xml地图