关于Nginx工作原理,这篇博文是看到的最完整,推荐~:https://blog.csdn.net/hguisu/article/details/8930668;
这里是针对目前碰到问题的解决方案提炼简化,聚焦的是Nginx和PHP_FPM成功通信的配置设置。很多会有重复。
Nginx是轻量HTTP Server,工作是响应和并发处理,具体来说负责解析静态请求、转发动态请求及把处理后的动态请求结果转回给客户。而具体处理动态请求(解析并得结果)则需要第三方程序,这个过程就需要Nginx和第三方程序间有效通信协议了(Fast CGI)。具体举例PHP,Nginx本身并不会对PHP语言进行解析,这个区别于apache(apache有在带的mod_php模块进行php解析).Nginx是通过fastcgi将客户端的PHP请求交给后台的第三方PHP-fpm进程管理器,PHP-fpm具有解析PHP的功能。Nginx和PHP_fpm间通信设置:Nginx相应配置文件在etc/nginx/sites-enabled/default中:(请关注绿标)
PHP_FPM相应配置文件在:etc/php/7.2/fpm/pool.d/www.conf中:(关注绿标,其实就是声明监听指定端口)
Nginx和PHP-FPM的进程间通信有两种方式,一种是TCP Socket,一种是Unix Socket。须保证nginx配置的监听方式和php-fpm.conf配置的监听方式保持一致性!(如果有别虚拟主机比如:Nginx+apache2, 那apache2和Nginx的这个通信方式也要一致)
Tcp Socket方式是IP加端口,可以跨服务器.而UNIX Socket不经过网络,只能用于Nginx跟PHP-FPM都在同一服务器的场景,用哪种取决于你的PHP-FPM配置
Tcp Socket方式:
nginx.conf中配置:fastcgi_pass 127.0.0.1:9000;
php-fpm.conf中配置:listen=127.0.0.1:9000;
Unix Domain Socket方式:
nginx.conf中配置:fastcgi_pass unix:/tmp/php-fpm.sock;
php-fpm中配置:listen = /tmp/php-fpm.sock;
(php-fpm.sock是一个文件,由php-fpm生成)
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