曾经有一个面试官,问我有没有在原公司做过什么创新的东西,我当时懵了,的确想不出来,
因为在公司的两年一直在学习,还没有到厚积薄发。但是事后一想,有一点的确能算的上,
虽然不是我发明的,但公司其他同事的确没人想到或注意过。我在离职前一段时间,跟架构师
提过,叫他们换一下使用这种方式,不过到底有没有去做了,我也不知道。不过,那个问题
问的真的很好,能直接知道来面的这个人是不是泛泛之辈。
我提的就是用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>