打开网页弹出白底黑字页面,提示“500 Internal Server Error”,附带文字服务器内部错误。和404状态码不一样,404代表访问地址不存在,500代表服务器成功接收请求,处理请求过程内部出错,无法返回页面内容。问题不在浏览器,也不是本地网络,绝大多数情况是网站服务端程序或者配置异常。
500只是笼统的状态码,不会直接说明故障位置。服务器内部可能出现各类异常:代码变量未定义、数据库连接失败、文件缺少读取权限、磁盘空间耗尽、内存不足、调用第三方接口超时,或是配置文件书写错误。这些问题都会让服务器终止响应,统一返回500。所以看到500,页面不会展示详细报错,真正的故障信息保存在服务器日志。

普通用户遇到500,能操作的手段不多。按下F5刷新页面,有些临时故障重试一次就恢复。刷新无效,等待几分钟再次尝试,部分临时性故障会自行修复。更换浏览器或者清除缓存偶尔会生效,但成功率不高。如果正在提交表单或者订单,刷新前确认操作是否提交成功,避免重复提交。网站有客服反馈渠道,把500页面链接、发生时间反馈给管理员,比简单描述网站打不开更有用。剩下的只能等待网站维护人员修复,本地操作无法修复服务器故障。
网站运维人员碰到500,优先查看日志,不要只盯着浏览器页面。Web服务器自带错误日志,Nginx的error.log、Apache的error_log,记录请求处理阶段的异常。应用程序日志同样重要,PHP错误日志、Java堆栈信息、Python报错栈,这些才是定位故障的关键。日志只记录500,没有详细信息,需要调低日志级别,输出完整错误堆栈。生产环境不会把详细错误展示给访客,但日志里必须留存完整记录。
从过往经验来看,500错误常见原因分为几类。代码层面,最近上线更新最容易引入问题,函数缺少参数、数组越界、空指针、拼写错误。数据库层面,连接数打满、查询超时、表锁定、数据库密码变更未同步,应用读取数据过程直接报错。文件权限问题,上传目录不可写、配置文件权限600,运行用户不是文件所有者、临时目录缺失,迁移部署后这类故障多发。资源层面,磁盘占满、内存耗尽、文件句柄到达上限,服务器甚至无法写入日志,500报错会频繁出现。第三方服务故障,支付接口、短信接口、缓存服务异常,应用没有做好异常降级,就会返回500。
排查可以顺着时间线推进。判断500是突发出现还是一直存在。突发故障,回忆近期是否上线代码、修改配置、改动数据库、更换服务器。一直存在,大概率是环境配置缺陷,伪静态规则写错、缺少PHP扩展、URL重写模块未开启。同时确认故障范围,单页面报错,问题基本在该页面代码或者依赖数据;全站返回500,排查Web服务、数据库连接、公共依赖这类全局组件。
部分场景下500并非应用内部故障。服务器前端部署CDN或者反向代理,代理配置错误,也会向用户返回500,源站甚至没有收到请求。还有SSL证书过期或者配置错误,部分客户端会收到500,而不是证书警告。排查时确认请求有没有到达应用服务器。
故障修复之后不要关闭日志。配置监控,500错误数量达到阈值自动告警,不用等待用户反馈。针对数据库连接、外部接口调用这类高频故障点,代码增加异常捕获和降级逻辑,至少展示友好提示页面,而不是直接返回冰冷的500报错。