
你是不是也遇到过这种情况:打开一个网站,没看到想看的内容,反而看到一行冷冰冰的数字——502 Bad Gateway,或者504 Gateway Timeout。
你刷新,没用。你关了重开,还是没用。你以为是网站挂了,但其实只是某个环节出了问题。
这些数字不是随机生成的,它们是HTTP状态码,是服务器在跟你说话。它告诉你:我知道你想访问,但我遇到了问题,这是问题的代号。
今天就把最常见的几个错误码聊透:它们什么意思、为什么会出现、怎么修。下次再看到,不用慌,你自己就能判断问题出在哪。
先搞清楚:状态码是分“家庭”的
HTTP状态码是三位数字,第一位数字代表类别:
- 1xx:信息,很少见
- 2xx:成功,比如200(一切正常)
- 3xx:重定向,比如301(永久搬家)、302(临时挪地)
- 4xx:客户端错误,问题出在你这边(比如你访问了不存在的页面)
- 5xx:服务端错误,问题出在网站那边(服务器挂了、超时、配置错)
普通人最常遇到的,是4xx和5xx。4xx是你自己的问题,5xx是网站的问题。
403 Forbidden:你有钥匙,但门不让你进
403的意思是:服务器认识你(你发来的请求是合法的),但拒绝让你访问。
有点像你拿着员工卡去刷机房的锁,卡能刷,但权限不够,门不开。
常见原因:
- 网站设置了IP黑名单,你的IP被拦了
- 你需要登录才能访问,但你没登录
- 服务器目录权限设置错误(比如把文件夹设成了750,但web用户不在组里)
- 防火墙或WAF拦截
怎么修(如果你是网站管理员):
- 检查Nginx/Apache的
deny指令,看看是不是禁止了某些IP - 检查网站目录权限,确保web用户(如www-data)有读取权限
- 如果有安全插件(如WordPress的Wordfence),看看是不是触发了拦截规则
- 如果你是普通访客,换个网络(比如用手机流量)试试,如果是IP被误封,联系站长解封
反常识点:403很多时候不是故意的,而是配置错误。比如你把index.html放在了/root目录下,web用户读不到,就403。
404 Not Found:你要的东西,这里没有
404是最知名的错误码。意思是:服务器收到了请求,但找不到你要的资源。
常见原因:
- 你输入的网址拼错了(比如
/about写成了/abuot) - 页面被删了,但链接还在
- 网站改了URL结构,没做重定向
怎么修:
- 如果你是访客:检查网址拼写,或者去首页重新找
- 如果你是站长:检查Web服务器的配置,确认文件确实存在;如果页面移动了,设置301重定向;或者自定义一个友好的404页面,引导用户回首页
数据:一个大型网站,每天产生的404请求可能占到总请求的5%-10%。大部分是爬虫在扫不存在的路径。
502 Bad Gateway:中间人传话失败了
502是最让人头疼的错误码之一。它表示:网关(比如Nginx)收到了上游服务器(比如PHP-FPM、Tomcat)的无效响应。
用快递比喻:你下单,快递员去仓库取货,仓库说“没货”或者“我挂了”,快递员回来告诉你“502”。
常见原因:
- PHP-FPM进程挂了或没启动
- Nginx配置的后端地址错误(比如端口写错了)
- 后端服务负载过高,处理不过来
- 防火墙阻挡了Nginx到后端的连接
怎么修:
- 检查后端服务是否运行:
systemctl status php7.4-fpm - 查看后端服务日志:
tail -f /var/log/php-fpm/error.log - 检查Nginx配置文件中的
proxy_pass或fastcgi_pass地址是否正确 - 如果后端服务是动态的(如Java应用),检查它是否启动了、端口是否监听
- 重启后端服务试试
真实案例:有次一个网站502,查了半天,发现是PHP-FPM的listen配置用的是Unix Socket,但Nginx里写的是IP+端口。两边对不上,自然502。
504 Gateway Timeout:中间人等太久了
504和502是兄弟。502是后端返回了错误响应,504是后端根本没在指定时间内返回任何响应——等超时了。
想象你在餐厅点餐,厨师做菜太慢,服务员等了一小时还没端上来,最后告诉你“菜做不出来了”。
常见原因:
- 后端执行了一个耗时很长的操作(比如导入大数据、生成报表)
- 数据库查询慢,卡住了
- Nginx的
proxy_read_timeout设置太短 - 后端服务死锁或假死
怎么修:
- 检查后端服务有没有在跑(有时是假死,进程在但无响应)
- 查看慢查询日志,优化慢SQL
- 增加Nginx的超时时间:
proxy_read_timeout 300s; - 如果是特定页面超时,考虑把长任务改成异步处理
反常识数据:很多504不是服务器真的慢,而是上游服务(比如PHP)的max_execution_time设得太短。PHP默认30秒,如果有个脚本跑31秒,就504了。
500 Internal Server Error:服务器自己也不知道怎么了
500是最泛的错误码,意思是:服务器遇到了意外情况,无法完成请求。它不告诉你具体原因,只说“我出错了”。
常见原因:
- 代码语法错误(比如PHP文件里漏了分号)
- 权限问题(web用户写不了日志、读不了文件)
- 内存不足
- 配置文件格式错误
怎么修:
500没有捷径,必须查日志。Web服务器的error.log(Nginx的error.log、Apache的error_log)会告诉你具体报错。
bash
tail -50 /var/log/nginx/error.log
看到什么错误,就对症下药。
注意:生产环境应该关闭向用户显示具体错误(显示500就够了),但要把错误写进日志。这样用户不知道内部细节,你又能排查。
301/302:不是错误,是搬家通知
301和302不是错误,是重定向。301是永久搬家,302是临时挪地。
比如你访问http://example.com,网站返回301,告诉你“以后用https://example.com”。浏览器会自动跳过去。
怎么检查:
用curl -I http://你的域名,看第一行是不是301 Moved Permanently,然后看Location头指向哪里。
一个快速排查的套路
遇到错误码,别慌。按这个顺序来:
- 看是4xx还是5xx。4xx是你的问题(URL错了、没权限),5xx是服务器的问题。
- 如果是5xx,先重启相关服务(PHP-FPM、Nginx、MySQL)。很多时候服务假死了。
- 重启不行,看日志。Web日志、后端日志、系统日志,错误信息就在里面。
- 如果是502/504,检查Nginx和后端服务的连接(端口、Socket、防火墙)。
- 如果是403,检查权限和IP黑名单。
- 如果是500,只能靠日志。
最后说一句
HTTP状态码不是来折磨你的,是来帮你的。它把问题分类、编号,让你知道从哪里下手。
下次再看到502,你不会只知道“网站挂了”,你知道“Nginx连不上PHP-FPM了”。看到504,你知道“后端太慢了,或者超时太短”。
每看懂一个错误码,你就离“运维高手”近了一步。
把这篇收藏起来,下次报错的时候翻出来对一下。你会发现,大多数问题没那么神秘,只是你没找到解读它的方法。




