在設定nginx的時候,fastcgi_pass的設定問題,如下所示:
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;
}
主要是關於fastcgi_pass參數,
#fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
#fastcgi_pass unix:/tmp/php-cgi.sock;
這兩種方式有什麼差別,php7該用哪一個?
Nginx和PHP-FPM的進程間通訊有兩種方式,一種是TCP,一種是UNIX Domain Socket.
其中TCP是IP加埠,可以跨伺服器.而UNIX Domain Socket不經過網路,只能用於Nginx跟PHP-FPM都在同一伺服器的場景.用哪一種取決於你的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可用於兩個沒有親緣關係的進程,是目前廣泛使用的IPC機制,比如X Window伺服器和GUI程式之間就是透過UNIX Domain Socket通訊的.這種通訊方式是發生在系統核心里而不會在網路裡傳播.UNIX Domain Socket和長連接都能避免頻繁創建TCP短連接而導致TIME_WAIT連接過多的問題.對於進程間通訊的兩個程序,UNIX Domain Socket的流程不會走到TCP那層,直接以檔案形式,以stream socket通訊.如果是TCP Socket,則需要走到IP層,對於非同一台伺服器上,TCP Socket走的就更多了.
UNIX Domain Socket:
Nginx socket PHP-FPM
TCP Socket(本地回環):
Nginx socket TCP/IP socket PHP-FPM
TC (Nginx與PHP-FPM位於不同伺服器):
Nginx socket TCP/IP 實體層 路由器 實體層 TCP/IP socket PHP-FPM
像mysql命令列客戶端連接mysqld服務也類似有這兩種方式:
使用Unix Socket連接(預設):
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
🎜