问题背景
服务器使用Nginx作为负载均衡,第三方先访问负载均衡地址,再转发到实际服务器
第三方访问时卡死,最后出现了504 Gateway Timeout(网关超时)
处理过程
1、排查Nginx网关
通过搜索发现,504问题出现的原因有:
- 后端服务响应时间过长:服务器处理请求需要更多时间,超出了代理服务器的等待时间。
- 网络延迟:网络不稳定导致数据传输中断。
- 配置错误:代理服务器(如 Nginx、Apache)或负载均衡器的超时时间设置不当。
- 服务器过载:后端服务器的资源不足,无法及时处理请求。
1.1 查看Nginx超时时间
通过nginx.conf文件,可以看到超时时间设置的很长,不应该是超时时间的问题。
http {
...
keepalive_timeout 6000;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
proxy_connect_timeout 600s;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
...
}
-
keepalive_timeout 6000;
Nginx与客户端之间的连接保持活动的超时时间,单位是秒。 -
fastcgi_connect_timeout 600;
Nginx与FastCGI服务器(如PHP-FPM)建立连接的超时时间。 -
fastcgi_send_timeout 600;
Nginx向FastCGI服务器发送请求的超时时间。 -
fastcgi_read_timeout 600;
Nginx从FastCGI服务器读取响应的超时时间。 -
proxy_connect_timeout 600s;
Nginx与后端代理服务器建立连接的超时时间。 -
proxy_send_timeout 1200;
Nginx向后端代理服务器发送请求的超时时间。 -
proxy_read_timeout 1200;
Nginx从后端代理服务器读取响应的超时时间。
1.2 查看Nginx错误日志
日志文件通常位于/var/log/nginx/error.log,可以使用以下命令查看最新日志:
tail -f /var/log/nginx/error.log
拿到日志后发现是上游服务器的问题
2024/12/27 09:39:12 [error] 2273570#2273570: *29697090 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 客户端IP地址, server: Nginx服务器地址, request: "请求信息", upstream: "上游服务器信息", host: "请求被发送到的Nginx服务器的主机名和端口"
2、排查上游服务器
通过服务器日志发现,可能是锁表导致的,于是登录数据库查询锁表
2.1 查询锁表信息的SQL
查询被锁的表和相关信息
SELECT b.owner, b.object_name, a.session_id, a.locked_mode
FROM v$locked_object a, dba_objects b
WHERE b.object_id = a.object_id;
OWNER
:数据表的所有者用户OBJECT_NAME
:被锁住的表名SESSION_ID
:会话IDLOCKED_MODE
:锁级别。
查看是哪个session引起的锁
SELECT a.OS_USER_NAME, c.owner, c.object_name, b.sid, b.serial#, logon_time
FROM v$locked_object a, v$session b, dba_objects c
WHERE a.session_id = b.sid
AND a.object_id = c.object_id
ORDER BY b.logon_time;
杀掉对应进程
ALTER SYSTEM KILL SESSION 'sid,serial#';
2.2 优化相关代码
至此,问题已解决