nginx 关于 proxy_pass 重试的问题
问题描述
各位大神,我的nginx会通过proxy_pass去调tomcat,但是tomcat会间歇性抽风(fullgc)导致超时,7-8秒吧
我想了一个办法就是请求第一次的时候设置一个超时时间,比如说1s,如果超时了,就在请求一次(换一台机器)
然后我就有了下面这个nginx配置.(下面是用flask的sleep模拟tomcat的fullgc)
upstream up {server 127.0.0.1:8088;server 127.0.0.1:8089; } server {listen 8087;server_name localhost;access_log logs/host.access.log main;location / { proxy_connect_timeout 1s; proxy_send_timeout 1s; proxy_read_timeout 1s; proxy_next_upstream_timeout 1s; proxy_next_upstream_tries 1; send_timeout 1s;# proxy_next_upstream timeout error; proxy_pass http://up;} }
8088和8089的服务是我用写的一个mock服务8088会直接睡秒2s,导致nginx超时8089会直接返回一个'hello world',200
我的期望是当我用命令行 curl反复请求8087的时候,会始终返回 'hello world',虽然有些请求比较快,有些请求比较慢(1s多,因为经过了一次超时请求之后重新进行的请求)
但是结果却并不是这样
当请求超过1s后,8087他就直接返回 504错误了
通过查看nginx后台日志:连续打印了3条超时记录:
但是8088(sleep的那个服务,)仅仅只收到了一个请求(有些小异常,用flask写的)
然后我用wireshark抓包发现
求助各位大神?我的配置哪里有问题吗??
这里可能提提供了些无关信息,如果没用可以忽略哈~
如过有其他好的处理tomcat fullgc超时问题的,也非常感谢啊~
问题解答
回答1:You asked for one try, then nginx tries that once.
try 和 retry 是不同的。你 proxy_next_upstream_tries 2; 试试。另外你似乎也误解了 proxy_next_upstream_timeout 的意思。把它也去掉。
相关文章:
1. python - Django内使用filter过滤时间,只认年份不认月份是怎么回事?2. centos7 编译安装 Python 3.5.1 失败3. 人工智能 - python 机器学习 医疗数据 怎么学4. c++ - 请问MySQL_Connection::isReadOnly 怎么解决?5. python - 能通过CAN控制一部普通的家用轿车吗?6. mysql优化 - 关于mysql分区7. css3 - 微信前端页面遇到的transition过渡动画的bug8. mysql - 分库分表、分区、读写分离 这些都是用在什么场景下 ,会带来哪些效率或者其他方面的好处9. python - beautifulsoup获取网页内容的问题10. Python爬虫如何爬取span和span中间的内容并分别存入字典里?
