Nginx鏈接fastcgi的方式有2種:php
TCP和unix domain socketnginx
什麼是Unix domain socket?—— 維基百科 Unix domain socket 或者 IPC socket是一種終端,能夠使同一臺操做系統上的兩個或多個進程進行數據通訊。與管道相比,Unix domain sockets 既能夠使用字節流和數據隊列,而管道通訊則只能經過字節流。Unix domain sockets的接口和Internet socket很像,但它不使用網絡底層協議來通訊。Unix domain socket 的功能是POSIX操做系統裏的一種組件。centos
Unix domain sockets 使用系統文件的地址來做爲本身的身份。它能夠被系統進程引用。因此兩個進程能夠同時打開一個Unix domain sockets來進行通訊。不過這種通訊方式是發生在系統內核裏而不會在網絡裏傳播。服務器
TCP和unix domain socket方式對比網絡
TCP是使用TCP端口鏈接127.0.0.1:9000併發
Socket是使用unix domain socket鏈接套接字/dev/shm/php-cgi.sock(不少教程使用路徑/tmp,而路徑/dev/shm是個tmpfs,速度比磁盤快得多)dom
測試機是個1核的centos5.4,2用戶併發時系統資源消耗50%左右,10用戶資源就跑得很滿了。socket
2users 10users nginx/1.2.9 + PHP 5.2.5 tcp 1060 1294 nginx/1.2.9 + PHP 5.2.5 socket 997 1487 nginx/1.2.9 + PHP 5.3.10 tcp 906 1082 nginx/1.2.9 + PHP 5.3.10 socket 880 1247
結論是在服務器壓力不大的狀況下,tcp和socket差異不大,但在壓力比較滿的時候,用套接字方式,效果確實比較好。 下面是php 5.3以上版本將TCP改爲socket方式的配置方法:tcp
修改php-fpm.conf(/usr/local/php/etc/php-fpm.conf)php-fpm
;listen = 127.0.0.1:9000 listen = /dev/shm/php-cgi.sock
修改nginx配置文件server段的配置,將http的方式改成socket方式
location ~ [^/]\.php(/|$) { #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/dev/shm/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; }
重啓php-fpm與nginx
service nginx restart service php-fpm restart ls -al /dev/shm
能夠看到php-cgi.sock文件unix套接字類型 參考:http://zh.wikipedia.org/wiki/Unix_domain_socket