每種動態語言( PHP,Python 等)的程式碼檔案需要通過對應的解析器才能被伺服器識別,而 CGI 協定就是用來使直譯器與伺服器可以互相通訊。PHP 檔案在伺服器上的解析需要用到 PHP 直譯器,再加上對應的 CGI 協定,從而使伺服器可以解析到 PHP 檔案。
由於 CGI 的機制是每處理一個請求需要 fork 一個 CGI 程序,請求結束再kill掉這個程序,在實際應用上比較浪費資源,於是就出現了CGI 的改良版本 FastCGI,FastCGI 在請求處理完後,不會 kill 掉程序,而是繼續處理多個請求,這樣就大大提高了效率。
PHP-FPM 即 PHP-FastCGI Process Manager, 它是 FastCGI 的實現,並提供了程序管理的功能。程序包含 master 程序和 worker 程序兩種;master 程序只有一個,負責監聽埠,接收來自伺服器的請求,而 worker 程序則一般有多個(具體數量根據實際需要進行設定),每個程序內部都會嵌入一個 PHP 直譯器,是程式碼真正執行的地方。
當我們存取一個網站(如 www.test.com)的時候,處理流程是這樣的:
www.test.com | | Nginx | | 路由到 www.test.com/index.php | | 載入 nginx 的 fast-cgi 模組 | | fast-cgi 監聽 127.0.0.1:9000 地址 | | www.test.com/index.php 請求到達 127.0.0.1:9000 | | 等待處理...
在 Linux 上,nginx 與 php-fpm 的通訊有 tcp socket 和 unix socket 兩種方式。
tcp socket 的優點是可以跨伺服器,當 nginx 和 php-fpm 不在同一臺機器上時,只能使用這種方式。
Unix socket 又叫 IPC(inter-process communication 程序間通訊) socket,用於實現同一主機上的程序間通訊,這種方式需要在 nginx組態檔中填寫 php-fpm 的 socket 檔案位置。
兩種方式的資料傳輸過程如下圖所示:
二者的不同:
由於 Unix socket 不需要經過網路協定棧,不需要打包拆包、計算校驗和、維護序號和應答等,只是將應用層資料從一個程序拷貝到另一個程序。所以其效率比 tcp socket 的方式要高,可減少不必要的 tcp 開銷。不過,unix socket 高並行時不穩定,連線數爆發時,會產生大量的長時快取,在沒有面向連線協定的支撐下,巨量資料包可能會直接出錯不返回異常。而 tcp 這樣的面向連線的協定,可以更好的保證通訊的正確性和完整性。
Nginx 與 php-fpm 結合只需要在各自的組態檔中做設定即可:
1) Nginx 中的設定
以 tcp socket通訊為例
server { listen 80; #監聽 80 埠,接收http請求 server_name www.test.com; #就是網站地址 root /usr/local/etc/nginx/www/huxintong_admin; # 準備存放程式碼工程的路徑 #路由到網站根目錄 www.test.com 時候的處理 location / { index index.php; #跳轉到 www.test.com/index.php autoindex on; } #當請求網站下 php 檔案的時候,反向代理到 php-fpm location ~ \.php$ { include /usr/local/etc/nginx/fastcgi.conf; #載入 nginx 的 fastcgi 模組 fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; # tcp 方式,php-fpm 監聽的 IP 地址和埠 # fasrcgi_pass /usr/run/php-fpm.sock # unix socket 連線方式 } }
2) php-fpm 的設定
listen = 127.0.0.1:9000 # 或者下面這樣 listen = /var/run/php-fpm.sock
注意,在使用 unix socket 方式連線時,由於 socket 檔案本質上是一個檔案,存在許可權控制的問題,所以需要注意 nginx 程序的許可權與 php-fpm 的許可權問題,不然會提示無許可權存取。(在各自的組態檔裡設定使用者)
通過以上設定即可完成 php-fpm 與 nginx 的通訊。
如果是在同一臺伺服器上執行的 nginx 和 php-fpm,且並行量不高(不超過1000),選擇unix socket,以提高 nginx 和 php-fpm 的通訊效率。
如果是面臨高並行業務,則考慮選擇使用更可靠的 tcp socket,以負載均衡、核心優化等運維手段維持效率。
若並行較高但仍想用 unix socket 時,可通過以下方式提高 unix socket 的穩定性。
1)將sock檔案放在 /dev/shm 目錄下,此目錄下將 sock 檔案放在記憶體裡面,記憶體的讀寫更快。
2)提高 backlog
backlog 預設位 128,1024 這個值最好換算成自己正常的 QPS,設定如下。
nginx.conf 檔案中
server { listen 80 default backlog = 1024; }
php-fpm.conf 檔案中
listen.backlog = 1024
3)增加 sock 檔案和 php-fpm 範例
在 /dev/shm 新建一個 sock 檔案,在 nginx 中通過 upstream 模組將請求負載均衡到兩個 sock 檔案,並且將兩個 sock 檔案分別對應到兩套 php-fpm 範例上。
推薦學習:《》
以上就是聊聊Nginx與php-fpm的通訊機制,看看如何設定?的詳細內容,更多請關注TW511.COM其它相關文章!