域名访问java项目的api接口,返回的json数据不完整被截断,通过ip端口访问正常

作者: admin 分类: 异常处理 发布时间: 2019-08-28 12:31  阅读: 88 views

问题描述

java项目通过ip,端口访问接口地址能够正常返回数据,通过域名访问无法正常返回数据,被截断导致前端无法正常解析。

背景说明

最近在对一个社区模块进行升级,线上正常运行多时的一个功能在测试环境偶尔崩坏。是一个帖子列表页功能,列表数据为每页10条,数据中有context字段。数据库length长度超过10w。(这里做法应该优化下,列表页不返回context,详情页再去返回)。当进行正常翻页\默认页查询的时候,数据无法加载出来。

原因排查

  1. 代码排查

一般来说,都是先本地搭建环境,检查下代码逻辑。在本地环境准备好之后,模拟测试环境中的相同参数等进行访问,发现数据基本正常。所以排除代码原因。

  1. 数据排查

由于编辑帖子数据时,会用到富文本编辑器。所以可能由于数据、非法字符等原因引起的解析、序列化问题导致。在对一些数据选择性删除后,功能正常数据。添加后又继续失败。项目中使用hession序列化,对应的编码逻辑正常。故而排除序列化问题。hession序列化处理

  1. 数据量大小

不是序列化问题,就对数据本身做调整,在对context字段的内容进行缩减之后,功能正常使用,增到一定量时,无法正常使用。到这里,基本排除是项目本身的问题。继续排查

  1. Nginx代理

测试服务器通过Nginx做了代理转发设置。还原异常数据后通过域名请求接口地址,返回的数据是被截断的,如下:

{"code":"200","message":"success","data":[{"id":26884,"pid":"","pname":"","projectPic":null,"userNick":"滚妹","userId":"4BF0BBA5085035B5E050A00ACC3C3568","userHeader":"http://images.xxxxxxxx.com/o_1cut7g14e1p0rvhe1q7ukq41m11h.jpeg","userRole":"","subject":"离杭州1h,人均300+,伸手可摘星的森林帐篷","image":"","coverPic":null,"content":"<div class=\"_j_content_box\">\n\t        <p class=\"_j_note_content _j_seqitem\" data-seq=\"390535527\">\n                                                                            滚床这么多次,去过雪山,趟过湖泊,闯过热带雨林......<br>\n<br>\n总觉得,还有什么地方没去过?<br>\n\n                                                        </p>\n            <div data-seq=\"390545728\" data-index=\"1\" class=\"article_title _j_anchorcnt _j_seqitem\">\n                <h2 class=\"t9\"><span class=\"_j_anchor\">16顶帐篷,中间还自带泳池,超好拍</span></h2>\n            </div>\n            <div id=\"_j_photo_390535978\" data-seq=\"390535979\" data-pid=\"390535978\" class=\"add_pic _j_anchorcnt _j_seqitem\" style=\"width:680px\">\n        <a target=\"_blank\" style=\"display: block\" hrefff=\"/photo/10156/scenery_10966070/390535978.html\">\n            <img class=\"\" style=\"height: 414px; width: 680px; ba

通过ip、端口访问接口地址,返回的数据正常。这样就基本确定了问题出在nginx这里。

a. 先查看测试服务器nginx accesslog日志

发现以下错误

2019/08/28 10:50:57 [alert] 18281#0: *427 write() to "/opt/nginx/nginx-1.12.1/logs/access.log" failed (28: No space left on device) while logging request, client: ip, server: xxx, request: "GET /xx/tool/qiniu/token?quantity=3&client=android&clientversion=6.9.0&deviceid=13601&appType=0 HTTP/1.1", upstream: "http://ip:port/xxx/tool/qiniu/token?quantity=3&client=android&clientversion=6.9.0&deviceid=13601&appType=0", host: "xxx"

发现磁盘空间不够了,如下:

[root@iZ231y5l2vxZ /]# df -lh
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G   20G     0 100% /
tmpfs           3.9G  666M  3.2G  17% /dev/shm
/dev/vdb        493G  276G  193G  59% /mnt/xvdb 

赶紧清理磁盘空间,删除无用信息。磁盘空间释放之后,功能可以正常使用。

b. 顺便配置下 nginx的缓存机制,防止数据量过大产生的问题

    #proxy_buffer_size   4k;
    #proxy_buffers   4 32k;
    #proxy_busy_buffers_size   64k;

Nginx 将其缓冲到内存中,然后依次发送到客户端浏览器。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制。

至此,问题处理完成。


   原创文章,转载请标明本文链接: 域名访问java项目的api接口,返回的json数据不完整被截断,通过ip端口访问正常

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

2条评论
  • VPS234

    2019年8月30日 13:42

    这个应该是服务器请求接收长度的限制吧,默认应该没有问题,除非字符串真的非常长

    1. admin

      2019年8月30日 17:11

      接口返回长度的过大是和nginx的fastcgi配置有关。 我这里是磁盘满了引起,清理空间后使用默认fastcgi的相关配置,正常访问。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

更多阅读