|
|
51CTO旗下网站
|
|
移动端

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

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

作者:虞大胆来源:虞大胆的叽叽喳喳|2018-09-20 11:04

今天我就回顾下当时遇到的一个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的响应。

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

(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连接,速度上更有保证。

【编辑推荐】

  1. 浅谈Nginx服务器的内部核心架构设计
  2. 从一份配置清单详解 Nginx 服务器配置
  3. 你真的了解如何将 Nginx 配置为Web服务器吗
  4. Netcraft 8 月 Web 服务器排名:Nginx 极具潜力
  5. 使用Nginx处理DDOS进行系统优化
【责任编辑:武晓燕 TEL:(010)68476606】


点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月最赞

读 书 +更多

Solaris 内核结构(第2版)

本书描述了Solaris 10和OpenSolaris内核中所有主要子系统的算法和数据结构,对第1版进行了大幅修订,加入了很多新的内容。全书从头到尾都采...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