nginx 一般是把请求发fastcgi管理进程处理,以 php 站点为例,php-fpm 是实现了Fastcgi协议,一个管理php-cgi的管理程序。下面是流程图:
CGI 全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
cgi 的弊端:当每一个请求进入的时候,cgi都会fork一个新的进程,然后以php为例,每个请求都要耗费相当大的内存,这样一来,并发起来,完全就会GG。
为了解决这个问题,于是产生了fastCgi。
FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
测试
在 D:\dev_tools\nginx-1.20.0\html\php 目录下面新建一个 php 文件,主要防止 nginx 找不到文件报 404 错误,如下:
nginx fastcgi_pass 配置如下:
nginx fastcgi_pass 传输的数据需要根据 FastCGI 协议进行解析,有兴趣的可以去了解,我这里使用 sokit 开启一个 tcp 监听用来简单接收,尝试使用浏览器访问:http://127.0.0.1:22229/itsvse.php,如下图:
22:06:07 DAT ---> [TCP] 127.0.0.1:1032 <1136> .....................B....QUERY_STRING..REQUEST_METHODGET..CONTENT_TYPE..CONTENT_LENGTH..SCRIPT_NAME/itsvse.php..REQUEST_URI/itsvse.php..DOCUMENT_URI/itsvse.php."DOCUMENT_ROOTD:/dev_tools/nginx-1.20.0/html/php..SERVER_PROTOCOLHTTP/1.1..REQUEST_SCHEMEhttp..GATEWAY_INTERFACECGI/1.1..SERVER_SOFTWAREnginx/1.20.0..REMOTE_ADDR127.0.0.1..REMOTE_PORT1025..SERVER_ADDR127.0.0.1..SERVER_PORT22229..SERVER_NAME..REDIRECT_STATUS200..HTTP_HOST127.0.0.1:22229..HTTP_CONNECTIONkeep-alive..HTTP_CACHE_CONTROLmax-age=0.@HTTP_SEC_CH_UA"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"..HTTP_SEC_CH_UA_MOBILE?0..HTTP_UPGRADE_INSECURE_REQUESTS1.sHTTP_USER_AGENTMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36.....HTTP_ACCEPTtext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9..HTTP_SEC_FETCH_SITEnone..HTTP_SEC_FETCH_MODEnavigate..HTTP_SEC_FETCH_USER?1..HTTP_SEC_FETCH_DESTdocument..HTTP_ACCEPT_ENCODINGgzip, deflate, br..HTTP_ACCEPT_LANGUAGEzh-CN,zh;q=0.9,en;q=0.8...................... (完)
|