成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

Nginx安裝配置PHP(FastCGI)環(huán)境的教程

2012-03-16 15:34:53來(lái)源:linuxde作者:

這篇是Nginx安裝配置PHP(FastCGI)環(huán)境的教程。Nginx不支持對(duì)外部程序的直接調(diào)用或者解析,所有的外部程序(包括PHP)必須通過(guò)FastCGI接口來(lái)調(diào)用。

一、什么是 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ù)器專一地處理靜態(tài)請(qǐng)求或者將動(dòng)態(tài)腳本服務(wù)器的結(jié)果返回給客戶端,這在很大程度上提高了整個(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ā)送給客戶端,這就是Nginx+FastCGI的整個(gè)運(yùn)作過(guò)程。詳細(xì)的過(guò)程,如圖1所示。

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

三、spawn-fcgi與PHP-FPM

前面介紹過(guò),F(xiàn)astCGI接口方式在腳本解析服務(wù)器上啟動(dòng)一個(gè)或者多個(gè)守護(hù)進(jìn)程對(duì)動(dòng)態(tài)腳本進(jìn)行解析,這些進(jìn)程就是FastCGI進(jìn)程管理器,或者稱之為FastCGI引擎, spawn-fcgi與PHP-FPM就是支持PHP的兩個(gè)FastCGI進(jìn)程管理器。下面簡(jiǎn)單介紹spawn-fcgi與PHP-FPM的異同。

spawn-fcgi是HTTP服務(wù)器lighttpd的一部分,目前已經(jīng)獨(dú)立成為一個(gè)項(xiàng)目,一般與lighttpd配合使用來(lái)支持PHP,但是ligttpd的spwan-fcgi在高并發(fā)訪問(wèn)的時(shí)候,會(huì)出現(xiàn)內(nèi)存泄漏甚至自動(dòng)重啟FastCGI的問(wèn)題。

Nginx是個(gè)輕量級(jí)的HTTP server,必須借助第三方的FastCGI處理器才可以對(duì)PHP進(jìn)行解析,因此Nginx+spawn-fcgi的組合也可以實(shí)現(xiàn)對(duì)PHP的解析,這里不過(guò)多講述。

PHP-FPM也是一個(gè)第三方的FastCGI進(jìn)程管理器,它是作為PHP的一個(gè)補(bǔ)丁來(lái)開(kāi)發(fā)的,在安裝的時(shí)候也需要和PHP源碼一起編譯,也就是說(shuō)PHP-FPM被編譯到PHP內(nèi)核中,因此在處理性能方面更加優(yōu)秀;同時(shí)它在處理高并發(fā)方面也比spawn-fcgi引擎好很多,因此,推薦Nginx+PHP/PHP-FPM這個(gè)組合對(duì)PHP進(jìn)行解析。

FastCGI 的主要優(yōu)點(diǎn)是把動(dòng)態(tài)語(yǔ)言和HTTP Server分離開(kāi)來(lái),所以Nginx與PHP/PHP-FPM經(jīng)常被部署在不同的服務(wù)器上,以分擔(dān)前端Nginx服務(wù)器的壓力,使Nginx專一處理靜態(tài)請(qǐng)求和轉(zhuǎn)發(fā)動(dòng)態(tài)請(qǐng)求,而PHP/PHP-FPM服務(wù)器專一解析PHP動(dòng)態(tài)請(qǐng)求。

四、 PHP與PHP-FPM的安裝及優(yōu)化

1. 下載安裝包

從php官方網(wǎng)站下載PHP源碼包,這里下載的是穩(wěn)定版php-5.2.13.tar.gz。從這里下載對(duì)應(yīng)的PHP-FPM源碼包,這里下載的是php-5.2.13-fpm-0.5.13.diff.gz。需要注意,在下載軟件包版本時(shí),盡量使PHP和PHP-FPM版本一致,如果版本之間相差太大,可以會(huì)出現(xiàn)兼容問(wèn)題。

2. 配置安裝環(huán)境

安裝PHP需要下面軟件包的支持,如果沒(méi)有安裝,請(qǐng)自行安裝。

yum -y install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel

由于各個(gè)Linux系統(tǒng)版本的不確定性,讀者也可以在安裝PHP過(guò)程中,根據(jù)錯(cuò)誤提示信息,安裝對(duì)應(yīng)的軟件庫(kù)。

