CGI全稱通用網關接口 Commmon Gateway Interfacephp
用於HTTP服務上的程序服務通訊交流的一種工具,CGI程序須運行在網絡服務器上。linux
傳統CGI接口方式性能較差,因爲每次HTTP服務器遇到動態程序須要重啓解析器來執行解析,而後結果被返回給HTTP服務器。這在處理高併發時,幾乎是不可能的,所以誕生了FastCGI。另外傳統的CGI接口方式安全性也不好nginx
一個可伸縮地。高速地在HTTP服務器和動態腳本語言間通訊的接口vim
接口在linux下是socket(這個socket能夠是文件socket也能夠是ip socket)瀏覽器
主要優勢把動態語言和HTTP服務器分離開來。多數流行的HTTP服務器都支持FsatCGI包括Apache/Nginx/lighttpd等安全
支持語言比較流行的是PHP,接口方式採用C/S架構,能夠將HTTP服務器和腳本解析器分開,同時在腳本解析服務器上啓動一個或者多個腳本解析守護進程。服務器
當HTTP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程來執行,而後將獲得的結果返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。網絡
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#腳本文件請求的路徑架構
fastcgi_param QUERY_STRING $query_string; #請求的參數;如?app=123併發
fastcgi_param REQUEST_METHOD $request_method; #請求的動做(GET,POST)
fastcgi_param CONTENT_TYPE $content_type; #請求頭中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; #請求頭中的Content-length字段。
fastcgi_param SCRIPT_NAME $fastcgi_script_name; #腳本名稱
fastcgi_param REQUEST_URI $request_uri; #請求的地址不帶參數
fastcgi_param DOCUMENT_URI $document_uri; #與$uri相同。
fastcgi_param DOCUMENT_ROOT $document_root; #網站的根目錄。在server配置中root指令中指定的值
fastcgi_param SERVER_PROTOCOL $server_protocol; #請求使用的協議,一般是HTTP/1.0或HTTP/1.1。
fastcgi_param GATEWAY_INTERFACE CGI/1.1;#cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;#nginx 版本號,可修改、隱藏
fastcgi_param REMOTE_ADDR $remote_addr; #客戶端IP
fastcgi_param REMOTE_PORT $remote_port; #客戶端端口
fastcgi_param SERVER_ADDR $server_addr; #服務器IP地址
fastcgi_param SERVER_PORT $server_port; #服務器端口
fastcgi_param SERVER_NAME $server_name; #服務器名,域名在server配置中指定的server_name
#fastcgi_param PATH_INFO $path_info;#可自定義變量
# PHP only, required if PHP was builtwith --enable-force-cgi-redirect
#fastcgi_param REDIRECT_STATUS 200;
在php可打印出上面的服務環境變量
如:echo$_SERVER['REMOTE_ADDR']
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 不支持對外部動態程序的直接調用或者解析 ,全部的外部程序(包括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
一、用戶發送http請求報文給nginx服務器
二、nginx會根據文件url和後綴來判斷請求
三、若是請求的是靜態內容,nginx會將結果直接返回給用戶
四、若是請求的是動態內容,nginx會將請求交給fastcgi客戶端,經過fastcgi_pass將這個請求發送給php-fpm
五、php-fpm會將請求交給wrapper
六、wrapper收到請求會生成新的線程調用php動態程序解析服務器
七、若是用戶請求的是博文、或者內容、PHP會請求MySQL查詢結果
八、若是用戶請求的是圖片、附件、PHP會請求nfs存儲查詢結果
九、php會將查詢到的結果交給Nginx
十、nginx會生成一個響應報文返還給用戶
知識補充:
網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。
Socket的英文原義是「孔」或「插座」。做爲BSDUNIX的進程通訊機制,取後一種意思。一般也稱做"套接字",用於描述IP地址和端口,是一個通訊鏈的句柄,能夠用來實現不一樣虛擬機或不一樣計算機之間的通訊。在Internet上的主機通常運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不一樣的端口對應於不一樣的服務。Socket正如其英文原意那樣,像一個多孔插座。一臺主機猶如佈滿各類插座的房間,每一個插座有一個編號,有的插座提供220伏交流電,有的提供110伏交流電,有的則提供有線電視節目。客戶軟件將插頭插到不一樣編號的插座,就能夠獲得不一樣的服務。
本文出自 「追夢IT男」 博客,請務必保留此出處http://runningyongboy.blog.51cto.com/8234857/1722299