亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

網關超時,春季云網關和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 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號