初次使用Nginx,本章博客采用的wordpress构建,php静态页面。第一次使用静态页面,搭建好环境之后,始终不能启动wordpress的初始化界面,遂查资料,需要在配置文件中加上下列代码:

location ~ .php {

 fastcgi_pass unix:/tmp/php-cgi-73.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_split_path_info ^(.+.php)(.*)$;
 fastcgi_param PATH_INFO $fastcgi_path_info;
 include fastcgi_params;
 }

后完美解决,
fastcgi_pass 127.0.0.1:9000
开始采用这种方式,但是发现fastcgi没有在运行,看端口运行即可。然后采用
fastcgi_pass unix:/tmp/php-cgi-73.sock; 这种方式得以运行。

遂深究。其实两种方式都可以连接到,区别在于是否有不同服务器的通信需求。就不会在网络中传播,直接在服务器内核中沟通。我遇到的是查找不到fastcgi:9000端口的运行,所以采用了unix方式连接。

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
TCP Socket(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
使用TCP连接:
mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306

最后修改:2020 年 08 月 28 日 09 : 10 PM
如果觉得我的文章对你有用,请随意赞赏