为了账号安全,请及时绑定邮箱和手机立即绑定

网关超时,春季云网关和Nginx作为反向代理

网关超时,春季云网关和Nginx作为反向代理

开满天机 2022-09-14 09:45:38
我为我的应用程序创建了一个 API 网关,它将充当其他微服务的前端控制器。在我的生产设置中,我使用Nginx作为网关的反向代理API 网关在端口 8080 上运行恩金克斯配置如下:gateway-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;}超时设置:proxy_connect_timeout 300;proxy_send_timeout 300;proxy_read_timeout 300;send_timeout 300;弹簧云网关分级文件: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.RELEASEspringDMPVersion=1.0.4.RELEASEspringPlatformBomVersion=Cairo-SR2springCloudVersion=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 分钟以上才能完成。如果我通过 调用此 API,它将在 1 分钟后失败,并给出 HTTP 状态 504。nginx(api.example.com)卷曲: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 --request GET \  --url http://api.example.com:8080/hellomicroservice/api/take/moretime
查看完整描述

4 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

似乎请求超时对您来说不是问题。这是连接超时。我认为我们需要看看标题

连接

AFAIK,标头定义,连接应该是持久的,或者谁有权维护/关闭它。如果连接为 ,则连接将持久。对于保持活动状态的连接,客户端偶尔会发送 TCP ping,以确保服务器仍处于活动状态并保持连接。根据卷曲,默认情况下,此时间是每 60 秒一次。Connectionkeep-alive

现在,必须将 配置为接受连接,并使用 keepalive_timeout 指令使其保持活动状态一段时间。如果不存在,则不会使连接保持活动状态nginxnginx

这应该就是nginx在日志中说499的原因。HTTP499是nginx中的一个控制错误,它说客户端关闭了连接。在你的情况下关闭了它。为什么要关闭它?因为 nginx 没有响应 60 秒的 TCP ping,因为未启用保持活动状态。curlcurl

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

现在,为什么它直接与雄猫合作?我认为春天使活动超时是无限的或非常高的值。通常在雄猫中也有它的60秒。

我希望这能解决你的问题。


查看完整回答
反对 回复 2022-09-14
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

我想这是由于许多其他事情而可能发生的问题之一。这是一个对我有用的解决方案(我也在以下位置遇到错误:/var/log/nginx/error.log

2020/12/30 21:47:47 [错误] 26765#26765: *13064 上游超时 (110: 连接超时) 连接到上游时, 客户端: XXX, 服务器: example.com, 请求: “GET /eshop HTTP/1.0”, 上游: “http://[::1]:8080/error_50x.html”, 主机: “example.com”

奇怪的是,这并没有发生在我的笔记本电脑上,而只发生在我的服务器上。所以我检查了IP,结果发现这可能是因为缺少::1地址。当我将其添加到 lo 网络设备,我无法复制超时。

sudo ip a add ::1/128 dev lo

下一篇:(这是我的理解,我不是100%确定:)此外,由于保持与localhost Java服务连接的开销似乎高于仅删除该连接并在发出另一个请求时再次连接,因此建议对代理使用以下设置(在nginx的站点.conf中):

proxy_http_version 1.1;
proxy_set_header Connection "";

请参阅 https://stackoverflow.com/a/10396874/3223505


查看完整回答
反对 回复 2022-09-14
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

由于您的配置缺少proxy_http_version键,因此可能仍无法为上游启用 Keepalive。

引用自:https://www.nginx.com/blog/tuning-nginx/#proxy_http_version

要启用与上游服务器的保持活动连接,还必须在配置中包含以下指令:

proxy_http_version 1.1;
proxy_set_header Connection "";

我也会按照Kris的建议将keepalive_timeout保留在配置中。


查看完整回答
反对 回复 2022-09-14
?
阿晨1998

TA贡献2037条经验 获得超6个赞

尝试将超时设置放在 /etc/nginx/conf.d/timeout.conf 中(如果没有,请创建一个)。设置以下设置,

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;


查看完整回答
反对 回复 2022-09-14
  • 4 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信