502错误,让你进一步明白Nginx和PHP-FPM之间的关系

服务器
今天我就回顾下当时遇到的一个502问题,以及最后的解决方法,大家也别小看这个502错误,充分理解非常必要,希望通过这篇文章大家能够学到一些知识。

今天我就回顾下当时遇到的一个502问题,以及***的解决方法,大家也别小看这个502错误,充分理解非常必要,希望通过这篇文章大家能够学到一些知识。

在我这个案例中,Nginx通过FastCGI协议连接PHP-FPM(7.1),Nginx和PHP-FPM部署在同一台机器上,配置完成后,在浏览器中访问,报了一个 502 错误。

首先引用下百科对于 502 的介绍:

  • The server was acting as a gateway or proxy and received an invalid response from the upstream server.

它的意思就是Nginx没有获取到PHP-FPM的响应。

我当时处理的比较着急,花了很久的时间,此处忽略各种的排查过程,先贴下***正确的配置(和本次问题有关的)。

[[244300]]

(1)nginx.conf:

  1. error_log logs/error.log; 
  2. user www-data www-data; 

(2)php-fpm.conf:

 

  1. access.log = /var/log/fpm.log 

(3)pool.d/www.conf(PHP-FPM pool 配置文件):

  1. user = www-data 
  2. group = www-data 
  3.  
  4. listen = /run/php/php7.1-fpm.sock 
  5.  
  6. listen.owner = www-data(错误产生时的配置:listen.owner = www) 
  7. listen.group = www-data(错误产生时的配置:listen.owner = www) 
  8. listen.mode = 0660 
  9. access.log = /var/log/fpm-www.access.log 

再解释下 pool 配置文件,一般情况下,nginx 一个虚拟主机对应一个 php-fpm pool 文件,这样不同的 php-fpm 工作进程就隔离了,互不影响。

接下去介绍解决过程:

1:在出现 502 问题的时候,观察 nginx 的 error.log 文件,会有以下报错:

  1. 2018/09/18 18:34:32 [crit] 2831#0: *493 connect() to unix:/run/php/php7.1-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 18.179.21.152, server: www.simplehttps.com, request: "GET /1.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.1-fpm.sock:", host: "www.simplehttps.com" 

其实说的已经很明白了,连接 PHP-FPM 的时候遇到了权限问题。

2:观察下 php 主进程的 error.log

发现 /var/log/fpm.log 文件没有任何的输出,查阅了官方资料,对于 error_log 这个指令解释的非常少。

我猜测有两种作用:

  • 每个 pool 的错误会重定向到这个文件中。(经过测试,pool错误和这个文件没有关系)
  • PHP-FPM 主进程的一些控制错误。(从本案例来说,主进程并不知道Nginx遇到了错误,所以也没有错误输出)

***,php-fpm.conf 下的 error_log 指令在我看来没有任何的实际用处,如果读者有知道的,欢迎指导。

(3)定位问题

知道了nginx通过本地socket方式连接php-fpm遇到权限问题,定位到了listen.owner和 listen.group指令。

产生问题的原因就是nginx进程的属主和php-fpm属主权限不一样,在发生502问题的时候,nginx属主是www-data,而listen.owner是www。把它们修改一致后,问题解决。

我们不禁要问,listen.owner和listen.group指令表示什么?看官方的介绍:

  1. Set permissions for unix socket, if one is used. In Linux, read/write 
  2. ; permissions must be set in order to allow connections from a web server. Man 

它们表示php-fpm工作进程以unix socket和web服务器连接的时候,该socket的权限必须和web服务器的操作(读取)权限一致。

读者大概明白了什么意思,那user和group这两个指令什么意思,为什么和listen.owner指令如此相像,官方是这么介绍的:

  1. ; Unix user/group of processes 

解释的不是很清楚,实际上表明的是这个php-fpm进程本身权限(通过 ps aux | grep php-fpm就能进一步确认),如果php-fpm要传递错误数据给nginx,那么user和group的指令必须和nginx的user指令配置一样(以后会写文章说明)。

这也间接说明了,如果nginx的user指令和php-fpm工作进程的listen.user指令配置不一样,也不影响两者交互。只是在本机中,nginx和php-fpm如果要读取或操作同一文件,需要配置一致,关于这一点希望大家仔细体会。

实际上最简单的解决方案,就是通过tcp的方式连接nginx和php-fpm(即www.conf 配置listen = 127.0.0.1:9000),这样不会有权限操作的问题,但对于本机来说,socket连接相比tcp连接,速度上更有保证。

责任编辑:武晓燕 来源: 虞大胆的叽叽喳喳
相关推荐

2017-12-28 10:22:28

NginxFastCGIPHP-fpm

2015-10-19 14:57:51

2011-07-27 12:58:43

Android MarAndroid应用商店

2021-04-27 11:20:20

机器学习骨科医疗

2019-03-22 10:20:39

加速Windows 10启动

2023-09-01 18:20:43

Chrome代码测试版

2011-07-29 15:02:22

LifeSize视频协作

2020-12-10 20:00:04

数字货币比特币区块链

2010-05-07 09:02:29

NginxPHP-FPMAPC

2023-12-07 14:35:15

2009-11-30 18:35:05

BizSparkDreamSparkWebSiteSpar

2014-01-08 10:22:28

思科Videoscape

2009-12-28 10:08:07

OracleSQLDevelope开发框架

2010-03-15 09:40:19

Windows 8研发

2009-08-26 14:48:05

C#委托与事件

2021-01-29 17:57:32

存储

2016-08-23 16:40:45

联想

2022-04-18 09:23:38

微软AndroidWindows 11

2015-07-03 11:07:34

程序猿作法
点赞
收藏

51CTO技术栈公众号