常见Http错误码学习

这篇具有很好参考价值的文章主要介绍了常见Http错误码学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章来源地址https://www.toymoban.com/news/detail-441692.html

常见 http 错误码

服务器巡检时比较常见的 http 错误码

  • 400 Bad Request
  • 408 Request Timeout
  • 499 client has closed connection
  • 502 Bad Gateway
  • 504 Gateway Timeout
    这些错误码反映了服务器什么样的状态,仅看字面意思还不太容易理解,就动手做个试验吧

试验环境

在 linux 主机上运行 nginx,在本机(windows 10)上运行 jetty,linux 上的 nginx 反向代理到本机 jetty

试验工具

发送 http 请求主要采用 postman,也使用了 telnet 和 python 脚本

试验

400

错误的请求,比如必须的参数未传递,那么我们来试下

@Controller
@RequestMapping("/api/")
public class TestController {


    @ResponseBody
    @RequestMapping("test.debug")
    public String test(@RequestParam(required = true) String name) {
        return name;
    }


}

可以看到 name 参数是必须的,那么不带参数调用一下

http://xxxxx.in.xxxx.com/api/test.debug

返回 200.

怎么返回了 200 而不是预期的 400呢?经过一番检查,原来是有个异常处理程序捕捉到了参数未传递的异常并进行了处理,如下

@Component
public class ExceptionHandler implements HandlerExceptionResolver {


    private static final Logger log = Logger.getLogger(ExceptionHandler.class);




    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
                                         Object handler, Exception ex) {
        response.setContentType("application/json; charset=UTF-8");
        String code = null;
        String message = null;
        if (ex instanceof BizException) {
            BizException exception = (BizException) ex;
            message = exception.getMessage();
            code = Integer.toString(exception.getErrorCode());
        } else if (ex instanceof MissingServletRequestParameterException) {
            code = "900002";
            message = ex.getMessage();
            log.error(message);
        } else {
            code = "403";
            message = ex.getMessage();
            log.error(ex, ex);
        }
        
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("code", code);
        mav.addObject("message", message);
        mav.addObject("value", message);
        return mav;
    }


}

禁用该异常处理以后,重新试验返回了 400,如下

此外,胡乱的发送数据给 nginx 服务器而不按 http 协议规范组织数据,也会得到 400 的返回码,可以用 telnet 试验一下,如下图

在用 telnet 给 nginx 发送数据时,输入 “HTTP/2.3.”,由于 2.3. 是不存在的版本,nginx 当即返回了 400 错误码

408

请求超时,nginx 在规定的时间内无法获取到客户端的请求
这个错误码很奇怪,根据该错误码的含义,使用 telnet 和 python 进行模拟,但无法使 nginx 返回 408 错误码…试验失败了
另外,查看 nginx 日志,发现返回 408 错误码的日志,实际上请求都已经转发给 jetty 并且 jetty 也返回了 200 响应码.

所以,这个错误码目前还无法解释

499

在 nginx 返回结果之前,客户端断开了连接,nginx 会记录 499 错误码到日志,要重现这个错误码,只需要让接口等待一段比较长的时间,并在请求端主动断开即可,如下

@Controller
@RequestMapping("/api/")
public class TestController {


    @ResponseBody
    @RequestMapping("test.debug")
    public String test(@RequestParam(required = true) String name) {
        try {
            Thread.sleep(300 * 1000);
        } catch (InterruptedException e) {
        }
        return name;
    }
}

在 postman 里发起请求,并在等待的过程中点击 cancel 按钮

这时 postman 没有任何返回,但是查看 nginx 的日志,会发现一条 499 的记录,如下

502

这个比较好理解,jetty 服务挂了或者没有启动,我们停掉 jetty 就可以得到这个错误码.

504

这是 jetty 响应超时了,我们让接口等待 300 秒后返回,来测试一下

@Controller
@RequestMapping("/api/")
public class TestController {


    @ResponseBody
    @RequestMapping("test.debug")
    public String test(@RequestParam(required = true) String name) {
        try {
            Thread.sleep(300 * 1000);
        } catch (InterruptedException e) {
        }
        return name;
    }
}

可以看到在60秒(准确的说,60133 ms)以后,nginx 返回了 504

这是因为 nginx 默认等待 jetty 60 秒,时间到了 jetty 没有响应 nginx 就会自行返回 504;如果想要 nginx 多等一段时间,可以如下配置

proxy_read_timeout 6m; 

现在再试一下

