nginx和php-fpm 是使用 tcp socket 還是 unix socket ?

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目錄下,使用的內存讀寫更快。

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

php-fpm 配置

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

nginx server塊配置

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

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

1.修改內核參數

net.unix.max_dgram_qlen = 4096
net.core.netdev_max_backlog = 4096
net.core.somaxconn = 4096

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通過TCP以及unix-domain-socket連接fastcgi方式對比
nginx、php-fpm默認配置與性能–TCP socket還是unix domain socket

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章