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

相关文章
相关标签/搜索