文章大纲

nginx 502 Bad Gateway的错误分析及解决办法

2019-11-18 21:44:33

会导致nginx 502的原因有很多,本文只记载本人在工作中经历过的。由于文章并不是一边实践一边写的,难免有的地方会有纰漏之处,还望多多指正。


写的自动安装环境的bash脚本一直在centos6系统下运行正常,到centos7系统时,站点就会出现nginx 502 Bad Gateway问题。


原因:

centos7系统比Centos6系统多了一个privateTmp属性的设置。在nginx和php-fpm对应的服务文件都可以看到,具体目录如下:

/usr/lib/systemd/system/nginx.service
/usr/lib/systemd/system/php-fpm.service


那这个属性是用来干嘛的呢?

这个属性引入的目的是为了提高服务的安全。

在centos6系统里,各个系统服务都使用的根目录/tmp目录,这样就会让服务器的其它用户也能管理你的服务。自centos7引入privateTmp目录,各个服务使用各自的tmp目录,你要使用的服务,类如nginx和php-fpm,就可以不受其它用户的控制了。


由于我工作中不考虑多用户情况,nginx里fastcgi_pass配置使用如下:

fastcgi_pass unix:/tmp/php-cgi.sock

使用的仍然是系统的/tmp根目录,所以只要修改以上对应文件里的privateTmp配置即可:

privateTmp=True 改为 privateTmp=no

然后保存并重启对应服务,注意centos7管理服务命令,都开始使用systemctl了,泪如重启nginx服务命令:

systemctl restart nginx.service


centos6和centos7系统的服务管理命令记忆诀窍:

先列举出来,肉眼比较一下。

centos6:   service nginx restart
centos7:   systemctl restart nginx.service

从上对比可以总结如下:

记忆窍门:centos6里服务在命令的中间,简化为:服务中,而centos7命令里服务在最后,简化为:服务后。7版本必然在6之后,这样就对上了位置,不至于总是把命令中nginx这个服务名称写错了位置


有时修改后,浏览器访问依然是502,但shell会显示很明显的错误提示。

1. /tmp目录下没有php-cgi.sock这个文件。英文提示no such directory or file.

重启php-fpm服务没能重新生成这个文件的话,可以自己手动创建一个。


2.无权访问/tmp目录下的php-cgi.sock。英文提示permission denied.

这个是因为有时遇到1情况,然后自己手动创建的文件用户权限是root,但php-fpm的权限用户并不是root,从而导致php-fpm服务无法读取/tmp/php-cgi.sock这个文件。

通过以下命令可以先查出php-fpm服务的用户:

ps -ef |grep php-fpm

然后修改/tmp/php-cgi.sock的用户组和用户,修改的结果就要是上面查出的php-fpm服务管理的用户,下面假设上面查到的用户组和用户都是www:

chown  www:www /tmp/php-cgi.sock


这个工作做完了,同样重启了各服务,浏览器还是显示502的话,这时候就要检查php-fpm服务的配置了。

本人工作中遇到的情况是,php-fpm配置里监听的服务文件和nginx里fastcgi_pass配置的不一样。

例如,在php-fpm的配置里,是这样子的:

listen  /var/run/php-cgi.sock

而nginx里fastcgi_pass的配置是这样的:

fastcgi_pass unix:/tmp/php-cgi.sock

这个时候你就不得不修改php-fpm的配置了,当然,你不想改动php-fpm的服务配置,你要去改nginx的配置,也是可以的。

centos7下php-fpm服务的配置文件默认在/etc/php-fpm.d/www.conf这个文件里。


这是本人目前大多数时候遇到的502问题,这里就告一段落了。

本文是翟码农个人博客蓝翟红尘里Linux相关分类下的有关Nginx维护的文章,转载请注明出处:http://www.zhai14.com/blog/740599941e7b331e1cf8ab85ca9a2e5b.html


结尾顺便提点儿其它的:fastcgi_pass 为何也可以用 127.0.0.1:9001。

这是应为fastcgi_pass支持两种方式:

一种是tcp方式,就是127.0.0.1:9001这种ip+端口的访问形式。

一种是Unix Domain Socket方式,就是unix:/tmp/这种形式。

它们两有何区别:

1. tcp方式支持跨服务器,只要改变ip和端口就可以做到。而unix这种就不行。

2.unix这种不涉及tcp的传输,只是在服务器内部传,速度比tcp快吧。细节也不太懂,待日后继续深入。



我要评论
评论列表