實戰Nginx與PHP(FastCGI)的安裝、配置與優化

轉載鏈接:http://ixdba.blog.51cto.com/2895551/806622

一、什么是 FastCGI
FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通信的接口。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多腳本語言所支持,其中就有PHP。
FastCGI是從CGI發展改進而來的。傳統CGI接口方式的主要缺點是性能很差,因為每次HTTP服務器遇到動態程序時都需要重新啟動腳本解析器來執行解析,然后結果被返回給HTTP服務器。這在處理高并發訪問時,幾乎是不可用的。另外傳統的CGI接口方式安全性也很差,現在已經很少被使用了。
FastCGI接口方式采用C/S結構,可以將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給瀏覽器。這種方式可以讓HTTP服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。

二、Nginx+FastCGI運行原理
Nginx不支持對外部程序的直接調用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調用。FastCGI接口在Linux下是socket,(這個socket可以是文件socket,也可以是ip socket)。為了調用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用于啟動另一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI接口,wrapper接納到請求,然后派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本并讀取返回數據;接著,wrapper再將返回的數據通過FastCGI接口,沿著固定的socket傳遞給Nginx;最后,Nginx將返回的數據發送給客戶端,這就是Nginx+FastCGI的整個運作過程。詳細的過程,如圖1所示。
?
?

?

圖1 Nginx+FastCGI運行原理

三、spawn-fcgi與PHP-FPM

前面介紹過,FastCGI接口方式在腳本解析服務器上啟動一個或者多個守護進程對動態腳本進行解析,這些進程就是FastCGI進程管理器,或者稱之為FastCGI引擎, spawn-fcgi與PHP-FPM就是支持PHP的兩個FastCGI進程管理器。
下面簡單介紹spawn-fcgi與PHP-FPM的異同。
?

spawn-fcgi是HTTP服務器lighttpd的一部分,目前已經獨立成為一個項目,一般與lighttpd配合使用來支持PHP,但是ligttpd的spwan-fcgi在高并發訪問的時候,會出現內存泄漏甚至自動重啟FastCGI的問題。
?

Nginx是個輕量級的HTTP server,必須借助第三方的FastCGI處理器才可以對PHP進行解析,因此Nginx+spawn-fcgi的組合也可以實現對PHP的解析,這里不過多講述。
?

PHP-FPM也是一個第三方的FastCGI進程管理器,它是作為PHP的一個補丁來開發的,在安裝的時候也需要和PHP源碼一起編譯,也就是說PHP-FPM被編譯到PHP內核中,因此在處理性能方面更加優秀;同時它在處理高并發方面也比spawn-fcgi引擎好很多,因此,推薦Nginx+PHP/PHP-FPM這個組合對PHP進行解析。
?

FastCGI 的主要優點是把動態語言和HTTP Server分離開來,所以Nginx與PHP/PHP-FPM經常被部署在不同的服務器上,以分擔前端Nginx服務器的壓力,使Nginx專一處理靜態請求和轉發動態請求,而PHP/PHP-FPM服務器專一解析PHP動態請求。

四、 PHP與PHP-FPM的安裝及優化

注:php-5.3以上的版本基本都可以用./cofnigure --enable-fpm 來加載,不需要單獨安裝php-fpm。

1.下載安裝包
從www.php.net官方網站下載PHP源碼包,這里下載的是穩定版php-5.2.13.tar.gz。
從http://php-fpm.org/downloads/下載對應的PHP-FPM源碼包,這里下載的是php-5.2.13-fpm-0.5.13.diff.gz。
需要注意,在下載軟件包版本時,盡量使PHP和PHP-FPM版本一致,如果版本之間相差太大,可以會出現兼容問題。

2.配置安裝環境
安裝PHP需要下面軟件包的支持,如果沒有安裝,請自行安裝。

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   

由于各個Linux系統版本的不確定性,讀者也可以在安裝PHP過程中,根據錯誤提示信息,安裝對應的軟件庫。

