项目环境出现PHP 502 Bad Gateway 问题排查

news/2024/9/20 15:36:36/文章来源:https://www.cnblogs.com/gentsir/p/18325576

一、现象

昨天运维人员被告知,在升级完客户集群环境后,访问管理页面偶尔会报 502 Bad Gateway

 

二、排查思路

1、看到 502 第一时间想到的应该是 php-fpm 出问题了,先看下 nginx 日志,连接被对端关闭,说明 php-fpm 进程提前退出了,那是什么原因导致 php-fpm 退出了呢?

 

2、查看 php-fpm 日志,有很多 warining 级别日志,而且都是重复的退出、重建。网上有很多文章说调整 php-fpm 执行时间之类,作用不大,如果报 504 可以考虑适当调整执行时间参数。这时修改 php-fpm 为如下配置,保存重启 php-fpm

pm.max_children = 1
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1

 

 3、使用 strace 命令追踪 php-fpm worker 进程

[mlcdm@node2 ~]$ sudo strace -p 9277
strace: Process 9277 attached
accept(5, {sa_family=AF_INET, sin_port=htons(46636), sin_addr=inet_addr("127.0.0.1")}, [112->16]) = 3
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 8082094440
read(3, "\1\1\0\1\0\10\0\0", 8)         = 8
read(3, "\0\1\0\0\0\0\0\0", 8)          = 8
read(3, "\1\4\0\1\3a\7\0", 8)           = 8
read(3, "\0174SCRIPT_FILENAME/var/www/mlclou"..., 872) = 872
read(3, "\1\4\0\1\0\0\0\0", 8)          = 8
lstat("/var/www/mlcloud/public//index.php/api/appfile/pluto", 0x7ffd136a20b0) = -1 ENOTDIR (Not a directory)
stat("/var/www/mlcloud/public//index.php/api/appfile", 0x7ffd136a44a0) = -1 ENOTDIR (Not a directory)
stat("/var/www/mlcloud/public//index.php/api", 0x7ffd136a44a0) = -1 ENOTDIR (Not a directory)
stat("/var/www/mlcloud/public//index.php", {st_mode=S_IFREG|0666, st_size=1604, ...}) = 0
read(3, "\1\5\0\1\0\275\3\0", 8)        = 8
read(3, "method=dbf.task.offlinetimeoutta"..., 189) = 189
read(3, "\0\0\0", 3)                    = 3
stat("/var/www/mlcloud/public/.user.ini", 0x7ffd136a2fc0) = -1 ENOENT (No such file or directory)
rt_sigaction(SIGPROF, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGPROF, {sa_handler=0x9d26a0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc5c4ae3630}, NULL, 8) = 0
rt_sigaction(SIGHUP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGHUP, {sa_handler=0x9d26a0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc5c4ae3630}, NULL, 8) = 0
rt_sigaction(SIGINT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fc5c4ae3630}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x9d26a0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc5c4ae3630}, NULL, 8) = 0
rt_sigaction(SIGQUIT, NULL, {sa_handler=0xa3ac20, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fc5c4ae3630}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=0x9d26a0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc5c4ae3630}, NULL, 8) = 0
rt_sigaction(SIGTERM, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fc5c4ae3630}, 8) = 0
rt_sigaction(SIGTERM, {sa_handler=0x9d26a0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc5c4ae3630}, NULL, 8) = 0
rt_sigaction(SIGUSR1, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fc5c4ae3630}, 8) = 0
rt_sigaction(SIGUSR1, {sa_handler=0x9d26a0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc5c4ae3630}, NULL, 8) = 0
rt_sigaction(SIGUSR2, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fc5c4ae3630}, 8) = 0
rt_sigaction(SIGUSR2, {sa_handler=0x9d26a0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc5c4ae3630}, NULL, 8) = 0
setitimer(ITIMER_PROF, {it_interval={tv_sec=0, tv_usec=0}, it_value={tv_sec=60, tv_usec=0}}, NULL) = 0
rt_sigaction(SIGPROF, {sa_handler=0x9d26a0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc5c4ae3630}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
lstat("/var/www/mlcloud/public//index.php", {st_mode=S_IFREG|0666, st_size=1604, ...}) = 0
lstat("/var/www/mlcloud/public", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat("/var/www/mlcloud", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
lstat("/var/www", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/var/www/mlcloud/public/index.php", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0666, st_size=1604, ...}) = 0
getcwd("/home/mlcdm", 4095)             = 12
chdir("/var/www/mlcloud/public/")       = 0
setitimer(ITIMER_PROF, {it_interval={tv_sec=0, tv_usec=0}, it_value={tv_sec=30, tv_usec=0}}, NULL) = 0
stat("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned", 0x7ffd136a1470) = -1 ENOENT (No such file or directory)
open("/var/www/mlcloud/public//index.php", O_RDONLY) = 6
fstat(6, {st_mode=S_IFREG|0666, st_size=1604, ...}) = 0
fstat(6, {st_mode=S_IFREG|0666, st_size=1604, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc5c5145000
read(6, "<?php\n\n// Valid PHP Version?\n$mi"..., 4096) = 1604
close(6)                                = 0
munmap(0x7fc5c5145000, 4096)            = 0
stat("/tmp", {st_mode=S_IFDIR|0700, st_size=61440, ...}) = 0
open("/tmp/tmpftRfMVP", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied)
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
+++ killed by SIGSEGV +++

找到问题了,php-fpm 在 /tmp/ 目录创建临时文件失败,导致进程退出,页面响应 502

 

4、看下 /tmp/ 目录 属主及权限,OMG,运维部署时忘记修改 node2 /tmp/ 目录权限了,因为 php-fpm 进程属主是 www,导致无法在此目录写文件

[mlcdm@node2 ~]$ stat /tmp/File: ‘/tmp/’Size: 61440           Blocks: 128        IO Block: 4096   directory
Device: fd01h/64769d    Inode: 524291      Links: 12
Access: (0700/drwx------)  Uid: ( 1003/   mlcdm)   Gid: ( 1003/   mlcdm)
Access: 2024-07-24 15:00:24.774052000 +0800
Modify: 2024-07-24 15:16:39.705052000 +0800
Change: 2024-07-24 15:16:39.705052000 +0800Birth: -

 

5、修改 /tmp/ 目录权限,这里为什么是 1777 ,是因为需要让 /tmp/ 保持粘滞位特权,表示任务用户都可以在 tmp 目录创建文件,但是只能由文件的创建者root 才能删除

[mlcdm@node2 ~]$ sudo chmod 1777 /tmp/

 

三、总结

1、当页面响应 502 时,多半是网关程序(CGI)异常,比如服务未启动,异常退出等原因导致的,可着重排查CGI程序
2、strace 命令功能强大,对了解进程具体做了哪些系统调用很有帮助
3、linux 用户权限是遇到问题时第一个想到一个点,可以参考鸟哥的私房菜用户权限章节

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772014.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql8: 新建账号和权限操作

一,允许从任何ip访问时,用% CREATE USER myusername@% IDENTIFIED BY my_password;GRANT ALL PRIVILEGES ON `mybase`.* TO myusername@%;FLUSH PRIVILEGES; 注意:这种做法在生产环境中不要使用,不够安全, 只用于内部开发时工程师共同访问的内部环境 二,授权的例…

windows中MySQL迁移数据存放盘符位置

由于刚开始安装mysq时都选择了默认安装,数据存放在了c盘,后面数据量过大c盘不堪重负,所以迁移数据到D盘windows中MySQL迁移数据存放盘符位置 参考:https://blog.csdn.net/ZYX121799/article/details/136474869查看MySQL的数据存放位置 show global variables like "%d…

前端性能优化实践方向与方法

前端性能优化实践方向与方法0x01 代码优化与压缩 (1)HTML移除不必要的空白字符、注释和冗余标签,以减少文件大小使用命令 npm install html-minifier -g 安装 HTML Minifier使用命令 html-minifier -V 确认安装成功在 Node.js 环境中配置 index.js // 引入 HTML Minifier co…

【YashanDB知识库】开源调度框架Quartz写入Boolean值到YashanDB报错

问题现象 Quartz 是一个广泛应用于企业级应用中的开源作业调度框架,它主要用于在Java环境中管理和执行任务。 为了任务调度,Quartz的数据模型中使用了大量的布尔值记录任务、流程的各种状态,如:Quartz使用JDBC写入任务状态代码: ps = conn.prepareStatement(); setBoolean…

jmeter 测试getpost请求测试遇到的问题

GET请求Get请求的参数要写在Url后面,不能写在请求体POST请求post请求验证除了cookie之外,可能还会有token,需要加到http请求头里面提示说是会话校验失败,猜测是cookie失效或者是少了参数,查看请求post请求Content-Type和实际接口不符合,接口返回415错误服务器返回415,表…

01HTML+CSS

今日正式开始学习前端,学习内容有 1.标签的写法:标签分为单标签和双标签,其中他们都是由尖括号组成<>,例如:加粗标签<strong></strong>,倾斜标签<em></em>,下划线标签<ins></ins>,删除线标签<del></del>。 2.HT…

24数据安全产业人才积分争夺赛

Wireshark2.1 题目内容:存在漏洞的PHP页面名称是?(比如:a.php) 直接搜索php所以flag: theanswerishere.php Wireshark2.2 题目内容:当前表的列数共有几列?(比如:1)找到了 所以flag:3 Wireshark2.3 题目内容:注入目标的列名是?所以flag:th1sfI4g 错的,要加flag{}…

MySQL入门---(一)SQL的DDL语句

1.管理员身份进入命令行窗口:win+r cmd 然后不要直接点,按ctrl+shift+enter管理员模式进去,点确定 2.MySQL数据库启动:net start mysql80 停止:net stop mysql80 3.系统自带的命令行工具执行指令:mysql -u root -p 1.SQL通用语法:2.DDL语句3.表结构查询:4.创建表结构…

《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇

1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等。所以宏哥打算按上传文件的分类对其进行一下讲解和分享。 2.上传文件的API(input控件) Playwright是一个现代化的自动化测试工具,它支持多种浏览器和操作系统,…

ceph数据重构原理

在分布式存储系统Ceph中,硬盘故障是一种常见问题。为了保证数据安全,当发生硬盘故障后,分布式存储系统会依据算法对故障硬盘上的数据进行数据重构及转储。和一般分布式系统一样的是,Ceph同样使用多副本机制来保证数据的高可靠性(注:EC在实现层面可以理解为副本机制的一种…

服务网关-GateWay-微服务核心组件【分布式微服务笔记05】

服务网关-GateWay-微服务核心组件【分布式微服务笔记05】 服务网关-GateWay 引出GateWay 当我们后端的服务部署在不同的ip和端口上,存在一些问题:前端项目需要维护不同的后端服务ip/访问接口,非常麻烦 如果调用的是后端的集群服务,存在负载均衡问题 没有断言以及过滤机制 因…

ComfyUI插件:IPAdapter_plus(新版)节点

ComfyUI插件:IPAdapter_plus(新版)节点前言:学习ComfyUI是一场持久战,而IPAdapter_plus是常用且便捷有效的风格迁移模型,可以通过提供参考图像去进行图像的生成,比如风格迁移,风格融合,人物脸部模拟等各种工作,请大家重点关注本篇内容,深刻理解节点用法!!祝大家学习…