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/shmtouch php7.0-fpm.sock chown www-data:www-data php7.0-fpm.sockchmod 777 php7.0-fpm.sock
php-fpm 配置
# vi /etc/php/7.0/fpm/pool.d/www.conflisten= /dev/shm/php7.0-fpm.socklisten.owner = www-datalisten.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 = 4096net.core.netdev_max_backlog = 4096net.core.somaxconn = 4096
2.提高backlog
backlog預設位128,1024這個值最好換算成自己正常的QPS。
nginx.confserver{ listen 80 default backlog=1024;}php-fpm.conflisten.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