3.開始編譯安裝PHP和PHP-FPM
編譯安裝PHP和PHP-FPM很簡單,下面是安裝過程:

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

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

4.配置與優化PHP-FPM
PHP的全局配置文件是php.ini,在上面的步驟中,已經將此文件復制到了/usr/local/php/lib/php.ini下。可以根據每個應用需求的不同,對php.ini進行相應的配置。
下面重點介紹PHP-FPM引擎的配置文件。
?

根據上面指定的安裝路徑,PHP-FPM的默認配置文件為/usr/local/php/etc/php-fpm.conf。
php-fpm.conf是一個XML格式的純文本文件,其內容很容易看明白。這里重點介紹幾個重要的配置標簽:
?

標簽listen_address是配置fastcgi進程監聽的IP地址以及端口,默認是127.0.0.1:9000。
<value name="listen_address">127.0.0.1:9000</value>
?

標簽display_errors用來設置是否顯示PHP錯誤信息,默認是0,不顯示錯誤信息,設置為1可以顯示PHP錯誤信息。
<value name="display_errors">0</value>
?

標簽user和group用于設置運行FastCGI進程的用戶和用戶組。需要注意的是,這里指定的用戶和用戶組要和Nginx配置文件中指定的用戶和用戶組一致。
<value name="user">nobody</value>
<value name="group">nobody</value>
?

標簽max_children用于設置FastCGI的進程數。根據官方建議,小于2GB內存的服務器,可以只開啟64個進程,4GB以上內存的服務器可以開啟200個進程。
<value name="max_children">5</value>
?

標簽request_terminate_timeout用于設置FastCGI執行腳本的時間。默認是0s,也就是無限執行下去,可以根據情況對其進行修改。
<value name="request_terminate_timeout">0s</value>
?

標簽rlimit_files用于設置PHP-FPM對打開文件描述符的限制,默認值為1024。這個標簽的值必須和Linux內核打開文件數關聯起來,例如要將此值設置為65535,就必須在Linux命令行執行'ulimit -HSn 65536'。
<value name="rlimit_files">1024</value>
?

標簽max_requests指明了每個children最多處理多少個請求后便會被關閉,默認的設置是500。
<value name="max_requests">500</value>
?

標簽allowed_clients用于設置允許訪問FastCGI進程解析器的IP地址。如果不在這里指定IP地址,Nginx轉發過來的PHP解析請求將無法被接受。
<value name="allowed_clients">127.0.0.1</value>

5.管理FastCGI進程
在配置完php-fpm后,就可以啟動FastCGI進程了。啟動fastcgi進程有兩種方式:

    /usr/local/php/bin/php-cgi --fpm   或者  /usr/local/php/sbin/php-fpm  start  

建議采用第二種方式啟動FastCGI進程。
?/usr/local/php/sbin/php-fpm還有其他參數,具體為start|stop|quit|restart|reload|logrotate。
每個啟動參數的含義如下:

    start,啟動PHP的FastCGI進程。  stop,強制終止PHP的FastCGI進程。  quit,平滑終止PHP的FastCGI進程。  restart, 重啟PHP的FastCGI進程。  reload, 重新加載PHP的php.ini。  logrotate, 重新啟用log文件。  

reload是個很重要的參數,它可以在PHP的FastCGI進程不中斷的情況下重新加載改動過的php.ini,因此通過php-fpm可以平滑變更FastCGI模式下的PHP設置。


在FastCGI進程啟動后,其監聽的IP地址和端口也隨即啟動,可以通過ps和netstat查看相關信息。

     [root@localhost php]# netstat -antl|grep 9000  tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN    [root@localhost php]# 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來支持PHP
