一次排查服务器端接口报500错误的经历

1,813 阅读3分钟

  1 出现问题情景

  该问题来自我实习期间完成的一个博客后端系统,具体如下:

  · 当我辛辛苦苦在编辑器里完成文章格式修改(字数较多,一般大于3000字;字数较少时不会出现问题),以及相关目录和标签的选定,点击提交按钮打算提交到博客系统时发现:文章无法提交成功。或者修改文章,重新编辑文章时(PS:编辑后,字数较多,一般大于3000字),提交文章也出现类似问题。

  然后,查看接口调用返回值发现:

  发布文章接口和修改文章接口报服务器500错误。

  2 排查问题

  (1)首先,去服务器端查看uwsgi配置的报错信息:里面只给出了具体接口报500错误信息,没有具体错误原因显示;

  (2)然后,去服务器端查看nginx的报错信息:里面也只给出了具体接口报500错误信息,没有具体错误原因显示;

  (3)到了现在,就感觉很纳闷了。于是,我跑到本地测试相关接口,发现所有接口功能正常使用,没有什么报错信息提示。到了这一步,可以排除代码实现逻辑是没有问题,那么问题就应该出现在测试服务器环境的服务器部署问题,而且问题可能就出现在数据库配置部署。

  (4)最后,按照(3)的想法,到测试环境开启博客系统后端服务的shell环境,执行具体发布和更新文章的接口方法,直接对后端数据进行添加和更新操作,于是发现以下报错:

  django.db.utils.OperationalError: (1153, Got a packet bigger than 'max_allowed_packet' bytes)

  问题果然是出现在数据库层调用出现的问题。依据问题可知:由于数据写入量太大,超出mysql数据库最大单个数据存储字节大小,从而导致数据无法写入或者更新。

  3 解决办法

  在测试服务器,使用root账号权限,修改最大字节数,步骤代码如下:

  ─[liuzhen@liuzhen] - [/etc/mysql] - [Fri Jul 27, 10:30]└─[$] mysql -u root -proot

  mysql: [Warning] Using a password on the command line interface can be insecure.

  Welcome to the MySQL monitor. Commands end with ; or \g.

  Your MySQL connection id is 128557Server version: 5.7.20-0ubuntu0.16.04.1-log (Ubuntu)

  Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

  Oracle is a registered trademark of Oracle Corporation and/or its

  affiliates. Other names may be trademarks of their respective

  owners.

  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

  mysql set global net_buffer_length=1000000;

  Query OK, 0 rows affected, 2 warnings (0.01 sec)

  mysql set global max_allowed_packet=1000000000;

  Query OK, 0 rows affected, 1 warning (0.00 sec)

  修改成功后,重新调用博客系统发布文章和修改文章接口,发现问题得到解决。

  4 写在最后

  刚开始遇到这个问题时,发现服务器500错误,排查了好久一直找不到具体报错原因,也无法作出具体解决方案。于是,到网上查看了一下接口报500服务器内部错误出现的一般原因,发现:

  一般出现500服务器内部错误,极可能是调用数据库进行数据查询、更新、修改或者删除时出现了逻辑错误或者相关错误,也就是数据库层调用出现了错误。

  出现后,排查日志和接口返回错误提示,可能是找不到报错信息,所以最好的方法就是去手动在相应环境下执行一下数据库层调用方法,排查一下具体问题。