Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈,web服务器交互--cgi
Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈,web服务器交互--cgi
一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢?
本文浅谈个人观点,可能有误,欢迎拍砖,共同学习。
一. 首先明确几个概念,以便后续说明
CGI:(Common Gateway Interface)Http服务器与后端程序(如PHP)进行交互的中间层。
工作原理及处理方式(fork-and-execute模式):
1.当Web Server有Request到达
2.fork一个CGI进程或线程(配置管理,环境初始化)
3.执行后台脚本
4.将结果返回Web服务器。
5.Web服务器将结果返回给用户。
FastCGI:常驻型(long-live)CGI形式,经过激活后,不会每次都要花时间去fork。
工作原理及处理方式:
1.Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
2.FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi进程),并等待来自Web Server的连接
3.当有客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器;Web Server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4.FastCGI子进程完成处理后将标准输出和错误信息返回Web Server。当FastCGI子进程关闭连接时,请求便告知处理完成。子进程继续响应来自FastCGI进程管理器分配的其他请求。
PHP-FPM:只用于PHP的PHP FastCGI 进程管理器。
PHP5.3.3以后的版本已经集成了PHP-FPM了。
php-fpm提供了更好的PHP配置管理方式,可以有效控制内存和进程、可以平滑重载php配置。
./configure php源码的时候,加—enable-fpm参数可开启PHP_FMP。
Spawn-FCGI:一个普通的FastCGI进程管理器。
二. PHP中的CGI实现:
PHP的CGI实现本质上是以Socket编程实现一个TCP或者UDP协议服务器。当启动时, 创建TCP/UDP协议的服务器监听,并接受相关请求进行处理。
CGI的生命周期为:模块初始化;SAPI初始化;请求的处理;模块关闭;SAPI关闭;
以TCP协议为例,在TCP的服务端,会执行如下操作:
1.服务端调用Socket函数创建一个TCP用的流式套接字;
2.服务端调用bind函数将服务器的本地地址与前面创建的套接字绑定;
3.服务调用listen函数将新创建的套接字作为监听,等待客户端发起连接,当客户端有多个连接连接到这个套接字时,可能需要排队处理;
4.服务器调用accept函数进入阻塞状态,直到有客户进程调用connect函数而建立起一个连接;
5.当与客户端创建连接后,服务器调用read_stream函数读取客户的请求;
6.处理完数据后,服务器调用write函数向客户端发送应答。
三.目前PHP的工作方式(以Apache服务器为例,因为Apache和Php是好兄弟嘛)
1.Apache Handler方式(php作为Apache服务器的Module)
一种改进的CGI方式,把PHP的解释模块编成so扩展,添加到Apache的modules中。
配置方式:
<p>1.编译PHP时,加上如下参数:</p> <p>cd php-source</p> <p>./configure --prefix=/home/weiyanyan/local/php --with-apxs2=/home/weiyanyan/local/apache/bin/apxs --with-mysql</p> <p>说明:—with-apxs2为apache中apxs相应目录,将在apache根目录下的modules下生成libphp5.so</p> <p>2.在apache的配置文件http.conf中增加 <p>LoadModule php5_module modules/libphp5.so <p>然后在<IfModule mime_module>节点下增加如下mime配置 <p>AddType application/x-httpd-php .php<br> </p>
2.CGI模式
前提为不能以模块模式运行。(注释掉:LoadModule php5_module modules/libphp5.so)
在httpd.conf增加action:
Action application/x-httpd-php /cgi-bin/php-cgi
如果在/cgi目录找不到php-cgi,可从php的bin里面cp一个。
【可以写一个PHP脚本,让其sleep(20);运行之前看机器进程中无php-cgi进程,请求的时候,会有相应的进程产生。经测试一个php-cgi进程可以承载多个请求,具体未深究,因为这种方式已经基本没有人用了。】
3.FastCGI模式
FastCGI模式根据进程管理器的不同可以分为:Apache内置进程管理器,php-fpm进程管理器
Apache内置进程管理器:
<p>mod_fastcgi的安装 <p>#wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz <p># tar -zxvf mod_fastcgi-2.4.6.tar.gz <p># cd mod_fastcgi-2.4.6 <p># cp Makefile.AP2 Makefile <p># vim Makefile 将Makefile中的路径改成你的apache的安装路径 <p># make install 安装成功 <p>安装成功后,会自动把mod_fastcgi.so复制到/usr/local/apache/modules目录 </p>
首先要添加fastcgi模块到httpd.conf配置文件:
LoadModule fastcgi_module modules/mod_fastcgi.so
这种模式注释不注释LoadModule php5_module modules/libphp5.so这行貌似没什么关系,只要配置了以下模块
AddHandler php-fastcgi .php Action php-fastcgi /cgi-bin/php-cgi
FastCgiServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -processes 20
AddType application/x-httpd-php .php
就会自动走到fastcgi模式。
然后重启apache,这个时候用 ps aux|grep php就会发现有很多php-cgi进程在运行。说明配置生效.
FPM方式
首先要添加fastcgi模块到httpd.conf配置文件:
LoadModule fastcgi_module modules/mod_fastcgi.so
这种模式注释不注释LoadModule php5_module modules/libphp5.so这行貌似没什么关系,只要配置了以下模块
FastCgiExternalServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -host 127.0.0.1:9000
AddType application/x-httpd-php .php
AddHandler php-fastcgi .php
Action php-fastcgi /cgi-bin/php-cgi
其中在本机9000端口开启了PHP-Fpm服务
FPM的安装简单介绍如下:
cd php-source
./configure --prefix=/home/weiyanyan/local/php --with-apxs2=/home/weiyanyan/local/apache/bin/apxs --with-mysql --enable-fpm
此时在Php的根目录sbin下会有php-fpm运行程序,其配置文件在php根目录下面的/etc/php-fpm.conf
修改完配置,在apache配置对应的端口启动php-fpm即可。
[只是写完,未检查,回家过年…]
参考:
http://www.phppan.com/2011/05/php-cgi/
http://www.cnblogs.com/fangbo/archive/2011/12/02/2272400.html
http://blog.zyan.cc/nginx_php_v6/

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在建立虛擬機器時,系統會要求您選擇磁碟類型,您可以選擇固定磁碟或動態磁碟。如果您選擇了固定磁碟,後來意識到需要動態磁碟,或者相反,該怎麼辦?好!你可以把一種轉換成另一種。在這篇文章中,我們將看到如何將VirtualBox固定磁碟轉換為動態磁碟,反之亦然。動態磁碟是一種虛擬硬碟,它最初具有較小的大小,隨著您在虛擬機器中儲存數據,其大小會相應增長。動態磁碟在節省儲存空間方面非常高效,因為它們只佔用所需的主機儲存空間。然而,隨著磁碟容量的擴展,可能會稍微影響電腦的效能。固定磁碟和動態磁碟是虛擬機器中常用的

