后端超时还能通过设置Nginx超时时间来解决?


欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送
发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景中间件系列笔记编程高频电子书

文章导读地址:点击查看文章导读!

感谢你的关注!

Nginx为什么要设置超时时间?

后端超时还能通过设置Nginx超时时间来解决?_第1张图片

延长超时时间

最近做的一个项目碰到了一个问题,先说一下业务背景:前端传入了一张照片,需要对这张照片进行识别,识别的时候会通过 HTTP 调用另外一个 AI 识别的服务

遇到的问题是什么呢?

在识别的时候,发现会爆出一个网络连接超时的错误

那么就赶紧去后端查看日志,发现错误是 SocketTimeOut,因为后端也是要发送 Http 请求来识别的,首先先排除一下错误的来源,这里具体的经过不详细说了,最后结果很离谱,竟然是这张图片的像素点太多了,导致识别时间太长!

在不修改 AI 识别模块的前提下,首先想到是后端的 OkHttpClient 超时时间设置的太短了,于是去设置的长一些,如下

后端超时还能通过设置Nginx超时时间来解决?_第2张图片

之后发现不起作用,这是为什么呢?

其实是因为后端虽然超时时间设置的长了一些,但是前端和 Nginx 的超时时间还是很短呀,前端还没有等到后端的响应,就直接爆出 网络连接超时 了,那么很显然,解决方法就是设置这 3 个地方的超时时间:

  • Nginx 超时时间
  • 前端超时时间
  • 后端 OkHttpClient 的超时时间

Nginx 超时时间设置:

Nginx 的超时时间就设置 proxy_read_timeout 180; 这个参数即可,默认是 60s,我们将他调大为 180s,这样就算图片大一些,在 3 分钟之内识别完毕还是可以的

参数设置的位置(这里将 ip 给遮住了):

server {
    listen       80;
    listen  [::]:80;
    server_name  ...;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    location /api/stone/ {
        # 等待 3 分钟,可能某些图片太大,解析需要花费时间
        proxy_read_timeout 180;
        # 填写 docker0 网卡地址:通过 ip a 查看,不用再去公网绕一圈
        proxy_pass   http://...:8082/stone/;
     }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

前端超时时间的设置:

因为请求是前端通过 axios 发送出去的,那么 axios 等待响应也是有一个超时时间的,因此还必须将 axios 的超时时间也设置为 3 分钟,这样才可以去等待后端处理图片

后端超时还能通过设置Nginx超时时间来解决?_第3张图片

业务解决

如果不通过超时时间来解决的话,那么可以从源头解决,也就是上传图片的时候,去判断图片的分辨率,不可以超过一个阈值

如果超过了阈值,可以 提示无法上传,或者是在后端对图片做出一些处理,降低图片的分辨率

Nginx 超时时间配置

最后来说一下 Nginx 常见的几类超时设置

客户端超时设置

针对客户端请求的各个部分都可以设置超时时间

  • client_header_timeout time:读取客户端请求头的超时时间,默认 60s
  • client_body_timeout time:读取客户端请求体的超时时间,默认 60s
  • send_timeout time:发送响应到客户端的超时时间,默认 60s,如果超过该时间,客户端没有接受任何响应,则 nginx 关闭此连接
  • keepalive_timeout:设置 http 长连接超时时间(即空闲连接可保持打开状态的时长),默认 75s

DNS 解析超时设置

  • resolver_timeout:设置DNS解析超时时间,默认为30s

这个不常用

代理超时设置

  • proxy_connect_timeout:设置与后端服务器建立连接的超时时间,默认 60s
  • proxy_read_timeout:设置从后端服务器读取响应的超时时间,默认 60s
  • proxy_send_timeout:设置向后端服务器发送请求的超时时间,默认 60s

上边解决后端超时,就是用的 proxy_read_timeout

你可能感兴趣的:(技术文章,nginx,运维,生产环境问题,Java)