簡單說明CGI是什麼

来源:http://www.cnblogs.com/f-ck-need-u/archive/2017/10/04/7627035.html
-Advertisement-
Play Games

本文目錄:1. CGI是什麼2. 各種術語解釋3. web server和CGI的交互模式 3.1 CGI模式 3.2 模塊模式 3.3 php-fpm模式 1. CGI是什麼 CGI是common gateway interface的縮寫,大家都譯作通用網關介面,但很不幸,我們無法見名知意。 我們 ...


本文目錄:
1. CGI是什麼
2. 各種術語解釋
3. web server和CGI的交互模式
 3.1 CGI模式
 3.2 模塊模式
 3.3 php-fpm模式

1. CGI是什麼

CGI是common gateway interface的縮寫,大家都譯作通用網關介面,但很不幸,我們無法見名知意。

我們知道,web伺服器所處理的內容都是靜態的,要想處理動態內容,需要依賴於web應用程式,如php、jsp、python、perl等。但是web server如何將動態的請求傳遞給這些應用程式?它所依賴的就是cgi協議。沒錯,是協議,也就是web server和web應用程式交流時的規範。換句話說,通過cgi協議,再結合已搭建好的web應用程式,就可以讓web server也能"處理"動態請求,你肯定知道處理兩字為什麼要加上雙引號。

簡單版的cgi工作方式如下:

例如,在谷歌搜索欄中搜索一個關鍵詞"http",對應的URL為:

https://www.google.com/search?q=http&oq=http&aqs=chrome..69i57j69i60l4j0.1136j0j8&sourceid=chrome&ie=UTF-8

當谷歌的web server收到該請求後,先分析該url,從中知道了要執行search程式,並且還知道了一系列要傳遞給search的參數及其對應的value。web server會將這些程式參數和其它一些環境變數根據cgi協議通過TCP或套接字等方式傳遞給已啟動的cgi程式(可能是cgi進程,或者是已載入的模塊cgi模塊)。當cgi進程接收到web server的請求後,調用search程式並執行,同時還會傳遞參數給search程式。search執行結束後,cgi進程/線程將處理結果返回給web server,web server再返回給瀏覽器。

有多種方式可以執行cgi程式,但對http的請求方法來說,只有get和post兩種方法允許執行cgi腳本(即上面的search程式)。

2.各種術語釋疑

說實話,對於一個沒接觸過編程語言的人來說,剛接觸cgi概念的時候肯定會有一堆疑問,這到底是什麼鬼,處理動態內容的東西不是像php一樣的應用程式嗎,跟cgi有幾毛錢關係,fastcgi又是什麼?我想,非科班出身的強迫症患者(包括我)一定會被這些概念折騰的死去活來。

以php為例,我將一次動態請求相關的概念大致都簡單解釋一遍。

  1. cgi:它是一種協議。通過cgi協議,web server可以將動態請求和相關參數發送給專門處理動態內容的應用程式。
  2. fastcgi:也是一種協議,只不過是cgi的優化版。cgi的性能較爛,fastcgi則在其基礎上進行了改進。
  3. php-cgi:fastcgi是一種協議,而php-cgi實現了這種協議。不過這種實現比較爛。它是單進程的,一個進程處理一個請求,處理結束後進程就銷毀。
  4. php-fmp:是對php-cgi的改進版,它直接管理多個php-cgi進程/線程。也就是說,php-fpm是php-cgi的進程管理器因此它也算是fastcgi協議的實現。
  5. cgi進程/線程:在php上,就是php-cgi進程/線程。專門用於接收web server的動態請求,調用並初始化zend虛擬機
  6. cgi腳本:被執行的php源代碼文件。
  7. zend虛擬機:對php文件做詞法分析、語法分析、編譯成opcode,並執行。最後關閉zend虛擬機。
  8. cgi進程/線程和zend虛擬機的關係:cgi進程調用並初始化zend虛擬機的各種環境。

以php-fpm為例,web server從轉發動態請求到結束的過程大致如下:

