A. 如何啟用 Apache 的 php-FPM 多實例
我覺得第一步要先安裝 Epel 倉庫步驟 2:安裝 nDeploy RPM 倉庫,這是此次安裝中最為 重要的步驟。步驟 3:使用 yum 從 nDeploy 倉庫安裝 nDeploy 和 Nginx 插件。步驟 4:啟用/配置 Nginx 為反向代理。
完成這些步驟後,下面為伺服器中所有可用 PHP 版本安裝 PHP-FPM 包,EA3 使用 remi 倉庫來安裝這些包。可以運行這個 nDeploy 腳本來下載所有的包。如果還有不明白的話,你可以在後盾人看看視頻找找答案,有空多看看時間長了,慢慢就明白了,希望能幫到你,給個採納吧謝謝٩(๑òωó๑)۶
B. linux系統下PHP-FPM的安裝和配置教程
基本安裝方法
安裝工具包
$
sudo
apt-get
install
python-software-properties
添加ppa源
$
sudo
add-apt-repository
ppa:yola/php5
安裝php5-fpm
sudo
apt-get
update
sudo
apt-get
install
php5-fpm
其它必要的軟體安裝接
sudo
apt-get
install
nginx
配置php-fpm
php-fpm的解析器是C/S結構,它的配置文件位於:
(1)/etc/php5/fpm/php-fpm.conf
(2)/etc/php5/fpm/pool.d/
一般沒什麼嚴格的配置的要求,或者說這塊我還沒有具體的研究每個配置參數的意義
我採用了tcp模式與fastcgi進程進行連接,因此我修改了tcp監聽的地址和埠,修改了一下監視目錄的名稱,這里不做具體詳細解釋了,大家可以參考官方文檔根據自己的需求進行配置
重啟php5-fpm
安裝提示錯誤解決
如果伺服器的系統源中沒有php5-fpm,安裝的時候會提示:
Reading
state
information...
Done
E:
Couldn't
find
package
php5-fpm
解決辦法
1.
添加非官方的源到
/etc/apt/sources.list
echo
"deb
http://ppa.launchpad.net/brianmercer/php/ubuntu
lucid
main"
>>
/etc/apt/sources.list
echo
"deb-src
http://ppa.launchpad.net/brianmercer/php/ubuntu
lucid
main"
>>
/etc/apt/sources.list
2.
安裝php5-fpm
sudo
apt-get
update
&&
sudo
apt-get
install
php5-fpm
3.
安裝php擴展組件
sudo
apt-get
install
php-apc
php5-curl
php5-gd
php5-imagick
php5-mysql\
php5-memcache
php5-memcached
php5-mcrypt
4.
啟動php-fpm
sudo
/etc/init.d/php5-fpm
start
php.in位於/etc/php5/fpm/php.ini
php-fpm.ini位於/etc/php5/fpm/php5-fpm.conf
php-fpm啟動時報錯
PHP
Warning:
PHP
Startup:
Unable
to
load
dynamic
library
'/usr/lib/php5/20060613+lfs/gd.so'
-
/usr/lib/php5/20060613+lfs/gd.so:
undefined
symbol:
gdImageCreateFromJpeg
in
Unknown
on
line
0
locate
libgd
查看gd的動態庫位置,如果/usr/local/lib/目錄里有則
rm
/usr/local/lib/libgd*
重啟php-fpm即可
去掉php-fpm啟動時警告提示信息
PHP
Deprecated:
Comments
starting
with
'#'
are
deprecated
in
/etc/php5/fpm/conf.d/imagick.ini
on
line
1
in
Unknown
on
line
0
把#變成;即可去掉該提示
C. rpm包安裝的php,php-fpm.conf在哪
具體位置放在:打開 /usr/local/php/etc/php-fpm.conf 文件
把max_children由之前的10改為現在的30,這樣就可以保證 有充足的php-cgi進程可以被使用;
把request_terminate_timeout由之前的0s改為60s,這樣php-cgi進程 處理腳本的超時時間就是60秒,可以防止進程都被掛起,提高利用效率。
D. php-fpm的工作機制
概括來說,fpm 的實現就是創建一個 master 進程,在 master 進程中創建並監聽 socket,然後 fork 出多個子進程,這些子進程各自 accept 請求,子進程的處理非常簡單,它在啟動後阻塞在 accept 上,有請求到達後開始讀取請求數據,讀取完成後開始處理然後再返回,在這期間是不會接收其它請求的,也就是說 fpm 的子進程同時只能響應一個請求,只有把這個請求處理完成後才會 accept 下一個請求,這一點與 nginx 的事件驅動有很大的區別,nginx 的子進程通過 epoll 管理套接字,如果一個請求數據還未發送完成則會處理下一個請求,即一個進程會同時連接多個請求,它是非阻塞的模型,只處理活躍的套接字。
fpm 的 master 進程與 worker 進程之間不會直接進行通信,master 通過共享內存獲取 worker 進程的信息,比如 worker 進程當前狀態、已處理請求數等,當 master 進程要殺掉一個 worker 進程時則通過發送信號的方式通知 worker 進程。
fpm 可以同時監聽多個埠,每個埠對應一個 worker pool,而每個 pool 下對應多個 worker 進程,類似 nginx 中 server 概念。
在 php-fpm.conf 中通過[pool name]聲明一個 worker pool:
啟動 fpm 後查看進程:
具體實現上 worker pool 通過fpm_worker_pool_s這個結構表示,多個 worker pool 組成一個單鏈表
接下來看下 fpm 的啟動流程,從main()函數開始:
fpm_init()主要有以下幾個關鍵操作:
(1) fpm_conf_init_main():
解析 php-fpm.conf 配置文件,分配 worker pool 內存結構並保存到全局變數中:fpm_worker_all_pools,各 worker pool 配置解析到fpm_worker_pool_s->config中。
(2)fpm_scoreboard_init_main():
分配用於記錄 worker 進程運行信息的共享內存,按照 worker pool 的最大 worker 進程數分配,每個 worker pool 分配一個fpm_scoreboard_s結構,pool 下對應的每個 worker 進程分配一個fpm_scoreboard_proc_s結構。
(3)fpm_signals_init_main():
這里會通過socketpair()創建一個管道,這個管道並不是用於 master 與 worker 進程通信的,它只在 master 進程中使用,具體用途在稍後介紹 event 事件處理時再作說明。另外設置 master 的信號處理 handler,當 master 收到 SIGTERM、SIGINT、SIGUSR1、SIGUSR2、SIGCHLD、SIGQUIT 這些信號時將調用sig_handler()處理:
(4)fpm_sockets_init_main()
創建每個 worker pool 的 socket 套接字。
(5)fpm_event_init_main():
啟動 master 的事件管理,fpm 實現了一個事件管理器用於管理 IO、定時事件,其中 IO 事件通過 kqueue、epoll、poll、select 等管理,定時事件就是定時器,一定時間後觸發某個事件。
在fpm_init()初始化完成後接下來就是最關鍵的fpm_run()操作了,此環節將 fork 子進程,啟動進程管理器,另外 master 進程將不會再返回,只有各 worker 進程會返回,也就是說fpm_run()之後的操作均是 worker 進程的。
在 fork 後 worker 進程返回了監聽的套接字繼續 main() 後面的處理,而 master 將永遠阻塞在fpm_event_loop(),接下來分別介紹 master、worker 進程的後續操作。
fpm_run()執行後將 fork 出 worker 進程,worker 進程返回main()中繼續向下執行,後面的流程就是 worker 進程不斷 accept 請求,然後執行 PHP 腳本並返回。整體流程如下:
worker 進程一次請求的處理被劃分為 5 個階段:
worker 處理到各個階段時將會把當前階段更新到fpm_scoreboard_proc_s->request_stage,master 進程正是通過這個標識判斷 worker 進程是否空閑的。
接下來我們來看下 master 是如何管理 worker 進程的,首先介紹下三種不同的進程管理方式:
前面介紹到在fpm_run()中 master 進程將進入fpm_event_loop():
這就是 master 整體的處理,其進程管理主要依賴注冊的幾個事件,接下來我們詳細分析下這幾個事件的功能。
(1)sp[1]管道可讀事件:
在 fpm_init() 階段 master 曾創建了一個全雙工的管道:sp,然後在這里創建了一個 sp[0] 可讀的事件,當 sp[0] 可讀時將交由 fpm_got_signal() 處理,向 sp[1] 寫數據時 sp[0] 才會可讀,那麼什麼時機會向 sp[1] 寫數據呢?前面已經提到了:當 master 收到注冊的那幾種信號時會寫入 sp[1] 端,這個時候將觸發 sp[0] 可讀事件。
這個事件是 master 用於處理信號的,我們根據 master 注冊的信號逐個看下不同用途:
具體處理邏輯在 fpm_got_signal() 函數中,這里不再羅列。
(2)fpm_pctl_perform_idle_server_maintenance_heartbeat():
這是進程管理實現的主要事件,master 啟動了一個定時器,每隔 1s 觸發一次,主要用於 dynamic、ondemand 模式下的 worker 管理,master 會定時檢查各 worker pool 的 worker 進程數,通過此定時器實現 worker 數量的控制,處理邏輯如下:
(3)fpm_pctl_heartbeat():
這個事件是用於限制 worker 處理單個請求最大耗時的,php-fpm.conf 中有一個request_terminate_timeout的配置項,如果 worker 處理一個請求的總時長超過了這個值那麼 master 將會向此 worker 進程發送kill -TERM信號殺掉 worker 進程,此配置單位為秒,默認值為 0 表示關閉此機制,另外 fpm 列印的 slow log 也是在這里完成的。
除了上面這幾個事件外還有一個沒有提到,那就是 ondemand 模式下 master 監聽的新請求到達的事件,因為 ondemand 模式下 fpm 啟動時是不會預創建 worker 的,有請求時才會生成子進程,所以請求到達時需要通知 master 進程,這個事件是在fpm_children_create_initial()時注冊的,事件處理函數為fpm_pctl_on_socket_accept(),具體邏輯這里不再展開,比較容易理解。
原文出處: https://www.fanhao.com/2017/10/internal-php-fpm.html
E. 如何在CentOS 6上通過YUM安裝Nginx和PHP-FPM
在CentOS 6上通過YUM安裝Nginx和PHP-FPM:
第一步,在/etc/yum.repos.d/目錄下創建一個源配置文件nginx.repo:
cd /etc/yum.repos.d/
vim nginx.repo
填寫如下內容:
[nginx]
name=nginx repo
baseurl=nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
保存,則會產生一個/etc/yum.repos.d/nginx.repo文件。
下面直接執行如下指令即可自動安裝好Nginx:
yum install nginx -y
安裝完成,下面直接就可以啟動Nginx了:
/etc/init.d/nginx start
現在Nginx已經啟動了,直接訪問伺服器就能看到Nginx歡迎頁面了的。我還是推薦你去後盾人上面看看裡面有很多關於這類php之類的教學講解視頻哦⊙∀⊙!
F. 如何在CentOS 6上通過YUM安裝Nginx和PHP-FPM
開始安裝Nginx和PHP-FPM之前,你必須卸載系統中以前安裝的Apache和PHP。用root登錄輸入下面的命令:
#yumremovehttpd*php*
增加額外資源庫
默認情況下,CentOS的官方資源是沒有php-fpm的, 但我們可以從Remi的RPM資源中獲得,它依賴於EPEL資源。我們可以這樣增加兩個資源庫:
#yuminstallyum-priorities-y
#rpm-Uvhhttp://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
#rpm-Uvhhttp://rpms.famillecollet.com/enterprise/remi-release-6.rpm
輸出樣例
Retrievinghttp://download.fedora.redhat.com/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
warning:/var/tmp/rpm-tmp.00kiDx:HeaderV3RSA/SHA256Signature,keyID0608b895:NOKEY
Preparing...###########################################[100%]
1:epel-release###########################################[100%]
安裝Nginx
輸入下列命令
#yuminstallnginx
輸出樣例
DependenciesResolved
================================================================================
================================================================================
Installing:
nginxx86_640.8.54-1.el6epel358k
Installingfordependencies:
GeoIPx86_641.4.8-1.el6epel620k
fontconfigx86_642.8.0-3.el6base186k
freetypex86_642.3.11-6.el6_1.8updates358k
gdx86_642.0.35-10.el6base142k
libX11x86_641.3-2.el6base582k
libX11-commonnoarch1.3-2.el6base188k
libXaux86_641.0.5-1.el6base22k
libXpmx86_643.5.8-2.el6base59k
libjpegx86_646b-46.el6base134k
libpngx86_642:1.2.46-1.el6_1base180k
libxcbx86_641.5-1.el6base100k
libxsltx86_641.1.26-2.el6base450k
perlx86_644:5.10.1-119.el6_1.1base10M
perl-Mole-Pluggablex86_641:3.90-119.el6_1.1base37k
perl-Pod-Escapesx86_641:1.04-119.el6_1.1base30k
perl-Pod-Simplex86_641:3.13-119.el6_1.1base209k
perl-libsx86_644:5.10.1-119.el6_1.1base575k
perl-versionx86_643:0.77-119.el6_1.1base49k
TransactionSummary
================================================================================
Install19Package(s)
Upgrade0Package(s)
Totaldownloadsize:14M
Installedsize:47M
Isthisok[y/N]:y
如果你想在系統啟動時自動運行nginx,輸入下列命令
#chkconfig--level345nginxon
G. 伺服器程序源代碼分析之二:php-fpm
php作為排名top2 互聯網開發工具,非常流行,可以參考:中國最大的25個網站採用技術選型方案
php這個名稱實際上有兩層含義
直接定義:
php-fpm從php5.3.3開始已經進入到php源代碼包,之前是作為patch存在的
很少人會去讀php本身源代碼,我6年前解決php內存泄露問題的時候做了些研究,最近再查看了一番,發現php的開發者很有誠意,這是一款非常出色的伺服器軟體,支持如下
在linux伺服器上,如果不設置 events.mechanism ,那麼默認就是採用epoll,所以
php-fpm的IO模型&並發處理能力和nginx是完全一致
nginx以性能卓越聞名,大部分程序員都認為php效率低下,看了源代碼,才知道這是傳奇啊
在高性能部署的時候,大家往往會針對性的優化nginx 。我自己之前部署php程序也犯了錯誤,8G內存的server,php-fpm的max children都會設置128+,現在看來太多了,參考nginx的部署:
php-fpm配置為 3倍 cpu core number就可以了
php-fpm穩定性比nginx稍差 這是因為php-fpm內置了一個php解析器,php-fpm進程就和php程序捆綁了,如果php腳本寫得不好,有死循環或者阻塞在某個遠端資源上,會拖累載入它的php-fpm進程
而nginx和後端應用伺服器之間通過網路連接,可以設置timeout,不容易堵死的
php-fpm的fastcgi是短連接 我原以為是長連接的,看了代碼才知道也是短連接,處理一個request就關閉掉
php-fpm介面採用fastcgi 非常遺憾,php-fpm和fastcgi完全綁定了,無法獨立使用 。只能部署在支持http-fcgi協議轉換程序背後(nginx)。其實可以考慮在php-fpm代碼包裡面引入http協議支持,這樣php-fpm可以獨立運行,讓nodejs無話可說
php-fpm等同於OpenResty OpenResty是一個國人開發的nginx模塊,就是在nginx引入lua解釋器. 實際上,它和php-fpm的唯一差別就是一個採用php語法,一個用lua,所以OpenResty要作為nginx增強包使用還可以,要選擇它作為一個主要編程工具,沒有任何必要
從架構上來說,php-fpm已經做到最好,超過大多數 python部署工具,我再也不黑它了
H. 了解PHP-FPM
在伺服器上,當我們查看php進程時,全都是php-fpm進程,大家都知道這個就是php的運行環境,那麼,它到底是個什麼東西呢?
PHP-FPM,就是PHP的FastCGI管理器,用於替換PHP FastCGI的大部分附加功能,在PHP5.3.3後已經成為了PHP的標配。
有小夥伴要問了,FastCGI又是什麼鬼?CGI程序又叫做「通用網關介面」,就是讓Web伺服器和你的應用程序進行交互的一個介面。就像nginx中需要配置的fastcgi_pass,一般我們會使用127.0.0.1:9000或者unix:/tmp/php-cgi.sock來配置這個參數。它的意思就是告訴nginx,過來的請求使用tcp:9000埠的監聽程序來處理或者使用unix/socket來處理。它們都是指向的PHP運行程序。
再說得通俗一點,我們運行php腳本用的是
php-fpm就相當於是這個php命令。nginx通過fastcgi_pass來運行php $nginx_root(nginx配置文件中網站根目錄root配置)下的index.php。所以,如果你用的是python或者其他什麼語言,都可以用它們的cgi程序來讓nginx調用。
FastCGI和CGI又有什麼不同呢?FastCGI是啟動一個socket介面,伺服器應用不需要自己去運行php,只需要向這個socket介面提交請求就可以了。
php-fpm在編譯php時需要添加--enable-fpm。一些通用的集成安裝包如lnmp、phpStudy等都會默認編譯並使用php-fpm,畢竟是標配。
上文中說過nginx可以使用127.0.0.1:9000和unix:/tmp/php-cgi.sock這兩種方式來調用php-fpm。它們有什麼區別呢?
前者,一般帶9000埠號的,是tcp形式的調用。也就是php-fpm啟動了一個監聽進程對9000埠進行監聽。它會調起一個tcp/ip服務,nginx在調用的時候會走一次tcp請求流程,也就是3次握手4次揮手,會走到網路七層中的第四層傳輸層。相對來說這種方式性能會稍差一點,啟動php-fpm後使用nestat查看埠中會出現9000埠的佔用。
後者,使用的是unix套接字socket服務,通過sock文件來交換信息,性能相對好一些,因為它沒有tcp連接過程,也不會有9000埠的佔用。
對於高負載大訪問量的網站還是推薦使用unix方式,對於普通小網站來說,無所謂使用哪個都可以,tcp方式反而更容易配置和理解,也是php-fpm.conf中默認的監聽方式。
php-fpm.conf配置中的listen屬性用來配置監聽,這里的配置要和nginx中的一致,使用tcp的就監聽127.0.0.1:9000,使用unix的就設置成/tmp/php-cgi-56.sock。
以下內容摘自官方文檔:
===========
各自媒體平台均可搜索【硬核項目經理】