会导致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快吧。细节也不太懂,待日后继续深入。