標籤:linux php-fpm lamp
大綱:
1. CGI和fastcgi對比分析
2. 用三台主機以fast-cgi的方式實現lamp並安裝wordpress
3. 對輸出結果的詳解
一、CGI和fastcgi對比分析
lamp 安裝http和php的結合方式可以分為三種:
1.php作為http的模組
2.以cgi模式結合(極少使用)
3.以fastcgi模式結合
CGI 簡介
CGI全稱是“通用閘道介面”(Common Gateway Interface),它可以讓一個用戶端,從網頁瀏覽器向執行在Web伺服器上的程式請求資料。 CGI描述了用戶端和這個程式之間傳輸資料的一種標準。 CGI的一個目的是要獨立於任何語言的,所以CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。 如php,perl,tcl等。
CGI 的運行原理
用戶端訪問某個 URL 地址之後,通過 GET/POST/PUT 等方式提交資料,並通過 HTTP 協議向 Web 服務器發出請求。
伺服器端的 HTTP Daemon(守護進程)啟動一個子進程。然後在子進程中,將 HTTP 要求裡描述的資訊通過標準輸入 stdin 和環境變數傳遞給 URL 指定的 CGI 程式,並啟動此應用程式進行處理,處理結果通過標準輸出 stdout 返回給 HTTP Daemon 子進程。
再由 HTTP Daemon 子進程通過 HTTP 協議返回給用戶端。
上面的這段話理解可能還是比較抽象,下面我們就通過一次 GET 請求為例進行詳細說明。
650) this.width=650;" src="http://www.php-internals.com/images/book/chapt02/02-02-03-cgi.png" alt="圖2.7 CGI 運行原理示舉例" />
,本次請求的流程如下:
用戶端訪問 http://127.0.0.1:9003/cgi-bin/user?id=1
127.0.0.1 上監聽 9003 連接埠的守護進程接受到該請求
通過解析 HTTP 頭資訊,得知是 GET 請求,並且請求的是 /cgi-bin/ 目錄下的 user 檔案。
將 uri 裡的 id=1 通過存入 QUERY_STRING 環境變數。
Web 守護進程 fork 一個子進程,然後在子進程中執行 user 程式,通過環境變數擷取到id。
執行完畢之後,將結果通過標準輸出返回到子進程。
子進程將結果返回給用戶端。
FastCGI 簡介
FastCGI是Web伺服器和處理常式之間通訊的一種協議, 是CGI的一種改進方案,FastCGI像是一個常駐(long-lived)型的CGI, 它可以一直執行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI最為人詬病的fork-and-execute模式)。 正是因為他只是一個通訊協定,它還支援分布式的運算,所以 FastCGI 程式可以在網站伺服器以外的主機上執行,並且可以接受來自其它網站伺服器的請求。
FastCGI 是與語言無關的、可伸縮架構的 CGI 開放擴充,將 CGI 解譯器進程保持在記憶體中,以此獲得較高的效能。 CGI 程式反覆載入是 CGI 效能低下的主要原因,如果 CGI 程式保持在記憶體中並接受 FastCGI 進程管理器調度, 則可以提供良好的效能、伸縮性、Fail-Over 特性等。
650) this.width=650;" src="http://www.php-internals.com/images/book/chapt02/02-02-03-fastcgi-demo.png" alt="圖2.8 FastCGI 運行原理示舉例" style="font-size:16px;font-family:sans-serif;" />
總結:
mode_php 是Apache 的一個模組,把PHP 解譯器嵌入到Apache 進程中。
CGI 和FastCGI 分別是一種協議。Web Server 實現了CGI 或FastCGI 協議的相應的應用程式(以下簡稱CGI 或FastCGI),就可以啟動PHP 解譯器處理PHP 請求。它們都是以獨立進程的形式存在。
mode_php 和FastCGI 在 單個進程中可以處理多個請求,CGI 在單個進程中只能處理一個請求。
php-cgi 是一種CGI 協議的實現。
php-cgi 其實就是PHP 解析器。
在CGI 模式時,當Web Server 收到 xx/index.php 請求時,會啟動php-cgi,php-cgi 會解析php.ini 檔案,初始化環境,然後根據請求參數進行處理,再返回處理後的結果。(都是以CGI 協議規範來進行)
php-cgi 在每個請求時都會啟動一個進程,然後讀取php.ini 進行解析,可想而知效率相對比較低。
php-cgi 無法實現平滑重啟。修改php.ini 配置後,後面啟動的php-cgi 程式還是不會感知。
php-fpm 即FastCGI Process Management,是一種FastCGI 協議的實現。
當請求到來時,php-fpm 啟動並讀取php.ini 檔案完成初始化環境,然後啟動一個master,再啟動多個worker。當請求過來時,master 會傳遞給一個worker,然後等待下一個請求。php-fpm 會動態配置worker 的數量。
一個php-fpm 進程可以處理多個請求,會啟動多個php-cgi 程式。當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閑worker太多時,也會停掉一些,這樣就提高了效能,也節約了資源
php-fpm 可以實現平衡重啟。修改php.ini 後,當啟用新的worker 會使用新的配置。
在實際生產中由於壓力較大,所以amp一般是分別獨立的伺服器,甚至是伺服器組,而且使用的是高可用叢集,以分擔單個伺服器的壓力,同時避免單點故障,所以本次將利用三台主機來類比lamp的工作情境。
1.安裝並啟動服務:
yum install -y php-fpm httpd php-mysql mariadb-server
systemctl start httpd mariadb
mysql_secure_installation
2.配置httpd的虛擬機器主機並支援fpm
<VirtualHost *:80>
ServerName www.magedu.com
DocumentRoot "/vhosts/www"
<Directory "/vhosts/www">
Options None
AllowOverride None
Require all granted
</Directory>
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/www/$1
ProxyPassMatch ^/(ping|status)/?$ fcgi://127.0.0.1:9000/$1
DirectoryIndex index.php
</VirtualHost>
[[email protected] ~]# mkdir /vhosts/www -pv
[[email protected] www]# ls
index.php
[[email protected] www]# cat index.php
<?php
phpinfo();
?>
3.編輯fpm的設定檔:
[[email protected] pma]# vim /etc/php-fpm.d/www.conf
[pool_id]
listen = 127.0.0.1:9000
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
user = apache
group = apache
pm = dynamic
定義processor管理機制:static, dynamic
pm.max_children:最大子進程數量;串連池的最大容量;
pm.start_servers:服務啟動時所啟動的子進程數量;
pm.min_spare_servers
pm.max_spare_servers
rlimit_files = 1024
rlimit_core = 0
pm.status_path = /status
ping.path = /ping
ping.response = pong
php_value[session.save_path] = /var/lib/php/session
session的儲存位置
4.重新啟動httpd和php-fpm服務
5.測試
a在瀏覽器中輸入http://10.1.252.228/status?full 以及http://10.1.252.228/ping 看看是否會響應pong
pool: www
process manager: dynamic
start time: 11/Oct/2016:21:15:46 +0800
start since: 577
accepted conn: 16
listen queue: 0
max listen queue: 1
listen queue len: 128
idle processes: 4
active processes: 3
total processes: 7
max active processes: 3
max children reached: 0
slow requests: 0
b解壓phpmysqladmin到/vhost/www下看是否可以進入
#yum install -y php-mbstring, php-mcrypt, php-xcache
注意:一定要記得建立/var/lib/php/session目錄,並且給apache使用者權限
lamp基礎之lamp(php-fpm)的實現