我为我的应用程序创建了一个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秒后超时。
尝试把你的超时设置在 /etc/nginx/conf.d/timeout.conf(如果没有,创建一个)。设置下面的设置,
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
由于配置缺少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_超时。
似乎请求超时对你来说不是问题。它的连接超时。我想我们需要看看
连接
好的,连接
头定义,连接应该是持久的,或者谁有权维护/关闭它。如果连接是保持活动状态
,则连接将是持久的。对于保持活动的连接,客户端偶尔会发送一个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