php與nginx整合
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動態請求
#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的整個運作過程。
php與nginx整合
php.ini:php的主配置文件
[root@server79 php-5.4.12]# cp php.ini-production /usr/local/lnmp/php/etc/php.ini
拷貝php的啟動腳本
[root@server79 fpm]# pwd /root/php-5.4.12/sapi/fpm [root@server79 fpm]# cp init.d.php-fpm /etc/init.d/php-fpm
給啟動腳本加可執行權限
[root@server79 fpm]# chmod +x /etc/init.d/php-fpm [root@server79 ~]# vim /usr/local/lnmp/php/etc/php.ini cgi.fix_pathinfo=0 date.timezone = /Asia/Shanghai [root@server79 ~]# cp /usr/local/lnmp/php/etc/php-fpm.conf.default /usr/local/lnmp/php/etc/php-fpm.conf [root@server79 etc]# vim php-fpm.conf
打開注釋pid = run/php-fpm.pid
php-fpm.conf文件參數解析
PHP的全局配置文件是php.ini,在上面的步驟中,已經將此文件復制到了/usr/local/lnmp/php/etc/php.ini下。可以根據每個應用需求的不同,對php.ini進行相應的配置。
下面重點介紹PHP-FPM引擎的配置文件。
根據上面指定的安裝路徑,PHP-FPM的默認配置文件為/usr/local/lnmp/php/etc/php-fpm.conf。
php-fpm.conf是一個XML格式的純文本文件,其內容很容易看明白。這裡重點介紹幾個重要的配置標簽:
標簽listen_address是配置fastcgi進程監聽的IP地址以及端口,默認是127.0.0.1:9000。
listen = 127.0.0.1:9000
標簽user和group用於設置運行FastCGI進程的用戶和用戶組。需要注意的是,這裡指定的用戶和用戶組要和Nginx配置文件中指定的用戶和用戶組一致。
user = nginx group = nginx
標簽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。
pm.max_requests = 500
標簽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。
每個啟動參數的含義如下:
[root@server79 etc]# /etc/init.d/php-fpm start
配置nginx的主配置文件,打開與php的接口
[root@server79 conf]# pwd /usr/local/lnmp/nginx/conf [root@server79 conf]# vim nginx.conf user nginx; # location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; //本地9000端口 fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi.conf; } [root@server79 conf]# nginx -t^C [root@server79 conf]# nginx -s reload^C [root@server79 html]# pwd /usr/local/lnmp/nginx/html [root@server79 html]# cat index.php <?php phpinfo()?>
測試:浏覽器中輸入192.168.0.179/index.php,出現php頁面
PHP解析Nginx日志
nginx日志格式
access_log日志格式
log_format main '$server_name$remote_addr$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"';
日志參數
server_name : 虛擬主機的主機名稱
remote_addr : 遠程客戶端的ip地址
remote_user : 遠程客戶端用戶名稱
time_local : 訪問的時間與時區
status : 記錄請求返回的http狀態碼
body_bytes_sent : 發送給客戶端的文件主體內容的大小
http_referer : 從哪個頁面鏈接訪問過來
http_user_agent : 客戶端浏覽器信息
http_x_forwarded_for : 客戶端的真實ip
日志分割符
使用特殊的不可打印字符^A(ctrl+v,ctrl+a)作為日志分割符
根據關鍵字過濾文件內容
需求
根據http的請求裡是否有“weibo”這個關鍵字提取文件的內容
php代碼
/** * Description:按行讀取文件內容進行過濾匹配 * * @return array */ function readFileContent ($filename) { $weibo_content = array(); $fh = @fopen($filename, 'r'); if ($fh) { while (! feof($fh)) { $row = fgets($fh, 4096); $row_arr = explode("", $row); if (isset($row_arr[3]) && preg_match('/weibo/', $row_arr[3])) { $weibo_content[] = $row_arr; } } } fclose($fh); return $weibo_content; }