1. 程式人生 > >Nginx fastcgi、uwgi、scgi

Nginx fastcgi、uwgi、scgi

CGI

CGI全稱通用閘道器介面 Commmon Gateway Interface。CGI描述了伺服器和請求處理程式之間傳輸資料的一種標準。

fastcgi

傳統CGI介面

傳統CGI介面方式效能較差,由於每次HTTP伺服器遇到動態程式需要重啟解析器來執行解析,然後結果被返回給HTTP伺服器。這在處理高併發時,幾乎是不可能的,因此誕生了FastCGI。

fastcgi介面

當HTTP伺服器每次遇到動態程式時,可以將其直接交付給FastCGI程序來執行,然後將得到的結果返回給瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求或者將動態指令碼伺服器的結果返回給客戶端,這在很大程度上提高了整個應用系統的效能。fastcgi是一個可伸縮地、高速地在HTTP伺服器和動態指令碼語言間通訊的介面

fastCGI介面的特點

  1. 是HTTP伺服器和動態指令碼語言間通訊的介面或者工具!
  2. 優點就是把動態語言解析和HTTP伺服器分離了開來!
  3. Nginx、Apache、lighttpd以及多數動態語言都支援FastCGI。
  4. 介面方式採用C/S結構,分為HTTP伺服器(客戶端)和動態語言解析伺服器(服務端)
  5. PHP動態語言服務端可以啟動多個FastCGI的守護程序例如:php-fpm(fcgi process mangemnt))
  6. http伺服器通過(Nginx fastgi_pass)FastCGI客戶端和動態語言FastCGI服務端通訊(例如:php-fpm)

Nginx FastCGI的執行原理

在這裡插入圖片描述

Nginx 不支援對外部動態程式的直接呼叫或者解析 ,所有的外部程式(包括PHP)必須通過FastCGI介面來呼叫。FastCGI介面在linux下是socket,(這個socket可以是檔案socket,也可以是IP socket)。為了呼叫CGI程式,還需要wrapper繫結在某個固定socket上,如埠或者檔案socket。當Nginx將CGI請求傳送給這個socket的時候,通過FastCGI介面,warpper接収到請求,然後派出一個新的執行緒,這個執行緒呼叫直譯器或者外部程式處理指令碼並讀取返回資料,接著,wrapper再將返回的資料通過FastCGI介面,沿著固定socket傳遞給Nginx;最後,nginx將返回的資料傳送給客戶端,這就是Nginx+fastcgi的整個執行過程。
nginx fastcgi訪問php

1、使用者傳送http請求報文給nginx伺服器

2、nginx會根據檔案url和字尾來判斷請求

3、如果請求的是靜態內容,nginx會將結果直接返回給使用者

4、如果請求的是動態內容,nginx會將請求交給fastcgi客戶端,通過fastcgi_pass將這個請求傳送給php-fpm

5、php-fpm會將請求交給wrapper

6、wrapper收到請求會生成新的執行緒呼叫php動態程式解析伺服器

7、如果使用者請求的是博文、或者內容、PHP會請求MySQL查詢結果

8、如果使用者請求的是圖片、附件、PHP會請求nfs儲存查詢結果

9、php會將查詢到的結果交給Nginx

10、nginx會生成一個響應報文返還給使用者

知識補充:
網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。

scgi

SCGI(Simple Common Gateway Interface)與FastCGI相似,也是CGI的一個替代協議,SCGI源於Python社群,

uwsgi

WIGS(Web Server Gateway Interface)伺服器閘道器接
WIGS是Python應用程式或框架和Web伺服器之間的一種介面,已經被廣泛接受, 它已基本達成它的可移植性方面的目標。
參考
http://runningyongboy.blog.51cto.com/8234857/1722299