而每個php-cgi進程的作用大致包括:(有些功能分類錯誤,請無視,知道大致功能就夠了)

註意,儘管php-fpm的全稱為PHP FastCGI Process Manager,但嚴格地講,php-fpm不是fastcgi的進程管理器,而是php fastcgi即php-cgi的進程管理器。fastcgi只是一種協議,不是進程。就像http協議一樣,apache對它的實現是httpd,nginx對它的實現就叫nginx。

再次說明,cgi和fastcgi是一種協議。各種支持和WEB交互的編程語言對cgi/fastcgi協議都做了各自的實現(當然,任何一種語言都能寫cgi腳本),而php上的php-cgi和php-fpm正是php對fastcgi協議的實現。

3. web server和CGI的交互模式

web server對cgi進程/線程來說,它的作用就是發起動態處理請求,傳遞一些參數和環境變數,最後接收cgi的返回結果。再通俗而不嚴謹地說,web server通過cgi/fastcgi協議將動態請求轉發給執行cgi腳本的應用程式。通過下麵httpd.conf中的轉發配置應該很容易理解(httpd和php-fpm的交互):

ProxyRequests off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1

以最典型的apache httpd和php為例,對於httpd來說,web server和php-cgi有3種交互模式。

  • cgi模式:httpd接收到一個動態請求就fork一個cgi進程,cgi進程返回結果給httpd進程後自我銷毀。
  • 動態模塊模式:將php-cgi的模塊(例如php5_module)編譯進httpd。在httpd啟動時會載入模塊,載入時也將對應的模塊激活,php-cgi也就啟動了。(註:糾正一個小小錯誤,很多人以為動態編譯的模塊是可以在需要的時候隨時載入調用,不需要的時候它們就停止了,實際上不是這樣的。和靜態編譯的模塊一樣,動態載入的模塊在被載入時就被加入到激活鏈表中,無論是否使用它,它都已經運行在apache httpd的內部。可參考LoadModule指令的官方手冊)
  • php-fpm模式:使用php-fpm管理php-cgi,此時httpd不再控制php-cgi進程的啟動。可以將php-fpm獨立運行在非web伺服器上,實現所謂的動靜分離。

實際上,藉助模塊mod_fastcgi還可以實現fastcgi模式。同cgi一樣,管理模式的先天缺陷決定了這並不是一種好方法。

3.1 CGI模式

使用CGI模式時,當動態請求到達,httpd臨時啟動一個cgi解釋器,並通過cgi協議轉發要運行的內容。當cgi腳本運行結束後,將結果返回給httpd,然後cgi解釋器進程自我銷毀。當多個動態請求到達時,將先後啟動懂個cgi解釋器。因此,這種方法效率極低。

在註釋掉php5_module的LoadModule相關行後,使用action指令指定要使用cgi運行的類型。但註意,action指令是mod_action提供的,所以必須已經載入該模塊。

例如:指定MIME類型為image/gif的請求使用images.cgi運行。顯然,images.cgi腳本你必須先寫好。

Action image/gif /cgi-bin/images.cgi

還可以通過添加handler來複合文件類型,再使用某個cgi腳本去運行這個handler中的任意類型。

AddHandler my-file-type .xyz
Action my-file-type "/cgi-bin/program.cgi"

對於php來說,則可以使用安裝php時bin目錄下提供的php-cgi程式作為cgi程式。

[root@xuexi php]# ls /usr/local/php/bin/
pear  peardev  pecl  phar  phar.phar  php  php-cgi  php-config  phpize

# 複製到apache預設的cgi-bin目錄下,方便管理
[root@xuexi php]# cp /usr/local/php/bin/php-cgi /usr/local/apache/cgi-bin/

# 在httpd.conf中添加以下行
Action application/x-httpd-php /usr/local/php/bin/cgi-bin/php-cgi

3.2 模塊方式

在編譯php時,將php5_module模塊編譯到apache中,例如在編譯php時在./configure配置中加上"--with-apxs2=/usr/local/apache/bin/apxs"。

