当前位置: 首页 > 后端技术 > PHP

HTTP、PHP-FPM、握手协议

时间:2023-03-29 16:34:19 PHP

HTTP请求过程将用户输入的url如http:www.baidu.com整理到浏览器,chrom等浏览器需要解析成ip地址才能知道在哪里访问哪个服务器。浏览器解析DNS步骤如下,搜索浏览器自身的dns缓存,缓存时间短,缓存数量有限。搜索操作系统的dns缓存,读取host文件的dns映射(一般情况下,本地开发映射就是修改这个文件,达到拦截浏览器对本地服务器的请求的目的,让本地成功映射serveraddress)首先在本地网卡配置中发起域名解析请求的dnsserver,貌似还有一套运营商处理流程没有进行。下面好像有一些流程,由于这一步基本不执行,一般dns运营商的dnsserver会处理。如果解析失败,以上任一步骤都会返回一个成功的ip地址。浏览器将与随机端口共享此ip地址的特定端口(默认80)以启动著名的TCP3次握手。一个http请求到达nginx服务的过程大致是这样的:握手完成后,浏览器和服务器就可以愉快的发送http请求了。nginx上的具体过程如下:PHP-FPM在服务器端请求中起到什么作用命令与其通信。当网络请求到达网络服务器时,网络服务器将创建一个CGI进程。CGI进程按照固定格式解析web请求,然后写入标准输入(STDIN)和环境变量,然后由PHP启动的CGI解析服务器会从标准输入(STDIN)中读取http请求数据)和环境变量,所以$_SERVER会有数据,然后做相应的逻辑处理,然后将处理结果放入标准输出(STDOUT),CGI进程从STDOUT中读取响应数据,然后传输到浏览器,让服务器完成一个http请求。以上就是CGI的实现过程,但是使用CGI协议的服务器需要在用户每次访问服务器的时候fork/销毁CGI进程,这势必会成为冗余的系统开销,所以FASTCGI就是为了解决这个问题。什么是FastCGI协议?FastCGI会创建一个常驻master进程和多个worker进程。主进程负责管理和反派工作进程的任务。worker进程负责嵌入一个CGI解析器来解释php代码。PHP-FPM是一个FastCGI进程管理器,它实现了LNMP系统中的FastCGI协议。同样,它也会创建一个常驻master进程和多个worker进程。master进程负责监听端口和接收来自nginx的请求,并将任务分配给worker进程。工作进程负责解释PHP代码。PHP-FPM可以通过配置预先启动一定数量的worker进程,从而在http请求到来时能够更快的做出响应。Nginx的FastCGI配置nginx与PHP-FPM的通信一般是通过它的ngx_http_fastcgi_module模块来实现的。其中,fastcgi_pass用于设置fastcgi服务器的IP地址;fastcgi_param设置传递给fastcgi服务器的参数。这个模块的配置问题一般都集中在这个区域。相比并发状态出现的问题,一般都集中在fastcgi服务器上。具体表现为fastcgiserver为了应对大量的http请求,必须不断的fork新的worker进程。这时候就要考虑服务器能支持的最大连接数。php-fpm配置中的number和最大打开文件数(可以通过ulimit-n查看)和最小openworker数和最大openworker数。高性能服务器可以朝这个方向调优。HTTP协议中三次握手和四次握手详解协议过程中客服端和服务器端状态图FINfinishendRSTresetresetURGurgentEmergencySequencenumber-sequencenumberAcknowledgenumber-ConfirmationnumberTCP状态描述状态描述LISTEN监听状态SYN_SEND发送连接请求[SYN=J]并等待匹配的连接请求SYN_RECEIVED收到连接请求后[SYN=J],发送连接确认包[SYN=k,ack=J+1]等待确认包后[Ack=k+1]状态ESTABLISHED打开连接后可以开始传输数据FIN_WAIT_1发起连接中断请求[FIN=M]等待远程TCP确认后[Ack=M+1]状态FIN_WAIT_2Receive接收到远程int后中断确认[Ack=M+1],等待远程中断请求[FIN=N]CLOSE_WAIT收到连接中断请求[FIN=M]后,不发送中断确认包[Ack=M=1]并且stateTIME_WAIT发送确认远程中断请求[Ack=N+1]包后,进入等待状态,保证重新分配的socket不会受到残留延迟重传报文的影响。在四次挥手断开连接期间,发起主动关闭socket的socket会进入TIME_WAIT状态,TIME_WAIT状态会持续2MSL(MaxSegmentLifetime),处于TIME_WAIT状态的socket不能被回收。具体现象是,对于一个处理大短连接的服务器,如果服务器主动关闭客户端连接,服务器端会出现大量处于TIME_WAIT状态的套接字,甚至比客户端中的套接字还要多Established状态,严重影响服务器的处理能力,甚至耗尽Availablesockets,停止服务。TIME_WAIT是TCP协议用来保证重新分配的套接字不会被剩余的延迟重传消息影响的一种机制,是一种必要的逻辑保证。一般原因是系统没有主动关闭连接。比如mysql连接资源没有关闭。关于用于跟踪网络链路异常的运维命令(下面显示的IP和端口均为假数据),在linuxcat/proc/net/sockstat参数中查看socket状态sockets:usedthetotalamountofallprotocolsocketsusedTCP:inuse正在使用(监听)的TCP套接字数量其值≤netstat–lntgrep^tcpwc–lTCP:孤儿TCP连接数(不属于任何进程)(被销毁的无用TCP套接字数)TCP:等待关闭的TCP连接数。它的值等于由netstat–antgrepTIME_WAITwc–lTCP:alloc分配(建立并应用于sk_buff)的TCP套接字数。它的值等于netstat–antgrep^tcpwc–lTCP:memsocketbufferusageUDP:inuse正在使用的UDPsocket数FRAG使用的IP段数查看当前tcp连接状态netstat-na|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'参数说明LISTEN处于监听状态CLOSE_WAIT对方主动关闭连接或者网络异常,连接中断。这时候,我们的状态就会变成CLOSE_WAIT,这时候我们需要调用close()让连接正确关闭。ESTABLISHED建立连接,我们正在通信TIME_WAIT。我们主动调用close()来断开连接。收到对方确认后,状态变为TIME_WAITtcp工具抓取网络请求包tcpdump-nport3306mysqlactivelydisconnected11:38:45.693382IP172.18.0.3.3306>172.18.0.3.3306>172.18.0.5.38822:Flags[F.],seq123,ack144,win227,options[nop,nop,TSval3000355ecr2997359],length0#MySQL发送fin包给我11:38:45.740958IP172.18.0.5.38822>172.18.0.3.3306:Flags[.],ack124,win229,options[nop,nop,TSval3000360ecr3000355],length0#Ireplyacktoit11:38:45.740960IP172.18.0.3.3306>172.18.0.5.38822:Flags[F.],ack125,win231,options[nop,nop,TSval3000360ecr3000355],length0#MySQL向客户端发送fin包11:38:45.740965IP172.18.0.5.38822>172.18.0.3.3306:Flags[.],ack125,win229,options[nop,nop,TSval3000360ecr3000355],length0#客户端回复ack给我...src>dst:flagsdata-seqnoackwindowurgentoptions#3handshakesoccurred11:38:15.679863IP172.18.0.5.38822>172.18.0.3.3306:标志[S]、seq4065722321、win29200、选项[mss1460、sackOK、TSval2997352ecr0、nop、wscale7]、长度011:38:15.679923IP172.18.0.3.33206>172.8.10.5.38822:标志[S.],seq780487619,ack4065722322,win28960,选项[mss1460,sackOK,TSval2997352ecr2997352,nop,wscale7],长度011:38:13.681792.2IP>172.18.0.3.3306:flags[.],ack1,win229,options[nop,nop,TSval2997352ecr2997352],length0参数说明src>dst表示TCP包中从源地址到目的地址的flags信息,S是SYN标志,F(FIN),P(PUSH),R(RST)“.”(没有标记)data-seqno是数据包中数据的序号ack是下一个期望的序号window是接收缓冲区的窗口大小urgent表示数据包中是否有紧急指针options是选项入口