nginx和php-fpm 是使用 tcp socket 還是 unix socket ?
阿新 • • 發佈:2018-12-09
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例項上。