3. 開(kāi)始編譯安裝PHP和PHP-FPM

編譯安裝PHP和PHP-FPM很簡(jiǎn)單,下面是安裝過(guò)程:

tar zxvf php-5.2.13.tar.gz
gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1
cd php-5.2.13
./configure --prefix=/usr/local/php --enable-fastcgi --enable-fpm
make
make install
cp php.ini-dist /usr/local/php/lib/php.ini

其中,第二步將PHP-FPM作為補(bǔ)丁加入PHP源碼中。 在“./configure”編譯選項(xiàng)中,指定將PHP安裝到/usr/local下,“--enable-fastcgi”是啟用對(duì)PHP的FastCGI支持,“--enable-fpm”是激活對(duì)FastCGI模式的fpm支持。 在編譯PHP時(shí)可以加入很多編譯選項(xiàng),但是這里為了介紹PHP的FastCGI功能沒(méi)有加入更多的編譯選項(xiàng)。

4. 配置與優(yōu)化

PHP-FPM PHP的全局配置文件是php.ini,在上面的步驟中,已經(jīng)將此文件復(fù)制到了/usr/local/php/lib/php.ini下。可以根據(jù)每個(gè)應(yīng)用需求的不同,對(duì)php.ini進(jìn)行相應(yīng)的配置。 下面重點(diǎn)介紹PHP-FPM引擎的配置文件。根據(jù)上面指定的安裝路徑,PHP-FPM的默認(rèn)配置文件為/usr/local/php/etc/php-fpm.conf。 php-fpm.conf是一個(gè)XML格式的純文本文件,其內(nèi)容很容易看明白。

這里重點(diǎn)介紹幾個(gè)重要的配置標(biāo)簽:

標(biāo)簽listen_address是配置fastcgi進(jìn)程監(jiān)聽(tīng)的IP地址以及端口,默認(rèn)是127.0.0.1:9000。

<value name="listen_address">127.0.0.1:9000</value>

標(biāo)簽display_errors用來(lái)設(shè)置是否顯示PHP錯(cuò)誤信息,默認(rèn)是0,不顯示錯(cuò)誤信息,設(shè)置為1可以顯示PHP錯(cuò)誤信息。

<value name="display_errors">0</value>

標(biāo)簽user和group用于設(shè)置運(yùn)行FastCGI進(jìn)程的用戶和用戶組。需要注意的是,這里指定的用戶和用戶組要和Nginx配置文件中指定的用戶和用戶組一致。

<value name="user">nobody</value> < value name="group">nobody</value>

標(biāo)簽max_children用于設(shè)置FastCGI的進(jìn)程數(shù)。根據(jù)官方建議,小于2GB內(nèi)存的服務(wù)器,可以只開(kāi)啟64個(gè)進(jìn)程,4GB以上內(nèi)存的服務(wù)器可以開(kāi)啟200個(gè)進(jìn)程。

<value name="max_children">5</value>

標(biāo)簽request_terminate_timeout用于設(shè)置FastCGI執(zhí)行腳本的時(shí)間。默認(rèn)是0s,也就是無(wú)限執(zhí)行下去,可以根據(jù)情況對(duì)其進(jìn)行修改。

<value name="request_terminate_timeout">0s</value>

標(biāo)簽rlimit_files用于設(shè)置PHP-FPM對(duì)打開(kāi)文件描述符的限制,默認(rèn)值為1024。這個(gè)標(biāo)簽的值必須和Linux內(nèi)核打開(kāi)文件數(shù)關(guān)聯(lián)起來(lái),例如要將此值設(shè)置為65535,就必須在Linux命令行執(zhí)行'ulimit -HSn 65536'。

<value name="rlimit_files">1024</value>

標(biāo)簽max_requests指明了每個(gè)children最多處理多少個(gè)請(qǐng)求后便會(huì)被關(guān)閉,默認(rèn)的設(shè)置是500。

<value name="max_requests">500</value>

標(biāo)簽allowed_clients用于設(shè)置允許訪問(wèn)FastCGI進(jìn)程解析器的IP地址。如果不在這里指定IP地址,Nginx轉(zhuǎn)發(fā)過(guò)來(lái)的PHP解析請(qǐng)求將無(wú)法被接受。

