php優化 - nginx與php-fpm通信協議

CGI:通信網關協議

  • CGI協議:動態語言的代碼文件需要對應的語言解釋器才能被服務器識別,CGI協議就是用來使得解釋器與服務器之間互相通信

image

請求鏈路:
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掉一些節省資源

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,nginx默認使用tcp方式
      • 保證通信完整
    • Unix socket:
      • 減少tcp開銷,提高性能
      • 優化:

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查看返回錯誤
    • 將運行中的錯誤輸出到日誌文件中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章