gpt4 book ai didi

java - 使用 Spring 云网关和 Nginx 作为反向代理的网关超时

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:21 25 4
gpt4 key购买 nike

我为我的应用程序创建了一个 API 网关,它将充当其他微服务的前端 Controller 。在我的生产设置中,我使用 Nginx 作为我的网关的反向代理

API网关运行在8080端口

Nginx 配置如下:

网关-api.conf:

server {
listen 80;
server_name api.example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://localhost:30010/;
keepalive_timeout 500s;
}
keepalive_timeout 500s;
access_log /var/log/nginx/api.log;
error_log /var/log/nginx/api_error.log;
}

nginx.conf 中的超时设置:

proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;

Spring 云网关 gradle 文件:

compile('org.springframework.cloud:spring-cloud-starter-gateway')
compile('org.springframework.cloud:spring-cloud-starter-openfeign')
compile("org.springframework.boot:spring-boot-starter-actuator")
compile('org.springframework.boot:spring-boot-starter-security')

springBootVersion=2.0.3.RELEASE
springDMPVersion=1.0.4.RELEASE
springPlatformBomVersion=Cairo-SR2
springCloudVersion=Finchley.RELEASE

网关应用:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example"})
@EntityScan(basePackages = {"com.example"})
@EnableFeignClients(basePackages = "com.example")
public class GatewayApplication {

public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}

问题陈述:

在我的一项微服务中,一个 REST API 需要超过 3 分钟才能完成。如果我通过 nginx(api.example.com) 调用此 API,它会恰好在 1 分钟后失败并给出 HTTP 状态 504。

curl :

curl --request GET \
--url http://api.example.com/hellomicroservice/api/take/moretime

错误:

504 Timeout while reading the response from Server

nginx和API网关都没有错误日志。

从nginx访问日志:

203.129.213.102 - - [01/Apr/2019:08:14:33 +0000] "GET hellomicroservice/api/take/moretime HTTP/1.1" 499 0 "-" "PostmanRuntime/7.3.0"

但是当我直接向网关(在网关端口 8080 上)调用相同的 API 时,请求被成功处理。

用网关端口 curl :

curl --request GET \
--url http://api.example.com:8080/hellomicroservice/api/take/moretime

编辑:

如果我将 Nginx 超时设置应用为小于 60 秒(例如 30 秒),请求将在指定的时间间隔内超时。但是,如果我将 Nginx 超时设置为超过 60 秒,假设为 300 秒,请求将在 60 秒后超时。

最佳答案

请求超时似乎不是您的问题。它的连接超时。我认为我们需要查看

的标题

Connection

AFAIK,Connection header 定义,连接应该是持久的或者谁有权维护/关闭它。如果连接是 keep-alive ,那么连接将是持久的。对于保持连接,客户端偶尔会发送一个 TCP ping 以确保服务器仍然处于 Activity 状态并保持连接。根据 curl 这个时间默认是每 60 秒一次。

现在必须将 nginx 配置为接受连接并使用 keepalive_timeout 指令使其保持 Activity 状态一段时间。如果不存在,则 nginx 将不会 keep the connections alive .

这应该是 nginx 在日志中显示 499 的原因。 HTTP499 是 nginx 中的一个常见错误,表示客户端关闭了连接。在您的情况下,curl 关闭了它。为什么 curl 关闭了它?因为 nginx 没有响应 60 秒的 TCP ping,因为没有启用 keep-alive。

keepalive_timeout 添加到 ~500 或比应用程序超时更高的值应该可以解决您的问题。

现在,为什么它直接与 tomcat 一起工作?我认为 spring 使 Activity 超时成为无限或更高的值。通常在 tomcat 中也是 60 秒。

希望这能解决您的问题。

关于java - 使用 Spring 云网关和 Nginx 作为反向代理的网关超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55450200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com