1. 程式人生 > >php-fpm 和 nginx 的兩種通信方式

php-fpm 和 nginx 的兩種通信方式

col 服務器 csdn .com 完整性 並發 pan conf document

在 linux 中,nginx 服務器和 php-fpm 可以通過 tcp socket 和 unix socket 兩種方式實現。

一下內容轉自:https://blog.csdn.net/qq624202120/article/details/60957634

tcp socket

允許通過網絡進程之間的通信,也可以通過loopback進行本地進程之間通信。

unix socket

允許在本地運行的進程之間進行通信。

對比分析:

技術分享圖片

從上面的圖片可以看,unix socket 減少了不必要的 tcp 開銷,而 tcp 需要經過 loopback,還要申請臨時端口和 tcp 相關資源。但是,unix socket 高並發時候不穩定,連接數爆發時,會產生大量的長時緩存,在沒有面向連接協議的支撐下,大數據包可能會直接出錯不返回異常。tcp這樣的面向連接的協議,多少可以保證通信的正確性和完整性。

如何選擇

如果是在同一臺服務器上運行的 nginx 和 php-fpm,並發量不超過1000,選擇 unix socket,因為是本地,可以避免一些檢查操作(路由等),因此更快,更輕。 如果面臨高並發業務,選擇使用更可靠的 tcp socket,以負載均衡、內核優化等運維手段維持效率。

nginx 和 php-fpm 使用 unix socket

將sock文件放在/dev/shm目錄下,使用的內存讀寫更快。

1 # cd /dev/shm
2 touch php7.0-fpm.sock 
3 chown www-data:www-data php7.0-fpm.sock
4 chmod 777
php7.0-fpm.sock

php-fpm.conf

1 # vi /etc/php/7.0/fpm/pool.d/www.conf
2 listen= /dev/shm/php7.0-fpm.sock
3 listen.owner = www-data
4 listen.group = www-data

nginx location 配置

1   location ~* \.php$ {
2     fastcgi_pass unix:/dev/shm/php7.0-fpm.sock;
3     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
4 include /etc/nginx/fastcgi_params; 5 }

提高nginx和php-fpm使用的 unix socket穩定性(單機能力有限)

1.修改內核參數

1 net.unix.max_dgram_qlen = 4096 2 net.core.netdev_max_backlog = 4096 3 net.core.somaxconn = 4096

2.提高 backlog

backlog 默認位128,1024這個值最好換算成自己正常的QPS。

1 nginx.conf
2 server{
3   listen 80 default backlog=1024;
4 }
5 
6 php-fpm.conf
7 listen.backlog = 1024
8 
9 ---------------------

3.增加 sock 文件和 php-fpm 實例

在 /dev/shm 新建一個 sock 文件,在 nginx 中通過 upstream 魔抗將請求負載均衡到兩個 sock 文件, 並且將兩個 sock 文件分別對應到兩套 php-fpm 實例上。

php-fpm 和 nginx 的兩種通信方式