IT技术博客大学习 共学习 共进步

用unix socket加速php-fpm、mysql、redis的连接

沈二铺子 2013-07-07 22:05:39 浏览 7,443 次

   图虫的服务器长期是单机运行。估计除了mysql之外,php-fpm和redis还可以在单机上共存很长时间。(多说服务器早就达成了单机每日2000万+动态请求,所以我对单机搞定图虫的大流量非常乐观)

   如果是单机服务,其实就不需要用IP哪怕是127.0.0.1这样的IP去连接mysql/redis/php了,因为即使是127.0.0.1也是要走TCP/IP层的。

   unix提供的unix socket来实现单机的端口访问,很多文章提到用unix socket可以提升连接速度。

   我简单测试了一下,200次redis请求的耗时38ms,如果改成unix socket方式,立刻降到27ms。这简直是立竿见影啊,10ms的差距足以让我们有动力把IP方式改成unix socket方式。

   Mysql(PDO)启用unix socket的方法

   1.在PDO的DSN里面:原来写host:xxx,改成unix_socket:/var/run/mysqld/mysqld.sock (当然你可以在my.cnf里面设置成别的)

   2.给mysql的用户名@localhost,设置访问权限。由于unix_socket并不是主机,所以用unix socket方式连接mysql,mysql会强制认为用户是来自于localhost,所以一定要给username@localhost设置权限,而不是username@’%’

   redis(phpredis)启用unix socket的方法

   1.redis 默认没有开启unix socket,需要在/etc/redis/redis.conf中修改。注意unixsocketperm 777

unixsocket /var/run/redis/redis.sock
unixsocketperm 777

   2.用phpredis连接:

$redis->connect('/var/run/redis/redis.sock')

   nginx + php-fpm启用unix socket的方法

   1.php-fpm 的pool配置文件中:

listen = /var/run/php5-fpm.sock;

   2.nginx sites的配置文件中:

fastcgi_pass   unix:/var/run/php5-fpm.sock;

   由于redis连接次数很多,因此redis使用unix socket的效果最明显,mysql其次,php基本上没有用不用sock都差不多

建议继续学习

  1. 推荐一些socket工具,TCP、UDP调试、抓包工具 (阅读 10,722)
  2. 推荐一些socket工具,TCP、UDP调试、抓包工具 (阅读 8,643)
  3. 浅析linux kernel network之socket创建 (阅读 6,623)
  4. python中的socket代理 (阅读 6,163)
  5. nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket (阅读 6,043)
  6. web socket 心跳包的实现方案 (阅读 5,903)
  7. netstat和web主机socket文件分析 (阅读 5,442)
  8. 使用socket.io和node.js搭建websocket应用 (阅读 5,141)
  9. php socket为什么这么慢,直到超时 (阅读 4,924)
  10. php实现的thrift socket server (阅读 4,723)