当前位置: 首页 > 知识库问答 >
问题:

以Spring云网关和Nginx为反向代理的网关超时

鄢开诚
2023-03-14

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

API网关在端口8080上运行

Nginx配置如下:

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;
}

nginx中的超时设置。形态:

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 --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秒后超时。

共有3个答案

寇桐
2023-03-14

尝试把你的超时设置在 /etc/nginx/conf.d/timeout.conf(如果没有,创建一个)。设置下面的设置,

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
澹台星剑
2023-03-14

由于配置缺少proxy\u http\u版本密钥,可能仍无法为上游启用Keepalive。

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

要启用到上游服务器的keepalive连接,还必须在配置中包含以下指令:

proxy_http_version 1.1;
proxy_set_header Connection "";

我也会按照克里斯的建议在配置中保留keepalive_超时。

庄实
2023-03-14

似乎请求超时对你来说不是问题。它的连接超时。我想我们需要看看

连接

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

现在必须使用keepalive\u timeout指令将nginx配置为接受连接并使其保持活动一段时间。如果不存在,则nginx将无法保持连接的活动状态。

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

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

现在,为什么它直接与tomcat合作?我认为spring允许活动超时为无限大或更高的值。通常在tomcat中,它也会运行60秒。

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

 类似资料:
  • 我使用Nginx作为反向代理,它接收请求,然后执行proxy_pass以从运行在8001端口上的上游服务器获得实际的web应用程序。 如果我转到mywebsite.com或执行wget,我会在60秒后获得504网关超时...但是,如果我加载mywebsite.com:8001,应用程序将按预期加载! 和Nginx错误日志的输出:

  • 如您所见,我创建了sites-available文件夹,然后在sites-enabled中进行链接,其中包括。 在网站内部-可用,我有一个文件与此: NGINX的状况: 谢谢

  • null 我倾向于认为它是第一个,但在这种情况下,nginx不会是应用程序的入口...(这是个问题吗?)

  • 我还需要NGINX来服务静态内容,如JS等,并向后端反向代理请求,还是可以用Spring Cloud Gateway来完成?Spring docs有以下图像: 我没有发现关于如何将静态内容返回给客户端的描述,这是否意味着它被认为是糟糕的做法,我需要额外的反向代理步骤来增加它的延迟?如果没有,我可以在哪里找到更多关于如何使用Spring Cloud Gateway实现这一点的信息,尤其是如果我要使用

  • 为了处理微服务体系结构,它经常与反向代理(如nginx或apache httpd)一起使用,对于交叉关注点的实现,使用API网关模式。有时反向代理做API网关的工作。 看到这两种方法之间的明确区别将是很好的。使用API网关的潜在好处是调用多个微服务并聚合结果。API网关的所有其他职责都可以使用反向代理实现。例如: 身份验证(可以使用nginx LUA脚本完成); 传输安全性。它本身反向代理任务;

  • 我设置nginx作为我的apache tomcat的反向代理。它像我预期的那样正常工作。然而,当Apache Tomcat服务器关闭时,NGINX总是返回502坏网关时,我感到困惑。而不是返回504坏网关超时? 502坏网关:服务器充当网关或代理,从上游服务器收到无效响应。 504网关超时服务器充当网关或代理,没有收到来自上游服务器的及时响应。 访问时出现错误日志: 2015/10/19 10:1