DHCP中繼的作用是將接收到的DHCP封包轉送到網路上的另一個DHCP伺服器,即使這兩台伺服器位於不同的子網路中。透過使用DHCP中繼,您可以實現在網路中心部署集中式的DHCP伺服器,並利用它為所有網路子網路/VLAN動態分配IP位址。 Dnsmasq是一種常用的DNS和DHCP協定伺服器,可設定為DHCP中繼伺服器,以協助管理網路中的動態主機設定。在本文中,我們將向您展示如何將dnsmasq配置為DHCP中繼伺服器。內容主題:網路拓樸在DHCP中繼上設定靜態IP位址集中式DHCP伺服器上的D

在網路資料傳輸中,IP代理伺服器扮演著重要的角色,能夠幫助使用者隱藏真實IP位址,保護隱私、提升存取速度等。在本篇文章中,將介紹如何用PHP建立IP代理伺服器的最佳實務指南,並提供具體的程式碼範例。什麼是IP代理伺服器? IP代理伺服器是位於使用者與目標伺服器之間的中間伺服器,它可作為使用者與目標伺服器之間的中轉站,將使用者的請求和回應轉發。透過使用IP代理伺服器

epic伺服器離線進不了遊戲怎麼辦?這個問題想必很多小夥伴都有遇過,出現了此提示就是導致正版的遊戲無法啟動,那麼出現這個問題一般是網絡和安全軟體幹擾導致的,那麼應該怎麼解決呢,本期小編就來和大夥分享解決方法,希望今日的軟體教學可以幫助各位解決問題。 epic伺服器離線進不了遊戲怎麼辦: 1、很可能是被安全軟體幹擾了,將遊戲平台和安全軟體關閉在重啟。 2、其次就是網路波動過大,嘗試重啟一次路由器,看看是否有效,如果條件可以的話,可以嘗試使用5g移動網絡來進行操作。 3、然後有可能是更

基於大模型的持續最佳化,LLM智能體-這些強大的演算法實體已經展現出解決複雜多步驟推理任務的潛力。從自然語言處理到深度學習,LLM智能體正逐漸成為研究和工業界的焦點,它們不僅能理解和生成人類語言,還能在多樣的環境中製定策略、執行任務,甚至使用API調用和編碼來建置解決方案。在這種背景下,AgentQuest框架的提出具有里程碑意義,它不僅僅是一個LLM智能體的評估和進步提供了一個模組化的基準測試平台,而且透過其易於擴展的API,為研究人員提供了一個強大的工具,以更細緻地追蹤和改進這些智能體的性能

本站7月23日消息,華碩推出多款由AMDEPYC霄龍4004系列處理器驅動的伺服器與工作站級產品。本站註:AMD於5月推出AM5平台、Zen4架構的EPYC霄龍4004系列處理器,最高提供16核心3DV-Cache規格。 ASUSProER100AB6伺服器ASUSProER100AB6是一款搭載EPYC霄龍4004系列處理器的1U機架式伺服器產品,適用於IDC及中小型企業需求。 ASUSExpertCenterProET500AB6工作站ASUSExpertCenterProET500AB6是一款A

Cockpit是一個面向Linux伺服器的基於Web的圖形介面。它主要是為了使新用戶/專家用戶更容易管理Linux伺服器。在本文中,我們將討論Cockpit存取模式以及如何從CockpitWebUI切換Cockpit的管理存取。內容主題:駕駛艙進入模式查找當前駕駛艙訪問模式從CockpitWebUI啟用Cockpit的管理訪問從CockpitWebUI禁用Cockpit的管理訪問結論駕駛艙進入模式駕駛艙有兩種訪問模式:受限訪問:這是駕駛艙的默認訪問模式。在這種存取模式下,您無法從駕駛艙Web用戶

如何在伺服器上安裝PHPFFmpeg擴充功能?在伺服器上安裝PHPFFmpeg擴充功能可以幫助我們在PHP專案中處理音視訊文件,實現音視訊文件的編解碼、剪輯、處理等功能。本文將介紹如何在伺服器上安裝PHPFFmpeg擴展,以及具體的程式碼範例。首先,我們需要確保伺服器上已經安裝了PHP以及FFmpeg。如果沒有安裝FFmpeg,可以依照下列步驟安裝FFmpe
