一、FastCGI
1.介紹
CGI全稱通用網關接口 Commmon Gateway Interface
用於HTTP服務上的程序服務通信交流的一種工具,CGI程序須運行在網絡服務器上。
傳統CGI接口方式性能較差,由於每次HTTP服務器遇到動態程序需要重啟解析器來執行解析,然后結果被返回給HTTP服務器。這在處理高並發時,幾乎是不可能的,因此誕生了FastCGI。另外傳統的CGI接口方式安全性也很差
一個可伸縮地。高速地在HTTP服務器和動態腳本語言間通信的接口
接口在linux下是socket(這個socket可以是文件socket也可以是ip socket)
主要優點把動態語言和HTTP服務器分離開來。多數流行的HTTP服務器都支持FsatCGI包括Apache/Nginx/lighttpd等
支持語言比較流行的是PHP,接口方式采用C/S架構,可以將HTTP服務器和腳本解析器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程。
當HTTP服務器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給瀏覽器。這種方式可以讓HTTP服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。
2. 配置文件注釋
vim /application/nginx/conf/fastcgi.conf
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']
3.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。
Socket的英文原義是“孔”或“插座”。作為BSDUNIX的進程通信機制,取后一種意思。通常也稱作"套接字",用於描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務。Socket正如其英文原意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電,有的提供110伏交流電,有的則提供有線電視節目。客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務。
本文出自 “追夢IT男” 博客,請務必保留此出處http://runningyongboy.blog.51cto.com/8234857/1722299