nginx+php fastCGI優(yōu)化

什么是 FastCGI

FastCGI是一個(gè)可伸縮地、高速地在HTTP server和動(dòng)態(tài)腳本語(yǔ)言間通信的接口。多數(shù)流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同時(shí),F(xiàn)astCGI也被許多腳本語(yǔ)言所支持,其中就有PHP。 FastCGI是從CGI發(fā)展改進(jìn)而來(lái)的。傳統(tǒng)CGI接口方式的主要缺點(diǎn)是性能很差,因?yàn)槊看蜨TTP服務(wù)器遇到動(dòng)態(tài)程序時(shí)都需要重新啟動(dòng)腳本解析器來(lái)執(zhí)行解析,然后結(jié)果被返回給HTTP服務(wù)器。這在處理高并發(fā)訪問(wèn)時(shí),幾乎是不可用的。另外傳統(tǒng)的CGI接口方式安全性也很差,現(xiàn)在已經(jīng)很少被使用了。 ? FastCGI接口方式采用C/S結(jié)構(gòu),可以將HTTP服務(wù)器和腳本解析服務(wù)器分開(kāi),同時(shí)在腳本解析服務(wù)器上啟動(dòng)一個(gè)或者多個(gè)腳本解析守護(hù)進(jìn)程。當(dāng)HTTP服務(wù)器每次遇到動(dòng)態(tài)程序時(shí),可以將其直接交付給FastCGI進(jìn)程來(lái)執(zhí)行,然后將得到的結(jié)果返回給瀏覽器。這種方式可以讓HTTP服務(wù)器專(zhuān)一地處理靜態(tài)請(qǐng)求或者將動(dòng)態(tài)腳本服務(wù)器的結(jié)果返回給客戶(hù)端,這在很大程度上提高了整個(gè)應(yīng)用系統(tǒng)的性能。

Nginx+FastCGI運(yùn)行原理

Nginx不支持對(duì)外部程序的直接調(diào)用或者解析,所有的外部程序(包括PHP)必須通過(guò)FastCGI接口來(lái)調(diào)用。FastCGI接口在Linux下是socket,(這個(gè)socket可以是文件socket,也可以是ip socket)。為了調(diào)用CGI程序,還需要一個(gè)FastCGI的wrapper(wrapper可以理解為用于啟動(dòng)另一個(gè)程序的程序),這個(gè)wrapper綁定在某個(gè)固定socket上,如端口或者文件socket。當(dāng)Nginx將CGI請(qǐng)求發(fā)送給這個(gè)socket的時(shí)候,通過(guò)FastCGI接口,wrapper接納到請(qǐng)求,然后派生出一個(gè)新的線程,這個(gè)線程調(diào)用解釋器或者外部程序處理腳本并讀取返回?cái)?shù)據(jù);接著,wrapper再將返回的數(shù)據(jù)通過(guò)FastCGI接口,沿著固定的socket傳遞給Nginx;最后,Nginx將返回的數(shù)據(jù)發(fā)送給客戶(hù)端,這就是Nginx+FastCGI的整個(gè)運(yùn)作過(guò)程。詳細(xì)的過(guò)程。

2018080715075738.jpg

fastCGI默認(rèn)解釋

通過(guò)location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來(lái)處理,而這里的IP地址和端口就是FastCGI進(jìn)程監(jiān)聽(tīng)的IP地址和端口。 ? fastcgi_param指令指定放置PHP動(dòng)態(tài)程序的主目錄,也就是$fastcgi_script_name前面指定的路徑,這里是/usr/local/nginx/html目錄,建議將這個(gè)目錄與Nginx虛擬主機(jī)指定的根目錄保持一致,當(dāng)然也可以不一致。 fastcgi_params文件是FastCGI進(jìn)程的一個(gè)參數(shù)配置文件,在安裝Nginx后,會(huì)默認(rèn)生成一個(gè)這樣的文件,這里通過(guò)include指令將FastCGI參數(shù)配置文件包含了進(jìn)來(lái)。

優(yōu)化nginx主配置文件HTTP字段下參數(shù)配置

在配置完成Nginx+FastCGI之后,為了保證Nginx下PHP環(huán)境的高速穩(wěn)定運(yùn)行,需要添加一些FastCGI優(yōu)化指令。下面給出一個(gè)優(yōu)化實(shí)例,將下面代碼添加到Nginx主配置文件中的HTTP層級(jí)。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
server {</pre>

參數(shù)解釋?zhuān)?/h4>

$ fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; # 為FastCGI緩存指定一個(gè)文件路徑、目錄結(jié)構(gòu)等級(jí)、關(guān)鍵字區(qū)域存儲(chǔ)時(shí)間和非活動(dòng)刪除時(shí)間
path 緩存文件存放(臨時(shí))目錄
levels 緩存層次
keys_zone 緩存空間名和共享內(nèi)存大小
inactive 失效時(shí)間, 1d = 1天
max_size 最大緩存空間(硬盤(pán)占用)