<value name="allowed_clients">127.0.0.1</value>

5. 管理FastCGI進(jìn)程

在配置完php-fpm后,就可以啟動(dòng)FastCGI進(jìn)程了。啟動(dòng)fastcgi進(jìn)程有兩種方式:

/usr/local/php/bin/php-cgi --fpm

或者

/usr/local/php/sbin/php-fpm start

建議采用第二種方式啟動(dòng)FastCGI進(jìn)程。 /usr/local/php/sbin/php-fpm還有其他參數(shù),具體為start|stop|quit|restart|reload|logrotate。 每個(gè)啟動(dòng)參數(shù)的含義如下:

  • start,啟動(dòng)PHP的FastCGI進(jìn)程
  • stop,強(qiáng)制終止PHP的FastCGI進(jìn)程
  • quit,平滑終止PHP的FastCGI進(jìn)程
  • restart, 重啟PHP的FastCGI進(jìn)程
  • reload, 重新加載PHP的php.ini
  • logrotate, 重新啟用log文件

reload是個(gè)很重要的參數(shù),它可以在PHP的FastCGI進(jìn)程不中斷的情況下重新加載改動(dòng)過(guò)的php.ini,因此通過(guò)php-fpm可以平滑變更FastCGI模式下的PHP設(shè)置。

在FastCGI進(jìn)程啟動(dòng)后,其監(jiān)聽(tīng)的IP地址和端口也隨即啟動(dòng),可以通過(guò)ps和netstat查看相關(guān)信息。

netstat -antl|grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN

ps -ef|grep php-cgi
root 3567 1 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3568 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3569 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3570 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3571 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
nobody 3572 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
root 3583 3524 0 17:09 pts/1 00:00:00 grep php-cgi

五、配置Nginx來(lái)支持PHP

Nginx的安裝特別簡(jiǎn)單,前面已經(jīng)對(duì)此進(jìn)行了詳細(xì)介紹,這里不再進(jìn)行講述。下面重點(diǎn)介紹Nginx如何通過(guò)php-fpm的FastCGI進(jìn)程對(duì)PHP進(jìn)行解析處理。 由于Nginx本身不會(huì)對(duì)PHP進(jìn)行解析,因此要實(shí)現(xiàn)Nginx對(duì)PHP的支持,其實(shí)是將對(duì)PHP頁(yè)面的請(qǐng)求交給fastCGI進(jìn)程監(jiān)聽(tīng)的IP地址及端口。如果把php-fpm當(dāng)做動(dòng)態(tài)應(yīng)用服務(wù)器,那么Nginx其實(shí)就是一個(gè)反向代理服務(wù)器。Nginx通過(guò)反向代理功能實(shí)現(xiàn)對(duì)PHP的解析,這就是Nginx實(shí)現(xiàn)PHP動(dòng)態(tài)解析的原理。 這里假定Nginx的安裝目錄為/usr/local,則Nginx配置文件的路徑為/usr/local/nginx/conf/nginx.conf。下面是在Nginx下支持PHP解析的一個(gè)虛擬主機(jī)配置實(shí)例。

server {
include port.conf;
server_name www.ixdba.net ixdba.net;

location / {
index index.html index.php;
root /web/www/www.ixdba.net;
}

location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name;
include fastcgi_params;
}
}

通過(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)。 接下來(lái),啟動(dòng)nginx服務(wù)。 /usr/local/nginx/sbin/nginx 到此為止,Nginx+PHP已經(jīng)配置完成。

六、測(cè)試Nginx對(duì)PHP的解析功能

這里在/usr/local/nginx/html目錄下創(chuàng)建一個(gè)phpinfo.php文件,內(nèi)容如下: < ?php phpinfo(); ?> 然后通過(guò)瀏覽器訪問(wèn),默認(rèn)會(huì)在瀏覽器顯示“Welcome to Nginx!”表示Nginx正常運(yùn)行。 接著在瀏覽器中訪問(wèn) phpinfo.php,如果PHP能夠正常解析,會(huì)出現(xiàn)PHP安裝配置以及功能列表統(tǒng)計(jì)信息。

七、實(shí)例講解Nginx中FastCGI參數(shù)的優(yōu)化

