nginx 中fastcgi_pass監聽unix socket和tcp socket的區別

Nginx和PHP-FPM的進程間通訊有兩種方式,一種是TCP Socket,一種是UNIX Domain Socket.
其中TCP Socket是IP加端口,nginx默認的通訊方式,能夠跨服務器,很是適合作負載均衡.而UNIX Domain Socket是發生在系統內核裏而不通過網絡,只能用於Nginx跟PHP-FPM都在同一服務器的場景.php

通訊流程以下:
UNIX Domain Socket:
Nginx <=> socket <=> PHP-FPM
TCP Socket(本地迴環):
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
TCP Socket(Nginx和PHP-FPM位於不一樣服務器):
Nginx <=> socket <=> TCP/IP <=> 物理層 <=> 路由器 <=> 物理層 <=> TCP/IP <=> socket <=> PHP-FPMmysql


Mysql命令行客戶端鏈接mysqld服務也相似有這兩種方式:
使用Unix Socket鏈接(默認):
mysql -uroot -p --protocol=socket --socket=/tmp/mysql.sock
使用TCP鏈接:
mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306nginx

看過不少帖子結論是
理論上UNIX Domain Socket要比TCP Socket高效,其實是:
當訪問壓力較小(每秒併發不超過1w)時,Unix domain socket和TCP socket,在性能上沒有顯著差異(也能說Unixsock稍好)。
當高併發的時,Tcp Socket能表現出更高的穩定性,且性能優於Unix Socket,缺點是會佔用大量的臨時端口,須要用內核參數優化。sql

用UNIX Domain Socket的配置方法:centos

centos 6.5 x86_64,php5.3
一:首先創建/dev/shm/php-cgi.sock文件,而後將之改全部者改成nginx(與 nginx的用戶一致):服務器

#touch /dev/shm/php-cgi.sock     (/dev/shm是內存文件系統,socket放在內存中確定會快些)網絡

#chown nginx:nginx /dev/shm/php-cgi.sock併發

二:vi /etc/nginx/conf.d/default.conf負載均衡

修改:
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;dom

三:vi /etc/php-fpm.d/www.conf中修改配置爲:

;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock

四:重啓服務

service php-fpm restart
service nginx restart


ls -all查看/dev/shm/php-cgi.sock由普通文件變成s開頭的unix套接字

須要優化的參數:
1,增長文件打開數
echo ‘ulimit -HSn 65535′ >> /etc/profile
echo ‘ulimit -HSn 65535′ >> /etc/rc.local
source /etc/profile

2,增長php-fpm打開文件描述符限制
vi /etc/php-fpm.d/www.conf
rlimit_files = 51200

3,調高內核socket最大鏈接數
echo 'net.core.somaxconn = 2048' >> /etc/sysctl.conf   
sysctl -p 

4,調高nginx和php-fpm中的backlog
在nginx配置文件/etc/nginx/conf.d/default.conf中這個域名的server下,在listen 80後面添加default backlog=2048。同時配置/etc/php-fpm.d/www.conf中的listen.backlog爲2048,默認爲128。

5,增長sock文件和php-fpm實例數
再新建一個sock文件,在Nginx中經過upstream模塊將請求負載均衡到兩個sock文件背後的兩套php-fpm實例上。

6.php-fpm調優(雙核2G內存)
sed -i 's/;request_terminate_timeout = 0/request_terminate_timeout = 0/g' /etc/php-fpm.d/www.conf

sed -i 's/pm.max_children = 50/pm.max_children = 100/g' /etc/php-fpm.d/www.conf

sed -i 's/pm.start_servers = 5/pm.start_servers = 10/g' /etc/php-fpm.d/www.conf

sed -i 's/pm.min_spare_servers = 5/pm.min_spare_servers = 10/g' /etc/php-fpm.d/www.conf

sed -i 's/pm.max_spare_servers = 35/pm.max_spare_servers = 70/g' /etc/php-fpm.d/www.conf

sed -i 's/;pm.max_requests = 500/pm.max_requests = 1024/g' /etc/php-fpm.d/www.conf

sed -i 's/;rlimit_files = 1024/rlimit_files = 65535/g' /etc/php-fpm.d/www.conf

service php-fpm start

相關文章
相關標籤/搜索