Nginx和PHP-FPM的進(jìn)程間通信有兩種方式,一種是TCP,一種是UNIX Domain Socket. 其中TCP是IP加端口,可以跨服務(wù)器.而UNIX Domain Socket不經(jīng)過網(wǎng)絡(luò),只能用于Nginx跟PHP-FPM都在同一服務(wù)器的場景.用哪種取決于你的PHP-FPM配置: 方式1: php-fpm.conf: listen = 127.0.0.1:9000 nginx.conf: fastcgi_pass 127.0.0.1:9000; 方式2: php-fpm.conf: listen = /tmp/php-fpm.sock nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock; 其中php-fpm.sock是一個文件,由php-fpm生成,類型是srw-rw----.
UNIX Domain Socket可用于兩個沒有親緣關(guān)系的進(jìn)程,是目前廣泛使用的IPC機(jī)制,比如X Window服務(wù)器和GUI程序之間就是通過UNIX Domain Socket通訊的.這種通信方式是發(fā)生在系統(tǒng)內(nèi)核里而不會在網(wǎng)絡(luò)里傳播.UNIX Domain Socket和長連接都能避免頻繁創(chuàng)建TCP短連接而導(dǎo)致TIME_WAIT連接過多的問題.對于進(jìn)程間通訊的兩個程序,UNIX Domain Socket的流程不會走到TCP那層,直接以文件形式,以stream socket通訊.如果是TCP Socket,則需要走到IP層,對于非同一臺服務(wù)器上,TCP Socket走的就更多了.
UNIX Domain Socket: Nginx <=> socket <=> PHP-FPM TCP Socket(本地回環(huán)): Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM TCP Socket(Nginx和PHP-FPM位于不同服務(wù)器): Nginx <=> socket <=> TCP/IP <=> 物理層 <=> 路由器 <=> 物理層 <=> TCP/IP <=> socket <=> PHP-FPM
像mysql命令行客戶端連接mysqld服務(wù)也類似有這兩種方式: 使用Unix Socket連接(默認(rèn)):
mysql -uroot -p --protocol=socket --socket=/tmp/mysql.sock 使用TCP連接:
mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306
|