在配置完成Nginx+FastCGI之后,為了保證Nginx下PHP環(huán)境的高速穩(wěn)定運(yùn)行,需要添加一些FastCGI優(yōu)化指令。下面給出一個(gè)優(yōu)化實(shí)例,將下面代碼添加到Nginx主配置文件中的HTTP層級(jí)。

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;

下面是對(duì)上述代碼的含義進(jìn)行介紹:

第一行代碼是為FastCGI緩存指定一個(gè)文件路徑、目錄結(jié)構(gòu)等級(jí)、關(guān)鍵字區(qū)域存儲(chǔ)時(shí)間和非活動(dòng)刪除時(shí)間。

fastcgi_connect_timeout 指定連接到后端FastCGI的超時(shí)時(shí)間。

fastcgi_send_timeout 指定向FastCGI傳送請(qǐng)求的超時(shí)時(shí)間,這個(gè)值是已經(jīng)完成兩次握手后向FastCGI傳送請(qǐng)求的超時(shí)時(shí)間。

fastcgi_read_timeout 指定接收FastCGI應(yīng)答的超時(shí)時(shí)間,這個(gè)值是已經(jīng)完成兩次握手后接收FastCGI應(yīng)答的超時(shí)時(shí)間。

fastcgi_buffer_size 用于指定讀取FastCGI應(yīng)答第一部分需要用多大的緩沖區(qū),這個(gè)值表示將使用1個(gè)64KB的緩沖區(qū)讀取應(yīng)答的第一部分(應(yīng)答頭),可以設(shè)置為fastcgi_buffers選項(xiàng)指定的緩沖區(qū)大小。

fastcgi_buffers 指定本地需要用多少和多大的緩沖區(qū)來(lái)緩沖FastCGI的應(yīng)答請(qǐng)求。如果一個(gè)PHP腳本所產(chǎn)生的頁(yè)面大小為256KB,那么會(huì)為其分配4個(gè)64KB的緩沖區(qū)來(lái)緩存;如果頁(yè)面大小大于256KB,那么大于256KB的部分會(huì)緩存到fastcgi_temp指定的路徑中,但是這并不是好方法,因?yàn)閮?nèi)存中的數(shù)據(jù)處理速度要快于硬盤。一般這個(gè)值應(yīng)該為站點(diǎn)中PHP腳本所產(chǎn)生的頁(yè)面大小的中間值,如果站點(diǎn)大部分腳本所產(chǎn)生的頁(yè)面大小為256KB,那么可以把這個(gè)值設(shè)置為“16 16k”、“4 64k”等。

fastcgi_busy_buffers_size 的默認(rèn)值是fastcgi_buffers的兩倍。

fastcgi_temp_file_write_size 表示在寫入緩存文件時(shí)使用多大的數(shù)據(jù)塊,默認(rèn)值是fastcgi_buffers的兩倍。

fastcgi_cache 表示開(kāi)啟FastCGI緩存并為其指定一個(gè)名稱。開(kāi)啟緩存非常有用,可以有效降低CPU的負(fù)載,并且防止502錯(cuò)誤的發(fā)生,但是開(kāi)啟緩存也會(huì)引起很多問(wèn)題,要視具體情況而定。

fastcgi_cache_valid、fastcgi 用來(lái)指定應(yīng)答代碼的緩存時(shí)間,實(shí)例中的值表示將200和302應(yīng)答緩存一個(gè)小時(shí),將301應(yīng)答緩存1天,其他應(yīng)答均緩存1分鐘。

關(guān)鍵詞:NginxPHPFastCGI

贊助商鏈接:

主站蜘蛛池模板: 临泉县| 壶关县| 阳西县| 金川县| 渭南市| 轮台县| 仪征市| 宜黄县| 稷山县| 安远县| 奉化市| 佛冈县| 香港 | 台前县| 韩城市| 望都县| 枣强县| 襄汾县| 大新县| 安国市| 曲阜市| 扶余县| 隆尧县| 黄梅县| 赣榆县| 济宁市| 济阳县| 昔阳县| 正蓝旗| 乌拉特前旗| 沁水县| 江源县| 措勤县| 伊川县| 南漳县| 肃宁县| 叙永县| 湘潭市| 汕头市| 达日县| 达日县|