代理服务器返回504,很多人第一反应就是代理挂掉。但不一定。504全称Gateway Timeout,通俗解释:代理已经把请求转发出去,但是后端服务器长时间没有返回响应,代理等待超时,直接返回504。问题核心是等待超时,不是无法建立连接。它和502有本质区别,502是代理根本连不上后端,504是连接成功,只是等不到应答。
先别急着调参数,先定位问题在哪一层
504一般出现在三段链路:客户端到代理、代理到后端、后端自身业务处理。先要判断哪一段造成延迟。
简单判断方法:访问所有网站都报504,大概率代理本身异常,出口带宽耗尽,或是连接池资源耗尽。如果只有特定网站、接口出现504,其余站点访问正常,问题多在后端服务,或是代理访问这个目标站点的网络链路。

还有个容易忽略的因素:DNS解析缓慢。代理解析目标域名耗时太久,请求还没发出就触发超时。这种情况可以在代理服务器更换响应更快的DNS,例如114.114.114.114或者223.5.5.5,并且开启DNS缓存。
超时参数是最大嫌疑,但别只会调大
Nginx做反向代理时,三个超时参数直接影响会不会抛出504。
proxy_connect_timeout控制代理和后端建立TCP连接的时间,默认60秒,一般够用。proxy_read_timeout是代理发送请求之后,等待后端返回数据的时长,默认同样60秒。proxy_send_timeout控制代理向后端发送请求体的时间。
大部分504问题来自proxy_read_timeout。后端接口处理请求耗时15秒,代理设置10秒等待时间,就会抛出504。单纯调大参数可以临时缓解,但不能只靠这一招。超时从60秒改成120秒,如果后端处理需要180秒,依旧返回504,而且用户在这120秒内页面无响应,体验变差。
更合理的方式,根据接口类型差异化配置。实时查询类API,超时设置短一些,5到10秒,超时快速失败,允许用户重试;报表导出、数据同步这类耗时任务,可以设置60秒甚至更长,最好改成异步任务,前端先返回处理中提示,后台完成之后通知用户。
后端本身的问题,代理调参救不了
代理超时参数已经拉到足够大,依旧频繁504,就要排查后端服务状态。
最常见是数据库慢查询。SQL语句没有索引,扫描上百万行数据,CPU占满,接口响应从几十毫秒拉长到数秒。这种情况单纯调整代理超时没用,需要优化SQL、增加索引,或是把查询结果缓存到Redis。
后端服务负载过高也是常见诱因。并发请求上涨,线程池被占满,新请求排队,排队结束时代理早已超时。这时要么扩容机器做水平扩展,要么在代理层限流,拦截超出处理能力的请求,避免拖垮整个后端。
QQ的HTTP代理怎么配
QQ客户端支持HTTP代理,入口不难找。登录界面就能设置,不用登录之后再修改。
QQ登录框右下角找到齿轮图标,点开选择网络设置。类型下拉框默认是不使用代理,可以切换HTTP代理、SOCKS5代理或是沿用浏览器设置。
已经登录QQ的话,走另一套路径。左下角三横线主菜单,打开设置,找到网络或者连接选项卡,同样可以配置代理。
选择HTTP代理,填写三项内容:代理IP地址、端口号,如果代理需要身份校验,勾选需要验证,填入账号密码。填写完成不要直接确认,点击测试。QQ尝试通过代理连接服务器,提示代理服务器工作正常才算配置成功。
配完代理怎么确认真的生效了
测试通过不等于完全没问题。有个更可靠验证方式:开启代理登录QQ,故意输入错误密码。如果提示密码错误,说明请求经过代理转发,代理工作正常。如果直接提示连接超时、无法连接,代表代理链路不通,回头核对IP和端口。
登录成功查看QQ登录记录,安全设置或者登录设备管理页面,可以查看最近登录IP归属地。填写的代理IP在上海,登录记录显示本地城市,说明代理没有生效。
代理服务器自己出504的情况
自己搭建Squid、Nginx正向代理,客户端连接代理正常,转发请求时报504,排查思路和反向代理大体一致,但多一个要点。
Squid默认最大连接数不足。高并发场景连接数打满,新请求无法进入,排队请求等到超时拿不到后端响应。修改squid.conf调大max_filedesc,同时调高操作系统文件描述符限制。只修改Squid配置,不调整系统ulimit,参数修改不会生效。
Squid自带DNS缓存机制。默认positive_dns_ttl设置太短,域名反复解析,拖慢整体访问速度。设置为一小时左右,同时指定可靠DNS服务器,减少解析延迟。
还有一点,如果代理IP本身质量差,网络波动大,超时参数再合理也没用。优质代理响应延迟一般在10毫秒以内,这种场景反而可以缩短超时时间,失败请求快速释放资源,处理下一条请求。低质量不稳定代理,单纯上调超时,只是治标不治本。