$ fastcgi_connect_timeout 300; # nginx和fastCGI連接的超時(shí)時(shí)間

fastcgi_send_timeout 300; # Nginx允許FastCGI服務(wù)器返回?cái)?shù)據(jù)的超時(shí)時(shí)間, ? fastcgi_read_timeout 300; # Nginx從FastCGI服務(wù)器讀取響應(yīng)信息的超時(shí)時(shí)間
?
fastcgi_buffer_size 64k; # nginx fastCGI緩存區(qū)的大小 ? fastcgi_buffers 4 64k; # 設(shè)定用來(lái)讀取從dastCGI服務(wù)器收到的響應(yīng)信息的超時(shí)時(shí)間
?
fastcgi_busy_buffers_size 128k; #設(shè)置了系統(tǒng)繁忙時(shí)可以使用的proxy——buffers大小 ? fastcgi_temp_file_write_size 128k; # fastCGI臨時(shí)文件的大小
?
fastcgi_cache TEST; #fastcgi_cache表示開(kāi)啟FastCGI緩存并為其指定一個(gè)名稱(chēng)。開(kāi)啟緩存非常有用,可以有效降低CPU的負(fù)載,并且防止502錯(cuò)誤的發(fā)生,但是開(kāi)啟緩存也會(huì)引起很多問(wèn)題,要視具體情況而定。 ? fastcgi_cache_methods GET HEAD;#指定緩存的請(qǐng)求方式
?
fastcgi_cache_use_stale error timeout invalid_header http_500; #定義哪些情況下用過(guò)期緩存 ?fastcgi_cache_key "request_method://host$request_uri"; #指定緩存文件的標(biāo)識(shí),這個(gè)標(biāo)識(shí)會(huì) MD5 轉(zhuǎn)碼存儲(chǔ)在緩存域的目錄下
?</pre>

優(yōu)化fastCGI的location字段下的參數(shù)

location ~ .*.(php|php5)?{ root html/www; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; fastcgi_cache ngin_cache; #fastcgi_cache表示開(kāi)啟FastCGI緩存并為其指定一個(gè)名稱(chēng)。開(kāi)啟緩存非常有用,可以有效降低CPU的負(fù)載,并且防止502錯(cuò)誤的發(fā)生,但是開(kāi)啟緩存也會(huì)引起很多問(wèn)題,要視具體情況而定。 ? fastcgi_cache_valid 200 302 1h; # 指定http狀態(tài)碼的緩存時(shí)間,這里表示將200和302緩存1小時(shí) ? fastcgi_cache_valid 301 1d; # 指定http狀態(tài)碼的緩存時(shí)間,這里表示將301緩存1天 ? fastcgi_cache_valid any 1m; # 指定http狀態(tài)碼的緩存時(shí)間,這里表示將其他狀態(tài)碼緩存1分鐘 ? fastcgi_cache_min_uses 1; # 設(shè)置請(qǐng)求幾次之后響應(yīng)被緩存,1表示一次即被緩存 ? fastcgi_cache_use_stale error timeout invalid_header http_500; # 定義在哪些情況下使用過(guò)期緩存 ? fastcgi_cache_key http://host$request_uri; #指定緩存文件的標(biāo)識(shí),這個(gè)標(biāo)識(shí)會(huì) MD5 轉(zhuǎn)碼存儲(chǔ)在緩存域的目錄下
?
}</pre>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇是Nginx安裝配置PHP(FastCGI)環(huán)境的教程。Nginx不支持對(duì)外部程序的直接調(diào)用或者解析,所有的外...
    SkTj閱讀 3,219評(píng)論 2 20
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_閱讀 2,057評(píng)論 0 3
  • I/O模型Nginx介紹Nginx的安裝和目錄結(jié)構(gòu)Nginx的配置Nginx的編譯安裝 一、I/O模型 (一)I/...
    哈嘍別樣閱讀 983評(píng)論 0 4
  • FastCGI模塊模塊允許nginx同F(xiàn)astCGI協(xié)同工作,并且控制哪些參數(shù)將被安全傳遞。 一、CGI和Fast...
    北山學(xué)者閱讀 9,749評(píng)論 3 8
  • Nginx簡(jiǎn)介 解決基于進(jìn)程模型產(chǎn)生的C10K問(wèn)題,請(qǐng)求時(shí)即使無(wú)狀態(tài)連接如web服務(wù)都無(wú)法達(dá)到并發(fā)響應(yīng)量級(jí)一萬(wàn)的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,227評(píng)論 0 9

友情鏈接更多精彩內(nèi)容