Nginx的安裝特別簡單,前面已經對此進行了詳細介紹,這里不再進行講述。下面重點介紹Nginx如何通過php-fpm的FastCGI進程對PHP進行解析處理。
由于Nginx本身不會對PHP進行解析,因此要實現Nginx對PHP的支持,其實是將對PHP頁面的請求交給fastCGI進程監聽的IP地址及端口。如果把php-fpm當做動態應用服務器,那么Nginx其實就是一個反向代理服務器。Nginx通過反向代理功能實現對PHP的解析,這就是Nginx實現PHP動態解析的原理。
這里假定Nginx的安裝目錄為/usr/local,則Nginx配置文件的路徑為/usr/local/nginx/conf/nginx.conf。下面是在Nginx下支持PHP解析的一個虛擬主機配置實例。

 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;  }  
}  


通過location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來處理,而這里的IP地址和端口就是FastCGI進程監聽的IP地址和端口。
fastcgi_param指令指定放置PHP動態程序的主目錄,也就是$fastcgi_script_name前面指定的路徑,這里是/usr/local/nginx/html目錄,建議將這個目錄與Nginx虛擬主機指定的根目錄保持一致,當然也可以不一致。
fastcgi_params文件是FastCGI進程的一個參數配置文件,在安裝Nginx后,會默認生成一個這樣的文件,這里通過include指令將FastCGI參數配置文件包含了進來。
接下來,啟動nginx服務。
/usr/local/nginx/sbin/nginx
到此為止,Nginx+PHP已經配置完成。

六、測試Nginx對PHP的解析功能
這里在/usr/local/nginx/html目錄下創建一個phpinfo.php文件,內容如下:
<?php phpinfo(); ?>
然后通過瀏覽器訪問http://www.ixdba.net/index.html,默認會在瀏覽器顯示“Welcome to Nginx!”表示Nginx正常運行。
接著在瀏覽器中訪問http://www.ixdba.net/phpinfo.php,如果PHP能夠正常解析,會出現PHP安裝配置以及功能列表統計信息。

七、實例講解Nginx中FastCGI參數的優化
在配置完成Nginx+FastCGI之后,為了保證Nginx下PHP環境的高速穩定運行,需要添加一些FastCGI優化指令。下面給出一個優化實例,將下面代碼添加到Nginx主配置文件中的HTTP層級。

    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;     

下面是對上述代碼的含義進行介紹。
第一行代碼是為FastCGI緩存指定一個文件路徑、目錄結構等級、關鍵字區域存儲時間和非活動刪除時間。
fastcgi_connect_timeout指定連接到后端FastCGI的超時時間。
fastcgi_send_timeout指定向FastCGI傳送請求的超時時間,這個值是已經完成兩次握手后向FastCGI傳送請求的超時時間。
fastcgi_read_timeout指定接收FastCGI應答的超時時間,這個值是已經完成兩次握手后接收FastCGI應答的超時時間。

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

fastcgi_buffers指定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答請求。如果一個PHP腳本所產生的頁面大小為256KB,那么會為其分配4個64KB的緩沖區來緩存;如果頁面大小大于256KB,那么大于256KB的部分會緩存到fastcgi_temp指定的路徑中,但是這并不是好方法,因為內存中的數據處理速度要快于硬盤。一般這個值應該為站點中PHP腳本所產生的頁面大小的中間值,如果站點大部分腳本所產生的頁面大小為256KB,那么可以把這個值設置為“16 16k”、“4 64k”等。

fastcgi_busy_buffers_size的默認值是fastcgi_buffers的兩倍。

fastcgi_temp_file_write_size表示在寫入緩存文件時使用多大的數據塊,默認值是fastcgi_buffers的兩倍。

fastcgi_cache表示開啟FastCGI緩存并為其指定一個名稱。開啟緩存非常有用,可以有效降低CPU的負載,并且防止502錯誤的發生,但是開啟緩存也會引起很多問題,要視具體情況而定。
fastcgi_cache_valid、fastcgi用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一個小時,將301應答緩存1天,其他應答均緩存1分鐘。
?

