代理服务器错误 407、502、504 和 tunnel failed:新手分步排查指南
引言:你能从本指南获得什么
如果你在使用移动代理,迟早会在采集器日志、指纹浏览器控制台或广告后台窗口中看到类似「407 Proxy Authentication Required」「502 Bad Gateway」「504 Gateway Timeout」或简短吓人的「tunnel failed」这样的字样。此时,代理服务器错误就像一个黑匣子:不清楚是代理本身的问题、你的软件的问题、目标网站的问题,还是仅仅密码过期了。本指南将黑匣子变成清晰的行动方案。
我们有意限定范围:只讲解代理层返回的错误码和消息。连接级别的网络超时(完全无响应、由客户端自行终止等待)在博客中另有文章详解,这里不再赘述。如果你日志里出现的是具体错误码或关于 tunnel 的提示,那你看对文章了。
最终你能收获什么
- 理解这四种错误各自的含义,以及它们分别诞生在「你的软件—代理—目标网站」链条的哪个环节。
- 学会在两三分钟内用任何系统自带的 curl 工具定位问题源头。
- 获得应对 407、502、504 和 tunnel failed 的完整操作流程,可以当成清单逐项执行。
- 让你的软件对每种错误码做出正确反应:有的错误需要重试,有的重试毫无意义。
- 建立个人故障日志,下次出问题时能节省数小时。
适合谁阅读
本指南面向营销人员、联盟营销从业者、小型团队负责人和开发者,他们使用移动代理,但不一定是网络工程师。主体内容针对新手:每条命令都有解释,每个操作都有步骤。对于自己写脚本、想更深入的人,文末有专门的进阶板块。
需要提前掌握的知识
只要会打开终端或命令提示符、往里粘贴文字并能看懂结果就够了。了解什么是 IP 地址和端口会有帮助,我们也会简要提醒。不需要编程经验。
预计耗时
通读全文并完成第一次排查需要 60 到 120 分钟。如果你现在正遇到某个具体错误,直接跳到对应步骤即可:处理每一种错误,加上检查,大概需要 15-25 分钟。
准备工作:工具和权限
排查代理层错误不需要安装大型软件,几乎所有工具你的操作系统里都有。不过还是提前准备一下,免得故障发生时到处找密码、想不起配置文件在哪。
必需工具
- 终端或命令提示符。Windows 10 和 11 中,打开「开始」菜单,输入「cmd」或「PowerShell」,回车。macOS 中打开「应用程序」,再打开「实用工具」,然后打开「终端」。Linux 中终端通常用 Ctrl+Alt+T 调出。
- curl 工具。Windows 从 10 版本(1803 构建)起自带,macOS 和大多数 Linux 发行版也自带。验证方法:在终端输入
curl --version并回车。应该出现版本信息行,例如「curl 8.x.x」。如果提示找不到命令,用你的系统的包管理器安装 curl。 - 普通浏览器,带开发者工具。任何现代浏览器都行,按 F12 打开面板,切到「Network」(网络)标签。
- 文本编辑器,用来记录故障日志。记事本也行,但带语法高亮的更舒服,能看清日志结构。
- 你的工作软件:指纹浏览器、采集器、广告账号管理器或自己的脚本。我们需要能访问它的代理设置和日志。
必需的访问权限
- 登录代理服务商的后台。对 mobileproxy.space 用户来说,就是管理渠道的页面,能看到主机、端口、用户名、密码、认证类型以及换 IP 链接。
- 至少一个代理的当前凭据:地址(主机)、端口、用户名和密码,或用于 IP 认证的已确认 IP。
- 了解你用的是哪种协议:HTTP(S) 代理还是 SOCKS5。这个信息后台也能看到。
系统要求
过去八年内发布的任何操作系统都行。能访问代理主机的网络连接。其他什么都不需要。
备份
在修改工作软件的代理设置之前,先保存当前状态。五分钟就能搞定,能避免「你治好了错误,同时也弄丢了十个账号的可用配置」这种局面。
- 在指纹浏览器里,导出配置文件列表及其代理设置。导出功能通常在配置文件菜单里,会生成 CSV 或 JSON 文件。
- 在采集器或脚本里,把配置文件复制到另一个文件夹,文件名带日期,例如「config_backup_2026-03-14」。
- 从后台把所有渠道的凭据复制到文本文件。把这个文件放在别人无权访问的地方。
- 记下你电脑或服务器当前的 IP。如果你用 IP 地址认证,会用到它。
建议:建一个名为「代理日志」的文本文件,每次错误都按「日期、时间、错误码、代理主机、目标网站、我做了什么、什么起了作用」的格式记录。一个月后你就有了个人知识库,比任何文章都管用。
检查:终端能打开,curl 命令能显示版本,你已经登录后台并看到至少一个代理的凭据,配置备份放在单独文件夹里。可以继续了。
基础概念:代理层的结构和错误码的来源
要想有逻辑地修复代理服务器错误,而不是靠瞎试,就得理解请求的路径。它由三段组成,我们的四个错误分别出在不同的段上。
请求路径的三段
- 客户端—代理。你的浏览器、采集器或脚本连接到代理的主机和端口。这一段检查认证。407 错误和部分 tunnel failed 就诞生在这里。
- 代理—移动网络—目标网站。代理服务器收到你的请求后,以自己的名义通过带运营商 SIM 卡的调制解调器连接到目标网站。502 和 504 在这里出现。
- 目标网站—回程。网站的响应沿同样的节点返回。如果网站返回了自己的错误码,比如 403 或 429,那已经不是代理层的错误了,学会区分它们很重要。
用大白话说错误码的分类
响应码是服务器在响应第一行发送的三位数字。第一位代表类别。4xx 表示「问题在你这边,改改请求」。5xx 表示「问题在服务器或其后端」。对代理层来说是这样:
- 407 Proxy Authentication Required — 代理说:「我不知道你是谁,或者你的数据不对」。4xx 类别:要在自己这边修。
- 502 Bad Gateway — 代理说:「我试着往下游连了,但收到的是断开或乱码,不是响应」。5xx 类别:问题在代理之后或代理本身。
- 504 Gateway Timeout — 代理说:「我等下一跳的响应等到超时了」。同样是 5xx。
504 和网络超时有什么区别
这是全文最关键的一个区分。当你看到错误码 504,说明代理服务器活着,接收了你的请求,自己等待了网站响应,然后自己把失败告诉你。你和代理之间的连接此时工作得完美无缺。而当你的客户端写「connection timed out」或「operation timed out」且没有错误码时,说明根本没收到响应,断开是你的软件自己发起的。前者是本文的主题,后者是另一篇文章的内容,详见博客相关材料。简单的判断方法:响应里有三位数字——继续往下读这里。
什么是隧道,为什么会「失败」
当你通过 HTTP 代理打开 HTTPS 网站时,浏览器先向代理发送特殊的 CONNECT 命令,带上目的地址和端口。代理与网站建立连接,并回应「200 Connection established」。之后通过代理传输的是加密流,代理本身不再读取。这种连接就叫隧道。如果代理对 CONNECT 命令的回应不是 200,客户端就会写「tunnel failed」,旁边通常还会注明收到的是哪个错误码。所以 tunnel failed 不是独立的错误,而是某个错误码的外壳。
两种认证方式
- 用户名和密码。客户端在 Proxy-Authorization 请求头里传递。最常见的方式,也是 407 最常见的来源。
- 按 IP 认证。你提前在后台登记自己电脑或服务器的地址,代理就会放行来自该地址的所有请求,无需密码。方便,但你的 IP 一变就会失效。
能看出响应作者的服务头
代理通常会在响应里加上 Via、Proxy-Agent 或 X-Proxy 请求头。目标网站不会设置它们。如果带 502 的响应里有 Proxy-Agent,你就确切知道是代理回的。如果没有这些头,而有 Server 加上网站服务器名称,那就是网站本身的响应。我们会积极利用这个特征。
建议:记住一条口诀:「四开头找自己,五开头找代理后面,隧道先看旁边的数字」。这一条能解决一半的情况,不用再往下读。
第 1 步:确定到底是谁返回了错误
本阶段目标:在几分钟内准确判断是代理服务器、目标网站还是你自己的软件回了你,并记录完整的响应文本用于后续工作。
操作步骤
- 打开后台,复制出问题代理的凭据:主机、端口、用户名、密码。举例我们假设主机是 proxy.example.net,端口 8080,用户名 user1,密码 pass1。请替换成你的值。
- 打开终端。
- 输入命令,替换凭据和目标地址,回车:
curl -v -x http://user1:pass1@proxy.example.net:8080 https://example.com/。参数 -v 开启详细输出,-x 指定代理。 - 等命令执行完。通常一到三秒。如果命令「挂」了超过 30 秒,按 Ctrl+C:多半是网络超时而不是错误码,不是本文主题。
- 在输出里找以「>」开头的行(curl 发送的内容)和以「<」开头的行(收到的响应)。响应的第一行会是类似「HTTP/1.1 407 Proxy Authentication Required」或「HTTP/1.1 200 Connection established」。
- 看标有 CONNECT 的那一行。如果紧随其后收到的是非 200 的错误码,说明错误是代理在隧道阶段返回的。如果 CONNECT 得到 200,而错误码出现在 TLS 握手相关行之后,那返回的就是目标网站了。
- 查找响应头。有 Proxy-Agent、Via 之类的服务头,就明确是代理。有 Server 加网站服务器名、有 Set-Cookie,就指向目标网站。
- 把同一条命令去掉 -x 参数再跑一遍,也就是直连:
curl -v https://example.com/。如果网站返回 200,而通过代理返回 5xx,问题就定位在代理之后的环节。 - 再通过代理访问另一个网站,比如任何一个稳定的大型资源。如果第二个网站能打开,问题跟具体目标有关,而不是代理整体。
- 把完整输出连同日期时间复制进代理日志。后续步骤会用到它。
通过浏览器的替代方法
如果不方便用终端,打开已配置代理的浏览器,按 F12,切到「Network」标签,勾选「Preserve log」(保留日志),刷新页面。在请求列表里找红色错误码那一行,点击它,在「Headers」标签里看「Response Headers」区块。逻辑一样:找代理的服务头。这个方法的缺点在于浏览器经常隐藏 CONNECT 阶段的细节,所以对 tunnel failed 来说终端更合适。
注意:带 -v 参数的命令会把代理用户名和密码以明文输出。不要把这份输出贴进公共聊天、工单或截图,除非把密码替换成星号。
建议:给命令加上 -sS 和 -o 指向空设备,避免响应体刷屏:curl -sS -v -o /dev/null -x http://user1:pass1@proxy.example.net:8080 https://example.com/。Windows 下用 NUL 代替 /dev/null。
预期结果
日志里出现了带完整响应的记录,你能有把握地说出以下三种之一:「代理在认证阶段返回的」「代理在访问网站阶段返回的」或「网站自己返回的」。这会把你引向第 2 步、第 3-4 步,或者超出本文范围。
可能遇到的问题
- 命令提示「Could not resolve proxy」。主机拼错了。逐字符对照后台核对。
- 命令提示「Failed to connect to proxy」。端口关闭或不对。这是传输问题,不是错误码,检查端口并换个渠道试试。
- 输出在 TLS 行处断开且无错误码。说明隧道建立了,但网站没在你的客户端超时内响应。别和 504 搞混:没有错误码,就不是本文的情况。
检查:你能说出响应的作者和确切的错误码或短语,且 curl 输出行已保存在日志里。
第 2 步:解决 407 Proxy Authentication Required 错误
本阶段目标:让代理对 CONNECT 命令回应「200 Connection established」而不是 407,并搞清原因,避免错误再次出现。
为什么会出现 407
代理没有接受你的凭据。原因通常有六种,我们按由易到难依次检查:拼写错误、密码含特殊字符、按地址认证时 IP 变动、渠道过期、软件根本没传数据、浏览器缓存了旧数据。
操作步骤
- 打开后台,找到出问题的渠道。确认它没有过期且状态是活跃的。如果已过期,续费后一分钟再重试;这种情况不用往下走。
- 检查该渠道启用了哪种认证方式:用户名密码还是按 IP 地址。很多面板允许同时启用两种。
- 如果启用了按 IP 认证,查出你电脑或服务器当前的外网地址。用浏览器直连(不走代理)打开任何显示 IP 的服务,和后台登记的地址对比。家庭宽带和移动运营商会经常在重启路由器后改变地址。如果地址不一致,在后台更新它,等一两分钟:更改不会立即生效。
- 如果用的是用户名密码,从后台重新复制它们,不要手打。粘贴进第 1 步的 curl 命令里执行。一半的 407 问题到这里就结束了。
- 看看密码。如果里面有 @、:、/、#、?、% 或空格,在地址字符串里传递时需要对它们编码。@ 变成 %40,冒号变成 %3A,井号变成 %23,百分号变成 %25。例如密码 p@ss:1 在 URL 里写成 p%40ss%3A1。不想编码的话,用单独的参数传递:
curl -v -x proxy.example.net:8080 --proxy-user user1:p@ss:1 https://example.com/。这里 curl 会自己处理特殊字符。 - 如果 curl 能通过,而你的工作软件仍然收到 407,问题出在软件本身。打开它的代理设置。确认用户名和密码填在单独的字段里,而不是如果程序不期望的话粘在地址上。检查密码末尾有没有空格:复制时经常会带上。
- 在指纹浏览器里打开特定配置文件的设置,而不是全局设置。很多用户改了代理总列表里的密码,但配置文件还存着旧副本。在配置文件里重新保存代理并重启配置文件。
- 如果浏览器记住了旧数据不询问新数据,在浏览器设置里清除该主机的已保存密码,或新建一个配置文件来测试。
- 注意 407 响应里的 Proxy-Authenticate 头。如果写的是「Basic」,说明代理期待常规的用户名密码对。如果写的是其他方案,你的软件必须支持它;对移动代理来说几乎总是 Basic,不一致就说明代理类型设置有误。
- 重跑 curl 请求,确认现在 CONNECT 返回 200。
注意:不要试图用批量重试来「解决」407。有些代理服务器在多次认证失败后会临时封禁地址,你会在原有问题之上再添一个。一次检查、一次修正、一次验证。
建议:如果你有几十个渠道,用表格管理,用户名和密码各占一列,旁边再有一列放已为 URL 编码好的密码。这样你永远不会搞错哪个版本该往哪儿放。
预期结果
curl 输出里 CONNECT 的响应行变成了「HTTP/1.1 200 Connection established」,网站返回了内容。工作软件里的请求也能通过。日志里写下了原因:拼写错误、编码、IP 变动、过期或缓存。
可能遇到的问题
- 407 出现两次:先是在 CONNECT 上,然后在隧道内部。这是软件只在其中一个阶段发送数据的迹象。更新程序,或打开其中关于在 CONNECT 时传递认证的选项。
- 后台说 IP 已添加,但 407 依旧。你可能在公司网络或有多出口的服务器上工作。要从实际发出请求的机器上检查地址。
- 你这边能行,同事用同样数据不行。按 IP 认证时这是正常的:同事的地址不一样。改用用户名密码或添加第二个 IP。
检查:连续三次通过 curl 和工作软件的请求都没有 407,原因已记入日志。
第 3 步:处理代理返回的 502 Bad Gateway 错误
本阶段目标:区分换 IP 瞬间的短暂故障与方向或渠道的持续问题,并为每种情况选择正确的处理方式。
为什么代理会返回 502
代理接收了你的请求,试图往下游建立连接,结果遇到断开、拒绝或无法解析的响应。对移动代理来说,典型原因有:调制解调器此刻正在切换 IP 或在运营商网络里重新注册;目标网站重置了连接;代理端无法解析网站域名;渠道同时承载的流数过多而过载;网站对所有用户都不可用。
操作步骤
- 记录 502 出现的精确时间,精确到秒。下一步会用到。
- 在后台查看该渠道的换 IP 历史记录,或回想是否开启了按计划自动轮换。如果轮换和错误发生在同样的秒数,说明你遇到的是正常现象:在地址切换期间的两到十秒内,请求会收到 502。解决办法是暂停后重试。
- 等十秒,重跑第 1 步的 curl 命令。如果响应变成 200,在日志里写「轮换瞬间的 502」,然后去第 6 步配置重试。
- 如果 502 持续反复,用同一个代理访问另一个网站。能打开——问题在目标方向。打不开——问题在渠道。
- 针对目标方向的问题:不用代理直连目标网站。如果直连也不可访问或返回 5xx,跟代理无关:网站挂了。如果直连一切正常,网站可能在断开来自该运营商地址的连接。用后台的换 IP 链接更换 IP 后重试。如果无效,换另一个运营商或地区的渠道试试。
- 针对渠道的问题:在后台检查设备状态。很多服务商有调制解调器状态指示灯。红色或黄色表示渠道正在恢复,只能等或切换到备用渠道。
- 检查负载。看看你的软件里有多少并发流经过这个渠道。移动渠道带宽有限,几十个并发连接时,代理会正好以 502 开始拒绝部分请求。把并发数减半再测试。
- 检查是否和 DNS 有关。如果网站允许,改用 IP 地址访问而不是域名,或者切换到 socks5h 方案(由代理解析域名),对比结果。如果按域名 502 而按 IP 正常,就是代理端解析域名的问题;把确切的域名告诉服务商。
- 如果 15 分钟内都没解决,收集 curl -v 输出、时间、渠道主机、目标域名,发送给服务商支持。信息收集得好,解决时间能从一天缩短到一小时。
建议:使用按计划轮换时,提前把软件里的暂停和换 IP 间隔对齐。如果地址每 5 分钟变一次,就让采集器在每个五分钟开始的时刻暂停 15 秒。不用写一行复杂代码,502 的数量就能几乎降到零。
预期结果
你准确知道你的 502 属于哪一类:轮换瞬间、特定目标、渠道过载、设备故障或网站不可用。前三类你有修复方法,后两类你知道该等什么、该找谁。
可能遇到的问题
- 只有下载大文件时才出现 502。网站因上传速度慢而关闭连接。减小请求数据的大小,或使用覆盖更好的渠道。
- 502 是网站返回的,不是代理。检查响应头:如果有网站的 Server 而没有 Proxy-Agent,是网站内部故障,稍后重试。
- 502 和 200 交替出现,看不出规律。典型的渠道过载迹象。降低并发直到结果稳定。
检查:通过问题渠道向稳定网站连发十次带两秒间隔的请求都返回 200,或者你手上已经有带完整数据的支持工单。
第 4 步:处理 504 Gateway Timeout 错误
本阶段目标:弄清代理解之后哪个环节在丢时间,把 504 的比例降到可接受水平,同时不把错误码和客户端网络超时搞混。
代理返回 504 到底意味着什么
代理服务器本身对网站响应有内部等待上限。当网站来不及在这个上限内响应时,代理就停止等待,并诚实地用 504 告诉你。此时你的客户端并没有断开连接,响应是收到了的。正因如此,你软件里的等待上限必须大于代理的上限:否则你只会看到没有错误码的网络超时,无法搞清楚怎么回事。
操作步骤
- 检查你软件里的等待上限。大多数程序里它叫 timeout、「响应等待时间」或「Read timeout」。如果小于 30 秒,暂时设为 60。这是诊断步骤:你需要等到代理返回的错误码。
- 测量通过代理的响应时间。执行:
curl -sS -o /dev/null -w "%{http_code} %{time_connect} %{time_starttransfer} %{time_total}" -x http://user1:pass1@proxy.example.net:8080 https://example.com/。参数 -w 输出四个数字:错误码、连接耗时、首字节耗时和总耗时(秒)。 - 把同一条命令去掉 -x 参数执行。对比首字节时间。如果直连网站 0.4 秒响应,通过代理要 8 秒,说明「代理—网站」段延迟很大,移动网络一波动就会出现 504。
- 检查 504 出现在哪个请求上。用 HEAD 方法发起请求,它不加载页面正文:
curl -I -x http://user1:pass1@proxy.example.net:8080 https://example.com/。如果 HEAD 能过而 GET 整页返回 504,问题在体积或页面生成慢,而不在连接本身。 - 用后台的换 IP 链接更换渠道 IP。移动网络不均衡:一个地址可能连到过载基站,另一个连到空闲的。重新测量。如果时间降到几倍以下,就在软件里加条规则:遇到 504 先换 IP 再重试。
- 检查目标页面的重量。有些网站要执行冗长的服务器操作后才返回响应。如果你的目标是具体数据,试试访问同站更轻的地址:API、移动版、不带排序参数的页面。
- 如果 504 只针对某个特定域名且只通过某个运营商的渠道出现,记入日志,把这个域名的工作转移到其他运营商的渠道上。
- 把软件里的等待上限调回工作值,但这次是有意识的:它应该略大于通过代理的典型响应时间,又小于你在任务中愿意等待的时间。对大多数场景来说是 30-45 秒。
注意:不要「以防万一」把软件等待上限设成几分钟,也不要长期保持那样。一个卡住的流会占住队列里的位置,十个卡住的流就会造成代理不工作的假象,而问题其实在一个慢网站上。
建议:在软件日志里加一列「首字节时间」。通过它能看出渠道是在逐渐退化还是突然崩掉。逐渐上升意味着过载或覆盖差,突然下降多半说明轮换或运营商故障。
预期结果
你知道通过每个渠道的典型响应时间,把软件里的上限设得比代理上限高,504 成为少见事件,并有自动应对。
可能遇到的问题
- 你调高了上限,结果 504 变成了网络超时。说明代理等的比你想象的久,或者与代理的连接不稳定。这已经超出错误码范围,请看关于超时的相关材料。
- 504 只出现在特定时段。移动网络晚高峰过载。把重活挪到夜间或清晨。
- 第一次访问新网站时 504,之后都很快。代理端首次解析域名和建立连接。正式批量前加一次预热请求。
检查:对工作网站连发二十次请求,首字节时间在可预测范围内,504 不超过一两个,且软件遇到 504 会换 IP 并重试。
第 5 步:解决 tunnel failed 错误
本阶段目标:学会读懂 tunnel failed 旁边的数字,把它和真正的原因对应起来,并修正协议、端口和代理类型的设置。
长什么样,是什么意思
在 curl 里消息长这样:「CONNECT tunnel failed, response 407」。在浏览器和指纹浏览器解决方案里,可能是「Proxy tunnel failed」「Unable to establish tunnel」或「Tunnel connection failed」。共同点是:客户端发送了 CONNECT 命令,而代理回应不是 200。旁边的数字就是那个错误码,处理方法和前面几步一样,只是多几个仅在隧道阶段才出现的特殊情况。
操作步骤
- 用带 -v 参数的 curl 请求 HTTPS 地址,找到 tunnel failed 那一行。记下 response 后面的数字。
- 如果是 407,回到第 2 步。唯一区别:确认软件是在 CONNECT 阶段传递认证的。一些旧版程序里的「代理认证」勾选框只对 HTTP 请求生效,隧道则不带密码发出。
- 如果是 502 或 504,回到第 3 和第 4 步。代理无法建立与网站 443 端口的连接,或没等到它响应。
- 如果是 403,代理拒绝向指定端口或主机建立隧道。检查你连的是哪个端口。移动代理通常允许到 443 和几个常见端口的隧道。如果你的服务监听非标准端口,向后台或服务商确认是否允许。
- 如果是 400,代理看不懂命令。最常见的原因是你把 SOCKS5 代理当成 HTTP 配置,或反过来。打开后台看发给你的是哪种协议和端口。很多服务商给同一渠道的 HTTP 和 SOCKS5 用的是不同端口。
- 修正命令里的方案。对 SOCKS5 使用:
curl -v -x socks5h://user1:pass1@proxy.example.net:1080 https://example.com/。socks5h 里的 h 表示由代理解析域名,而不是你的电脑。对移动代理来说这是首选方案。 - 如果在指纹浏览器里,打开配置文件的代理设置,找到类型下拉框:HTTP、HTTPS、SOCKS5。选后台标注的那个,并检查端口。保存后完全重启配置文件,而不是只刷新标签页。
- 如果 tunnel failed 旁边没有数字,只有短语,就在软件里打开扩展日志,或通过 curl 复现,以获得错误码。
- 检查你的软件是否试图与代理本身建立 TLS 连接。有些程序在选择「HTTPS」类型时不仅加密到网站的流量,还加密到代理的连接。如果代理不支持,你会得到 tunnel failed 或握手错误。切换到「HTTP」类型来连接代理:到网站的流量在隧道里依然是加密的。
- 重跑测试,确认 CONNECT 得到 200 且页面加载成功。
建议:把两个简短的测试请求纳入日常:一个通过 HTTP 访问某地址,另一个通过 HTTPS 访问同一地址。如果第一个能过第二个失败并报 tunnel failed,你就能立刻明白问题在隧道,而不在认证或渠道。
预期结果
tunnel failed 从日志里消失,每个渠道都记录了正确的类型和端口,软件里没有开启多余的到代理的加密。
可能遇到的问题
- 隧道建立了,但随后报证书错误。这已经不是代理层了:是网站或你的系统证书集。检查电脑的日期和时间。
- curl 能行,软件用同样数据不行。软件用了不同的方案或加了自己的前缀。查阅它关于代理字符串格式的文档。
- tunnel failed 只针对一个网站。网站用了非标准端口,回到关于 403 的那一步。
检查:通过 curl 和工作软件的 HTTPS 请求都让 CONNECT 返回 200,所有渠道的类型和端口都记在表格里。
第 6 步:为每种错误码配置正确的软件反应
本阶段目标:让代理服务器错误自动处理:有的带暂停重试,有的立即报警,你看到的是清晰的日志,而不是一片红色错误行。
原则:不是所有错误都一样
遇到 407 重试毫无意义:密码不会因为重试就变对。遇到轮换瞬间的 502 必须重试:五秒后就正常了。遇到 504 最好换 IP 后重试。这三条规则构成了健康错误处理的基础。
现成软件的操作步骤
- 打开采集器或账号管理器的设置,找到负责重试的区块。它可能叫「Retries」「重试次数」「错误处理」。
- 把 5xx 的重试次数设为 3,初始间隔 5 秒并翻倍递增:5、10、20 秒。这种递增叫指数退避,不会让你的软件把已经过载的渠道彻底压垮。
- 如果软件允许指定重试的错误码列表,填 502 和 504。不要把 407 放进去。
- 找到 407 时的动作设置。如果没有,把总重试次数设为最小,并打开失败请求通知。你的目标是在头几分钟就看到 407,而不是停机一天后才发现。
- 如果有换 IP 链接的字段,填入后台对应渠道的链接,并开启「出错时换 IP」或「失败时轮换」选项。
- 限制单个移动渠道的并发流数。从 3-5 开始,逐步提高,直到 502 的比例低于百分之一。
- 打开详细日志,保存响应码和请求头。确认日志里能区分代理返回的码和网站返回的码:很多程序在单独的「Proxy status」列里显示。
- 保存设置,重启软件,跑 50 次请求的测试序列。
自己写脚本的操作步骤
如果你写代码,逻辑一样。用 Python 的 requests 库写伪代码大致是这样:
proxies = {"http": "socks5h://user1:pass1@proxy.example.net:1080", "https": "socks5h://user1:pass1@proxy.example.net:1080"} for attempt in range(3): r = session.get(url, proxies=proxies, timeout=45) if r.status_code == 407: alert("auth failed") break if r.status_code in (502, 504): rotate_ip() sleep(5 * 2 ** attempt) continue break注意三点。第一:遇到 407 我们立即跳出循环并发送通知。第二:遇到 502 和 504 先换 IP,再等待递增的暂停。第三:timeout 值选得能等到代理返回错误码,而不是提前断开。
注意:有些库在 CONNECT 阶段的错误不是以带错误码的响应形式出现,而是以异常形式抛出,文本里含 tunnel failed 和数字。要单独捕获这类异常并从中提取错误码,否则你的重试逻辑不会生效。
建议:按渠道统计每天各错误码的比例,输出成简单表格。5xx 比例持续高于其他的渠道应该优先检查,即使它形式上还能用。
预期结果
软件在 502 和 504 时自动带递增暂停和换 IP 重试,遇到 407 立即通知,限制并发流数,并记录区分代理码和网站码的日志。
可能遇到的问题
- 软件连 407 也重试,导致代理临时封禁地址。完全关闭 4xx 的重试,或把总重试次数降到一次。
- 开启出错时轮换后 IP 变得太频繁。设置换 IP 的最小间隔,比如 60 秒,避免一串 502 触发五次连续轮换。
- 日志膨胀到 GB 级。只对带错误码的响应写请求头,200 的只存一行。
检查:50 次请求的测试序列无需手动干预就完成,日志里能看到 5xx 的 5、10、20 秒递增暂停重试,而填入错误密码时软件停止并输出 407 通知。
结果验证:检查清单和测试
逐项对照清单,每一项都打勾。只要有一项没做到,回到对应步骤。
检查清单
- 带 -v 参数的 curl 命令能执行,你会从输出里找到 CONNECT 的响应行和代理的服务头。
- 每个渠道在表格里都记录了主机、端口、协议类型、认证方式和编码后的密码。
- 按 IP 认证时,你机器当前的地址和后台登记的一致。
- 通过每个渠道的 HTTPS 请求都能让 CONNECT 返回 200。
- 已测量通过每个渠道的典型首字节时间,软件里的等待上限高于它并留有余量。
- 软件里只对 502 和 504 配置了重试,暂停为 5、10、20 秒,重试前换 IP。
- 遇到 407 时软件停止并通知。
- 每个渠道的流数受限,测试序列里 5xx 比例低于百分之一。
- 故障日志在维护,且至少有一条完整分析的记录。
测试方法
- 故意填错密码并发一次请求。预期:curl 里是 407,软件里是通知,没有一串重试。
- 改回正确密码,向稳定网站发 30 次请求,间隔一秒。预期:全部 200,或最多一个 5xx 且重试成功。
- 序列进行中,在后台点击换 IP 链接。预期:日志里有一两个 502,随后自动重试并继续序列。
- 把一个标注为 HTTP 的渠道设置成 SOCKS5 类型并发请求。预期:tunnel failed 或协议错误,你一秒就能认出来。改回正确类型。
成功指标
工作序列里代理层错误的比例不超过百分之一到二,每个错误都按错误码分类,除 407 外没有一个需要手动干预。对 407 的反应时间是分钟级,而不是小时级。
常见问题与解决
问题:每次重启路由器后都出现 407
原因:用的是按 IP 认证,而运营商给的是动态地址。
解决:改用用户名密码认证,或两种方式都启用。如果必须用 IP,向运营商申请静态地址。
问题:密码是对的,浏览器里 407 但 curl 能过
原因:浏览器或指纹浏览器配置文件缓存了旧数据。
解决:在具体配置文件设置里重新保存代理并重启配置文件,必要时清除代理主机已保存的密码。
问题:每 N 分钟准时报 502
原因:和自动轮换 IP 的间隔吻合。
解决:把软件的暂停与轮换计划对齐,或改用按链接在任务间隙择机换 IP。
问题:流数多时 502,流数少时一切正常
原因:移动渠道过载。
解决:把并发降到每渠道 3-5 个流,并把负载分散到多个渠道。
问题:504 只出现在一个网站上,其他都很快
原因:网站生成页面慢,或对移动运营商地址有限制。
解决:使用网站更轻的地址,重试前换 IP,问题持续就把这个网站的工作转移到其他运营商的渠道。
问题:504 变成了没有错误码的断开
原因:软件里的等待上限小于代理的内部上限。
解决:把软件上限调到你能收到错误码的值,通常 30-60 秒。
问题:tunnel failed, response 400
原因:把 SOCKS5 端口配成了 HTTP 代理,或反过来。
解决:对照后台核对类型和端口,SOCKS5 用 socks5h 方案,HTTP 用 http。
问题:tunnel failed, response 403 到非标准端口
原因:代理不允许到该端口的隧道。
解决:向服务商确认允许的端口列表,尽可能把目标服务改到 443 端口。
问题:502 或 504 响应里带网站的 Server 头
原因:这是网站本身的响应,不是代理层:网站自己的内部服务有问题。
解决:等一会儿再重试;换代理不会有帮助。
进阶用户的额外技巧
如果基础排查已掌握,下面的技巧会让代理层错误的处理几乎自动化。
手动传递认证头
有时需要检查代理对具体头的反应。用本地工具把用户名:密码对编码成 Base64,自己传头:curl -v -x proxy.example.net:8080 -H "Proxy-Authorization: Basic dXNlcjE6cGFzczE=" http://example.com/。这种方式对普通 HTTP 请求有效,能帮你判断代理到底接不接受数据,不管你的软件怎么构造。对 CONNECT 请用 --proxy-header 而不是 -H。
由代理端解析域名
socks5h 方案和 HTTP 隧道都会把域名交给代理服务器,而不是本地解析。这有两个好处:网站看到请求完全来自移动网络,你也摆脱了本地 DNS 给出一个地址而运营商网络给出另一个地址的差异。如果你只在本地解析时看到 502,切到 socks5h 常常不用找服务商就能解决问题。
通过服务商 API 自动化
mobileproxy.space 有用于换 IP 和获取渠道状态的编程接口。把换 IP 调用嵌入 504 处理器,把渠道状态检查嵌入持续 502 的处理器。这样脚本会自己决定是用同一渠道重试还是切到备用。简单算法:一分钟内连续三次 502——查询状态,渠道正常就换 IP,不正常就标记该渠道五分钟不可用并切到下一个。
分离代理和网站的指标
在监控系统里设两个独立指标:带代理服务头回来的错误码,和不带这些头回来的错误码。第一个指标反映你代理基础设施的健康状况,第二个反映目标网站的行为。只要它们混在一起,你就会在错误的地方找代理服务器错误,反之亦然。
带权重的渠道池
给每个渠道分配一个权重,每次 5xx 时降低,随时间慢慢恢复。按权重比例分配请求。这种方式会自动把负载从有问题的运营商或地区移走,等渠道恢复时再把它带回来,无需任何手动切换。
从浏览器导出 HAR
对复杂情况,在指纹浏览器里打开 Network 标签,复现错误并选择「Save all as HAR」。文件包含所有请求和响应头,包括程序普通日志里看不到的阶段。发给支持之前,从文件里删除 Proxy-Authorization 值和 Cookie。
优化等待上限
按渠道和目标收集一周的首字节时间统计。把软件里的等待上限设在 95 分位加 10 秒。这样的上限很少误断活请求,同时能在真正卡住时快速释放流。
FAQ:诊断常见问题
怎么判断 502 是代理返回的还是网站返回的?
看响应头。如果有 Proxy-Agent、Via 等代理服务头,没有网站的 Set-Cookie 和 Server,就是代理返回的。补充一点:如果错误码是随 CONNECT 响应立刻出现的,那一定是代理。
407 时该重试请求吗?
不该。凭据不会因为重试就变对,而一排失败尝试可能导致你的地址在代理侧被临时封禁。改好数据后只重试一次。
为什么 curl 能行而我的软件不行?
最常见的是软件构造代理字符串的方式不同,没有对密码里的特殊字符编码,用了不同的协议类型,或者在 CONNECT 时没传认证。把软件设置里的确切字符串和可用的 curl 命令逐字符对比。
密码里有特殊字符该怎么写?
在地址字符串里要编码:@ 写成 %40,: 写成 %3A,# 写成 %23,% 写成 %25,空格写成 %20。在单独的用户名和密码字段里按原样输入,不编码。
504 和其他文章里说的超时有什么区别?
504 是代理自己等到网站等待上限后返回的错误码。没有错误码的超时意味着你的客户端没收到任何东西就断开了。两者处理方法不同,所以放在不同材料里。
一个移动渠道可以跑多少个流?
没有通用数字。从 3-5 开始,逐步提高,直到 502 比例低于百分之一。重页面数字会小些,轻量 API 请求会大些。
每个错误都要换 IP 吗?
504 和持续 502——要,这是第一步。407——不要,换 IP 不影响认证。设置换 IP 的最小间隔,避免一串错误引发轮换雪崩。
该给支持发什么才能更快解决问题?
把密码替换成星号后的完整 curl -v 输出、精确到秒并带时区的准确时间、渠道主机和端口、目标域名、认证方式,以及不走代理直连的结果。有了这套信息,支持通常第一条回复就能解决。
连接代理本身可以用 HTTPS 吗?
只有服务商明确支持时才可以用。大多数情况下,移动代理的连接走普通 HTTP 或 SOCKS5,到网站的流量加密由隧道负责。给代理连接额外开加密会导致 tunnel failed 或握手错误。
结语
你已经从日志里一行看不懂的红色文字,走完了一套完整的排查系统。现在你能判断到底是谁返回了响应,把 407 读成检查凭据和认证方式的信号,把 502 看成代理之后或轮换时刻的故障迹象,把 504 看成代理对慢网站的诚实报告,把 tunnel failed 看成这些错误码的外壳并附带数字提示。你的软件不再做无意义的重试,也不会在临时问题前放弃。
接下来做什么
- 至少坚持记录一个月故障日志。两周内你就会发现重复出现的模式,并消除它们的根因。
- 每周复盘一次各渠道的错误码比例,重新分配负载。
- 通过服务商 API 自动化换 IP 和状态检查,让常规 5xx 无需你介入。
- 学习博客里关于网络超时和目标网站行为的相关材料,补全请求路径剩下的两段。
发展方向
下一个层次是建立自己的带权重和监控的渠道池,在那里代理服务器错误不再是惊慌的理由,而是图表上的一个点,系统会自行处理。你已经拥有所有工具:对错误码的理解、curl、服务商后台,以及记录的习惯。祝你工作顺利,200 常伴。