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