本文出自 “技術成就夢想” 博客,請務必保留此出處http://ixdba.blog.51cto.com/2895551/806622


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276396.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python在運維自動化的前景_現在學運維自動化python和大數據?

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":7,"count":7}]},"card":[{"des":"阿里云實時計算(Alibaba Cloud Realtime Com…

BOM算最尾階的損耗率 成品直接到料件

假設由B生產為A經過3道工序,各工序的損耗率分別為 C1,C2,C3; 由D生產為B經過1道工序,作業損耗率為C4. 請問在BOM中建立材料的損耗率應該是怎樣的呀? 我的理解是這樣:A的產出B的投入(1-C1)(1-C2)(1-C3)所以B的投入A的產出/(1-C1)(1-C2)(1-C3)所以建A的BOM時,材料B的損耗率為: …

10個前端8個用Vue的,怎么才能在面試中出彩?

大家好&#xff0c;我是若川。現在但凡出去面試&#xff0c;面試官幾乎必問 Vue3.0 。不僅會問一些核心特性&#xff0c;還會問原理層面的問題。比如&#xff1a;?框架層面問題&#xff1a;Vue3.0 新特性 Composition API 與 React.js 中 Hooks 的異同點&#xff1f;?源碼、原…

ASP.NET MVC學習之(5):Html.ActionLink

本文整理了該方法的幾種重載形式&#xff1a; 一 Html.ActionLink("linkText","actionName") 該重載的第一個參數是該鏈接要顯示的文字&#xff0c;第二個參數是對應的控制器的方法&#xff0c;默認控制器為當前頁面的控制器&#xff0c;如果當前頁面的控制…

python qq模塊_常用的Python模塊

目錄1、使用copy模塊來復制>>> class Animal:def _init_(self, species, number_of_legs, color):self.species speciesself.number_of_legs number_of_legsself.color color>>> harry Animal()>>> harry._init_(hippogriff, 6, pink)>>&…

故鄉 | 登高望遠,夜幕降臨

歡迎星標我的公眾號若川視野&#xff0c;回復加群&#xff0c;長期交流學習上周末看了幾集豆瓣評分8.5分劉同同名小說的青春劇《我在未來等你》&#xff0c;讓我回想起自己的高中生活。也想起小時候經常爬到故鄉附近的小山&#xff0c;看夕陽西下。時常和同事開玩笑說&#xff…

CentOS5安裝Nginx1.4+PHP5.5 FastCGI

轉載鏈接&#xff1a;http://blog.csdn.net/staricqxyz/article/details/17012329 yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2…

FTP服務器的搭建

IIS IIS所提供的FTP功能比較簡單&#xff1a; 用戶依賴于“操作系統用戶”&#xff1b;只提供了全局讀&#xff08;瀏覽和復制&#xff09;、寫&#xff08;刪除、修改、添加&#xff09;功能設置&#xff0c;也就是說所有的讀寫權限都相同&#xff1b;“用戶”與“對應目錄”的…

一份熱乎乎的滴滴前端面經

關注若川視野&#xff0c;回復"pdf" 領取資料&#xff0c;回復"加群"&#xff0c;可加群長期交流學習滴滴前端實習面經滴滴是我投簡歷之后第二家面試的公司&#xff0c; 國慶節前兩三天投的簡歷&#xff0c; 國慶后復工第一天就給我打了電話約一面。那時候…

用webBrowser取源文件取不到的點擊數--選秀榜selectop.com網站內容管理系統之六

用idhttp可以取到源文件&#xff0c;但網站用腳本代碼&#xff0c;源文件是看不到&#xff0c;并且代碼的結果也取不出。webBrowser可以多次返回下載到的內容&#xff0c;不包括任何html語法&#xff0c;這個當中就有文章的點擊數。在WebBrowser1DownloadComplete事件中處理&am…

Nginx負載均衡配置

轉載鏈接&#xff1a;http://blog.csdn.net/staricqxyz/article/details/16984029 將域名指向Nginx服務器 訪問www.test.com會轉發到192.168.1.22,192.168.1.23 user nobody nobody; worker_processes 1; events { worker_connections 1024; } http { …

linux查看python環境變量_Linux中添加PYTHONPATH配置anaconda環境變量方法

因為最近開發多智能體模型需要把自己寫的環境打包import&#xff0c;環境是統一的&#xff0c;如果不加入環境變量&#xff0c;每次測一個算法都要把包作為附屬腳本和算法腳本放一起非常麻煩。所以就想把這些寫的環境加入到python的環境變量里&#xff0c;這樣就不用每次測試都…

yii_wiki_145_yii-cjuidialog-for-create-new-model (通過CJuiDialog來創建新的Model)

/**** CJuiDialog for create new model http://www.yiiframework.com/wiki/145/cjuidialog-for-create-new-model/translated by php攻城師http://blog.csdn.net/phpgcsIntroduction Scenario Preparation of the form Enhance the action create The dialog Summary ***/Intr…

真誠推薦幾個最值得關注的前端公眾號

前端技術日新月異&#xff0c;發展迅速&#xff0c;作為一個與時俱進的前端工程師&#xff0c;需要不斷的學習。這里強烈推薦幾個前端開發工程師必備的優質公眾號&#xff0c;希望對你有所幫助。大家可以像我一樣&#xff0c;利用碎片時間閱讀這些公眾號的文章。code秘密花園一…

Silverlight Unit Test Framework

微軟在08年的時候推出了一個Silverlight的單元測試框架&#xff0c;該框架在Mix 08的時候與Silverlight controls同時推出的&#xff0c;微軟工程師Jeff Wilcox一直參與維護該單元測試框架。Scott Gu對這個框架的介紹Jeff Wilcox提供的視頻介紹該框架的源代碼已經包括在Silverl…

Nginx 反向代理、負載均衡、頁面緩存、URL重寫及讀寫分離詳解

轉載鏈接&#xff1a;http://freeloda.blog.51cto.com/2033581/1288553 大綱 一、前言 二、環境準備 三、安裝與配置Nginx 四、Nginx之反向代理 五、Nginx之負載均衡 六、Nginx之頁面緩存 七、Nginx之URL重寫 八、Nginx之讀寫分離 注&#xff0c;操作系統為 CentOS 6.4 x86_64…

[Jobdu] 題目1499:項目安排

題目描述&#xff1a;小明每天都在開源社區上做項目&#xff0c;假設每天他都有很多項目可以選&#xff0c;其中每個項目都有一個開始時間和截止時間&#xff0c;假設做完每個項目后&#xff0c;拿到報酬都是不同的。由于小明馬上就要碩士畢業了&#xff0c;面臨著買房、買車、…

How to: Display a Gradient Fill

To display a gradient fill 第一步&#xff1a;In Visual Studio, create a Smart Device project. 第二部&#xff1a;Add the Gradientfill and GradientFilledButton classes to your project. public sealed class GradientFill{ // This method wraps the …

能在任意一種框架中復用的組件,太牛了!

Web Component 是一種 W3C標準支持的組件化方案&#xff0c;通過它可以編寫可復用的組件&#xff0c;同時也可以對自己的組件做更精細化的控制。更牛的是&#xff0c;Web Component 可以在任何一種框架中使用&#xff0c;不用加載任何模塊、代碼量小&#xff0c;優勢非常明顯&a…

stm32cubemx中文_用 STM32 通用定時器做微秒延時函數(STM32CubeMX版本)

概述? 在使用 DHT11 的時候&#xff0c;時序通信需要微秒來操作&#xff0c;STM32CubeMX 自帶一個系統時鐘&#xff0c;但是實現的是毫秒級別的。因此就自己用通用計時器實現一個。文章目錄環境&#xff1a;開發板&#xff1a;STM32F4探索者&#xff08;正點原子&#xff09;1…