可以看到,经过 300 秒(300062 ms)的漫长等待,我们得到了 jetty 的响应

结论

  • 400 客户端请求数据格式不对,不符合接口规范.和客户端沟通,要求客户端修复.服务端进行容错处理

  • 408不知道.继续研究

  • 499 由于服务器处理太慢,客户端在规定的时间内未接收到响应,主动断开连接.客户端网络被断开了,在移动互联网环境下这还是比较常见的,例如用户移动到 WIFI 覆盖区域以外/服务端优化性能

  • 502 服务器宕机, 重启服务器

  • 504 服务端响应太慢了, 优化性能

到了这里,关于常见Http错误码学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入了解HTTP 500内部服务器错误的原因及解决方法

    HTTP 状态代码提供有关在线请求是否成功的信息,如果不成功,则错误是什么。 但是错误消息并不总是很清楚。 “500 内部服务器错误”尤其如此。 此消息表示在连接到服务器期间发生错误,并且无法访问所请求的页面。 但是,它不会告诉你为什么会这样。 幸运的是,有不

    2024年02月08日
    浏览(61)
  • 解决HTTP错误500.19 - internal server error -内部服务器错误的终极指南

    在开发和维护网络应用程序时,难免会遇到各种HTTP错误代码。其中,HTTP错误500.19 - 内部服务器错误可谓是最令人头痛的问题之一。当你的应用程序遇到这个错误时,它似乎就像一道墙壁,挡住了你前进的道路。但别担心,本篇技术博文将揭示解决这个问题的终极方案,让你

    2024年02月04日
    浏览(62)
  • 服务器巡检表

    《服务器巡检表》检查项: 1、系统资源 2、K8S集群 3、Nginx 4、JAVA应用 5、RabbitMQ 6、Redis 7、PostgreSQL 8、Elasticsearch 9、ELK日志系统 软件开发全套文档下载:点我下载

    2024年02月04日
    浏览(40)
  • 服务器巡检表-监控指标

    系统资源 K8S集群 Nginx JAVA应用 RabbitMQ Redis PostgreSQL Elasticsearch ELK日志系统 检查项目 检查指标 检查标准 系统资源 CPU 使用率 正常:<70% 低风险:≥ 70% 中风险:≥ 85% 高风险:≥ 95% 内存使用率 正常:<70% 低风险:≥ 70% 中风险:≥ 85% 高风险:≥ 95% 磁盘使用率 正常:<80

    2024年02月09日
    浏览(43)
  • 服务器巡检脚本(linux)

    2024年02月20日
    浏览(45)
  • Python + Shell 巡检服务器

    团队维护多套业务系统,有支付系统、金融系统、数据系统、核验系统等二十多套业务系统,每套业务系统有10 - 50台服务器不等,当前团队中存在一套自动化巡检系统,每十分钟巡检一次,有异常可实时告警。但每天还需要人工登录服务器巡检两次,因人工巡检耗时长、漏巡

    2024年02月19日
    浏览(40)
  • Ftp无法连接到服务器怎么办?常见的ftp错误问题及解决办法分享

    1、无法上传网页,提示“无法连接服务器”错误; 原因: FTP客户端程序设置问题,客户上网线路问题,ftp服务器端问题。 解决方法: 使用CUTPFTP软件来上传客户的网页,在“FTP主机地址处”最好填写IP地址。 2、FTP时已经通过身份验证,但总列不出目录; 原因: 上传软件的

    2024年02月17日
    浏览(61)
  • Nginx代理服务器、HTTP调度、TCP/UDP调度、Nginx优化、HTTP错误代码、状态页面、压力测试

    Top 案例1:Nginx反向代理 案例2:Nginx的TCP/UDP调度器 案例3:Nginx常见问题处理 1.1 问题 使用Nginx实现Web反向代理功能,实现如下功能: 后端Web服务器两台,可以使用httpd实现 Nginx采用轮询的方式调用后端Web服务器 两台Web服务器的权重要求设置为不同的值 最大失败次数为2,失败

    2024年01月21日
    浏览(47)
  • shell脚本——服务器巡检(自动化运维)

     目的   自动 获取集群内 多个主机 的内存、磁盘、cpu等信息 生成日志  准备    VMware虚拟主机IP在同一个网段(互相能ping通)             虚拟主机都有公钥免登录            修改主机IP  vi/etc/sysconfig/netwoek-scripts/ifcfg-ens160            设置主机名 hostnamectl set-ho

    2024年02月15日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包