曾经有一个面试官,问我有没有在原公司做过什么创新的东西,我当时懵了,的确想不出来,

因为在公司的两年一直在学习,还没有到厚积薄发。但是事后一想,有一点的确能算的上,

虽然不是我发明的,但公司其他同事的确没人想到或注意过。我在离职前一段时间,跟架构师

提过,叫他们换一下使用这种方式,不过到底有没有去做了,我也不知道。不过,那个问题

问的真的很好,能直接知道来面的这个人是不是泛泛之辈。

我提的就是用unix socket来代替tcp socket进行nginx,php之间的数据传输,当然大牛们

应该老早明了这个做法了。我是在看了APUE之后才更加理解他们差别的,当然FREEBSD上也有

大牛在讨论,结果都是一致的。因为tcp 四层协议并不只是逻辑上存在的,在操作系统内核里

都有它们对应的C代码的,那么一次请求,相当于nginx这边是四层从上往下走,

然后到php进程那边,四层协议从下往上走,然后php执行完脚本产生html,

把数据再在四层里从上往下走输送到nginx这边,而等在这边的nginx进程把那些数据又从下往上走,

然后经过一系列处理,再在四层协议里去走一遍,这次是经过eth0接口返回浏览器了。

单次请求,相当于单单nginx,php之间,那四层协议的代码都走了4次。如果高并发时,

亿级请求时呢,要消耗多少内存和cpu和时间拖延阿?如果用unix socket,

当然没有那4层协议的C代码了,虽然说也是要用到系统调用的,socket,bind,send,recv

这些函数接口都一样,但底层实现不一样。

简而言之,unix socket 就是buffer与bufer之间数据交换。而一般的大型网站,

都可以用unix socket 的,除非nginx 进程,php进程不在同一台机器上,

 

配置

nginx通过unix socket和fastcgi通信,比tcp socket要高效,重负荷下可以考虑。

1、在nginx.conf中修改配置为:

     fastcgi_pass  unix:/tmp/php-cgi.sock;

     #fastcgi_pass  127.0.0.1:9000;

2、在php-fpm.conf中修改配置为:

<value name="listen_address">/tmp/php-cgi.sock</value>