nginx使用php出现502的问题

使用Nginx映射静态资源却出现502 http错误
查看nginx和php-fpm启动正常,查看日志发现php未连接就退出了
刚开始以为是端口未放行或者被占用,然而改完端口仍未解决,百度后解决方案如下:

Php-fpm启动后没有查询到9000端口的问题
今天通过 oneinstack 脚本安装php环境后发现了一个奇怪的现象,php-fpm进程在运行,但是看不到监听的端口号。原来是我漏掉了一个知识点。

知识点

nginx与php-fpm通信的两种方式: tcp socket(带端口方式访问)unix socket(通过pid进程间相互访问)

unix socket 是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。这种方式需要再nginx配置文件中填写php-fpm的pid文件位置,效率要比tcp socket高。
tcp socket的优点是可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式。
可以参考nginx与php-fpm通信的两种方式

unix socket配置方法

我用oneinstack安装的php,打开/usr/local/php/etc/php-fpm.conf中关于监听的部分配置如下:

1
2
3
4
5
6
7
8
9
[www]
listen = /dev/shm/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www

所以,nginx我们应该这么配置:

1
2
3
4
5
6
7
8
9
location ~ \.php(.*)$ {
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME ;
fastcgi_param PATH_INFO ;
fastcgi_param PATH_TRANSLATED ;
include fastcgi_params;
}

这种方式会遇到 access denied 的问题,参考本博客另外一篇文章。

tcp socket配置方法

以前自己安装php都用的端口号的写法,打开/usr/local/php/etc/php-fpm.conf中关于监听的部分配置如下:

1
2
3
4
5
6
7
8
9
[www]
listen = 127.0.0.1:9000
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www

所以,nginx我们应该这么配置:

1
2
3
4
5
6
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME ;
include fastcgi_params;
}

小结

以前只是在mysql里看到过unix socket的用法,在php里还是头一回,涨知识了。
记录:

  1. 注意安装完php后,php-fpm的调用方式时tcp_socket还是unix_socket,通过php-fpm.conf配置判断
  2. 修改apache默认端口:不仅要修改httpd.conf中的端口,还要修改xampp里的test端口
  3. xampp: lsof -i:3306
  4. 博客: lsof -i:3307