這種交互模式下,httpd在啟動時載入並激活php_module。也就是說,php-cgi常駐在httpd進程內部。當動態請求到達時,httpd不用再生成cgi解釋器,而是直接將動態請求轉發給它內部php-cgi。

配置實用這種交互模式非常簡單,只需使用LoadModule載入php_module,再添加對應的MIME處理器即可。

LoadModule php5_module modules/libphp5.so

# 在mime模塊中添加對應的類型
<IfModule mime_module>
AddType application/x-httpd-php .php
AddType applicaiton/x-httpd-php-source .phps
</IfModule>

3.3 php-fpm方式

前面說了,php-fpm是php-cgi的進程管理器。這種交互方式實際上是讓php-cgi以獨立於httpd的方式存在,目前基本使用php-fpm的方式管理php-cgi進程。也就是說,這種模式下,php-cgi和httpd已經分離了,它們的分離意味著請求的動靜分離變為可能:httpd和php-fpm分別運行在不同伺服器上。動靜分離後,壓力也分散到各自的伺服器上。

要讓php-fpm以這種方式運行,需要在編譯的./configure配置選項中添加"--enable-fpm"選項。當然,還得啟動php-fpm服務。例如:

service php-fpm start

這樣php-cgi進程就開放著埠(預設9000)等待httpd轉發動態請求。要讓httpd能夠轉發請求到php-cgi上,需要在httpd.conf中關閉正向代理,並設置fastcgi協議代理參數。例如,轉發到192.168.100.54主機上的php-fpm。

# 載入代理模塊
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

# 添加MIME類型
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# 在需要轉發的虛擬主機中配置轉發代理
ProxyRequests off
ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.100.54:9000/usr/local/apache/htdocs/$1

 

回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到資料庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7627035.html

註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]虛擬機設置 [2]系統安裝 [3]XShell配置 [4]常見問題 ...
  • 1》面向對象編程(Object-Oriented Programming): 對於編程語言的初學者而言,OOP不是一個很容易理解的編程方式,OPP的三大特性有繼承,封裝,多態,OOP也使得我們對代碼的修改和擴展變得更容易; 封裝:把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或對 ...
  • (一)通過命令行的方式 1.linux伺服器端設置 在linux主機上,安裝上傳下載工具包rz及sz; 如果不知道你要安裝包的具體名稱,可以使用yum provides */name 進行查找系統自帶軟體包的信息; 一般會列出軟體包的名稱及版本,還有安裝路徑;查詢到軟體包名後,使用yum insta ...
  • 1 》模塊介紹: 模塊,用一坨代碼實現了某個功能的代碼集合,類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的 重用性和代碼間的吻合,對於一個複雜的功能來說,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個.py文件組成的代碼集合就稱為模塊; ...
  • ping命令: ping是用來檢測網路是否通暢或者查詢網路連接速度的一個基礎命令。作為一名對電腦痴迷的愛好者來說,ping命令是需要第一個掌握的DOS命令。它所利用的原理是這樣的:網路上的機器都有唯一確定的IP地址,我們給目標IP地址發送一個數據包,對方就要返回一個同樣大小的數據包,根據返回的數據 ...
  • 本文目錄:1. prefork模式 1.1 概述 1.2 prefork工作機制 1.3 prefork相關指令2. worker模式 2.1 概述 2.2 worker工作機制3. event模式 3.1 概述 3.2 和worker工作模式的關係 3.3 event工作機制 3.3.1 非同步連接 ...
  • 一、YUM(Yellowdog Updater, Modified) 1. yum 簡介 RPM 軟體包形式管理軟體雖然方便,但是需要手動解決軟體包的依賴問題。很多時候安裝一個軟體首先需要安裝 1 個或多個(有時多達上百個)其他軟體,手動解決依賴問題很複雜。使用 YUM 可以解決這個問題。Linux ...
  • 1》迭代器原理及使用: 1>原理: 迭代器是訪問集合元素的一種方式,迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束;迭代器只能往前不會後退,不過這也沒什 麽,人們很少在迭代途中往後退,另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素;迭代器僅僅在迭代到某個元素時才計 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...