CGI:通信網關協議
- CGI協議:動態語言的代碼文件需要對應的語言解釋器才能被服務器識別,CGI協議就是用來使得解釋器與服務器之間互相通信
請求鏈路:
1、客戶端輸入ur
2、解析到服務器IP
3、請求發送到Web服務器(nginx)
4、Nginx收到請求,通過fast-cgi協議,將請求數據發送到php-fpm進程管理器
5、php-fpm進程管理器將任務發給子進程:fork的子worke進程
6、work進程中的php解釋器執行php文件來處理請求
7、php解釋器處理好之後再通過fast-cgi協議將處理結果發給Nginx服務器
8、Nginx將結果返回到客戶端
-
cgi:
- 每次來一個請求,都需要fork一個子進程,請求結束後,再kill掉子進程
-
fast-cgi:
- fast-cgi,請求結束後,不會kill掉子進程,而是還可以繼續處理後續的請求
-
php-fmp:
- Fast-cgi進程管理器,包含2種進程
- master進程:主進程,負責監聽端口,接收請求
- worker進程:內部有php解釋器,負責執行php代碼
-
更新php.ini後,無法平滑重啓,需要更新php-fpm,worker進程纔可生效
-
cgi和fast-cgi的區別:
- cgi:每次新的請求,fork一個子進程,結束後kill掉
- 每次新fork子進程,都要重新讀取php.ini,初始化環境
- fast-fgi:先啓動一部分worker進程,處理請求後不會立即kill,而是可以等待繼續處理後續的請求
- worker進程不會kill掉,就無需重新讀取php.ini和初始化環境
- 當worker進程不夠時,可先fork一些worker,如果空閒worker較多時,可kill掉一些節省資源
- cgi:每次新的請求,fork一個子進程,結束後kill掉
Nginx與php-fpm通信:Nginx和php-fpm之間,2種通信方式
-
TCP socket:通過 IP:port的方式進行通信
- 這種方式,可以將nginx和php-fpm分佈在不同的服務器上
-
Unix socket:通過 php啓動生成的socket文件進行通信
- 這種通過方式,nginx和php-fpm就只能部署在一臺機器上
-
優缺點:
- tcp socket:需要重新打包、拆包、計算校驗、應答等
- 缺點:需要有多餘的tcp開銷
- 優點:高併發下,保證通信的正確性和完整性
- unix socket:
- 優點:效率比tcp高,只是將數據進行進程間的拷貝,減少不必要的tcp開銷
- 缺點:高併發時不穩定,產生大量長時緩存,數據可能出錯不返回異常
- tcp socket:需要重新打包、拆包、計算校驗、應答等
-
使用場景:
- TCP socket
- 高併發場景,使用 tcp socket,nginx默認使用tcp方式
- 保證通信完整
- Unix socket:
- 減少tcp開銷,提高性能
- 優化:
- TCP socket
php-fpm優化:
- 改爲Unix socket通信方式
- 非高併發請求,注重性能:
- Unix socket通信方式:
- 將socket文件放在內存中(/dev/shm目錄下)
Nginx優化:
- 修改nginx的worker數,指定nginx運行時的worker數量
- 當worker_processes數等於2*CPU核心數時,性能最優
- 設置nginx中的backlog數
- listen 80 default backlog=1024;
- 增加php-fpm的worker數
- 增加併發能力
- 一個常駐worker大概耗內存30M,不可以開太大
- 配置php-fpm關閉執行時間限制
- 減少由於超時導致的終止
- 定時重啓php-fpm
- crontab定時重啓
- 配置php-fpm查看返回錯誤
- 將運行中的錯誤輸出到日誌文件中