总的来说,Nginx + php-fpm
的初始化配置还是比较简单的,如果没有配置好,在访问php
文件的时候会表现为将文件直接下载下来了,这时候其实就是php
脚本没能被正常解析。这时候排查的点主要有两个:
- 1、检查
php-fpm.conf
中的listen
,如果是listen = /tmp/php-cgi.sock
,那么对应的Nginx
中的fastcgi_pass
就需要设置为:fastcgi_pass unix:/tmp/php-cgi.sock;
,反之如果前者是listen = 127.0.0.1:9000
,那么后者就需要设置为:fastcgi_pass 127.0.0.1:9000;
- 2、要确保
Nginx
有与php-fpm
通讯的权限。一般的做法是设置Nginx
的运行用户为www
,即nginx.conf
中起始的地方user
那一行设置为:user www www;
。然后php-fpm.conf
中的设置也相对应的设置为www
,即:
listen.owner = www
listen.group = www
listen.mode = 0666
设置完以上两处之后一般就可以正常解析
php
脚本了。。
一些踩过的坑,在此备注一下:
附一:
php-fpm
的配置不一定是php-fpm.conf
,有的版本会引用php-fpm.d
下的配置文件,这时候一般在
php-fpm.d
下会有一个www.conf
,相应地修改其中的listen
和listen.owner
等即可
附二:如果没有
www
用户和组,需要手动添加,命令是:
groupadd www
useradd -g www -s /sbin/nologin www
附三:
php-fpm
的监听建议设置为php-cgi.sock的形式
。Nginx
和php-fpm
的进程间通信有两种方式,一种是TCP
,形如:127.0.0.1:9000
;另一种是unix socket
,形如:/tmp/php-cgi.sock
。TCP
的形式可以跨服务器,,而unix socket
只适用于Nginx
和php-fpm
在同一台机器的场景,但是效率要高于前者的,具体原因可以参考 https://shaohualee.com/article/760。
附四:有时候运行的好好地会报
502
网关错误,这时候即便/tmp/php-cgi.sock
是存在的,也有正常的权限,Nginx
的错误日志中死活会报找不到/tmp/php-cgi.sock
,说它不存在。这时候将php-fpm
的listen
切换为127.0.0.1:9000
(当然相应的Nginx fastcgi_pass
也要修改)就好了。另外还有一种方式可以尝试:将php-cgi.sock
切换到其他目录下,比如将/tmp/php-cgi.sock
修改为/var/run/php-cgi.sock
就可以了,具体原因暂时还没有搞清楚。。