在設(shè)定nginx的時(shí)候,fastcgi_pass的設(shè)定問(wèn)題,如下所示:
location ~ \.php$ {
root /home/wwwroot;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
#fastcgi_pass unix:/tmp/php-cgi.sock;
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
主要是關(guān)於fastcgi_pass參數(shù),
#fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
#fastcgi_pass unix:/tmp/php-cgi.sock;
這兩種方式有什麼差別,php7該用哪一個(gè)?
Nginx和PHP-FPM的進(jìn)程間通訊有兩種方式,一種是TCP,一種是UNIX Domain Socket.
其中TCP是IP加埠,可以跨伺服器.而UNIX Domain Socket不經(jīng)過(guò)網(wǎng)路,只能用於Nginx跟PHP-FPM都在同一伺服器的場(chǎng)景.用哪一種取決於你的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是一個(gè)檔案,由php-fpm產(chǎn)生,型別是srw-rw----.
UNIX Domain Socket可用於兩個(gè)沒(méi)有親緣關(guān)係的進(jìn)程,是目前廣泛使用的IPC機(jī)制,比如X Window伺服器和GUI程式之間就是透過(guò)UNIX Domain Socket通訊的.這種通訊方式是發(fā)生在系統(tǒng)核心里而不會(huì)在網(wǎng)路裡傳播.UNIX Domain Socket和長(zhǎng)連接都能避免頻繁創(chuàng)建TCP短連接而導(dǎo)致TIME_WAIT連接過(guò)多的問(wèn)題.對(duì)於進(jìn)程間通訊的兩個(gè)程序,UNIX Domain Socket的流程不會(huì)走到TCP那層,直接以檔案形式,以stream socket通訊.如果是TCP Socket,則需要走到IP層,對(duì)於非同一臺(tái)伺服器上,TCP Socket走的就更多了.
UNIX Domain Socket:
Nginx socket PHP-FPM
TCP Socket(本地回環(huán)):
Nginx socket TCP/IP socket PHP-FPM
TC (Nginx與PHP-FPM位於不同伺服器):
Nginx socket TCP/IP 實(shí)體層 路由器 實(shí)體層 TCP/IP socket PHP-FPM
像mysql命令列客戶端連接mysqld服務(wù)也類似有這兩種方式:
使用Unix Socket連接(預(yù)設(shè)):mysql -uroot -p --protocol=socket --socket=/tmp/mysql. sock
mysql -uroot -p --protocol=socket --socket=/tmp/mysql.sock
使用TCP連接:mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306
使用TCP連線:
mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306
??