nginx + tomcat TIME_WAIT 过多

本文探讨了在应用服务器CPU负载异常时,通过调整系统参数来优化Tomcat连接处理的问题。主要介绍了如何通过修改sysctl.conf文件中的TCP参数(如tcp_syncookies、tcp_tw_reuse、tcp_tw_recycle和tcp_fin_timeout),以及如何调整upstream的keepalive参数,以减少TIME_WAIT状态下的连接数量,从而降低CPU负载。同时,文章提供了实例代码和建议,帮助开发者解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到一个bug  

运维部门报警一台应用服务器cpu 很高  。但是我们又没有什么请求量,于是找原因  

netstat -na  

发现tomcat 有大量的连接,其中TIME_WAIT,非常多,问了一下百度,大概意思是说,nginx 的连接已经关闭了,tomcat 还在等待处理这个连接。 

所以调系统参数 


sudo vi  /etc/sysctl.conf 

net.ipv4.tcp_syncookies = 1  

net.ipv4.tcp_tw_reuse = 1  

net.ipv4.tcp_tw_recycle = 1  

net.ipv4.tcp_fin_timeout = 30

sudo /sbin/sysctl -p

还有一种是调节  upstream  -》keepalive参数,但是感觉改这个会影响nginx的性能,所以推荐第一种。

upstream localhost{          

keepalive 30;

  }


转载于:https://my.oschina.net/internetafei/blog/598936

user nginx; worker_processes 1; #error_log /var/log/nginx/error.log notice; events { worker_connections 1024; } http { # Nginx 会根据mime type定义的对应关系来告诉浏览器如何处理服务器传给浏览器的这个文件,是打开还是下载 # 如果Web程序没设置,Nginx也没对应文件的扩展名,就用Nginx 里默认的 default_type定义的处理方式。 # mime type 和文件扩展名的对应关系一般放在 mime.types这个文件里,然后用 include mime.types; 来加载 # default_type application/octet-stream; #nginx默认文件类型 include mime.types; default_type application/octet-stream; #tomcat端出现大量TIME_WAIT:(http://lanjingling.github.io/2016/02/27/nginx-tomcat-time-wait/) # Nginx作为反向代理,长连接配置主要有三项, # upstream中的keepalive设置单个worker最大请求数, # 参数proxy_http_version 1.1强制转换为http1.1协议(默认支持长连接), # proxy_set_header Connection将请求头部connection为空(http1.0请求默认connection头部为close)。 # NGINX + TOMCAT出现大量的TIME-WAIT状态的TCP连接解决 # http://nginx.org/en/docs/http/ngx_http_upstream_module.html # For HTTP, the proxy_http_version directive should be set to “1.1” and the “Connection” header field should be cleared: #tomcat端出现大量TIME_WAIT 解决方案 #测试1: # jmeter配置:线程数设置成5,Ramp-up时间(秒)设置成1,循环次数设置成永远 # 在没有配置任何相关的keepalive之前,服务端ngnix到tomcat大约3分钟TCP的TIME_WAIT的总数会增长到一万多; #测试2: # jmeter配置:线程数设置成5,Ramp-up时间(秒)设置成1,循环次数设置成永远 # 配置keepalive后,其中upstream proxy_tomcat中keepalive设置为2048,6分钟服务端ngnix到tomcat的TCP的TIME_WAIT的总数最高1000多; #测试3: # jmeter配置:线程数设置成5,Ramp-up时间(秒)设置成1,循环次数设置成永远 # 配置keepalive后,其中upstream proxy_tomcat中keepalive设置为4092,6分钟服务端ngnix到tomcat的TCP的TIME_WAIT的总数最高800左右; #参考连接: # # http://nginx.org/en/docs/http/ngx_http_upstream_module.html # 1.http://lanjingling.github.io/2016/02/27/nginx-tomcat-time-wait/ # 2.https://blog.youkuaiyun.com/LL845876425/article/details/97621365 # 3.https://blog.youkuaiyun.com/weixin_43944305/article/details/109487968 #参数说明(keepalive_timeout): #用途:保持客户端client(浏览器,需要http客户端打开浏览器keep-alive参数)到nginx的连接是长连接 #配置:设置keep-alive客户端连接在务器端保持开启的超时时间(默认75s);值为0会禁用keep-alive客户端连接 keepalive_timeout 120s; #参数说明(keepalive_requests): #用途:保持客户端client(浏览器,需要http客户端打开浏览器keep-alive参数)到nginx的连接是长连接 #配置: # 设置每个连接的最大请求次数,超过这个次数就会关闭该连接建立新的连接。默认是100.指一个 # keep alive建立之后,nginx就会为这个连接设置一个计数器,记录这个keep alive的长连接上已经 # 接收并处理的客户端请求的数量。如果达到这个参数设置的最大值时,则nginx会强行关闭这个长连接, # 逼迫客户端不得不重新建立新的长连接。 keepalive_requests 10000; #upstream proxy_nodejs { #用server定义http地址 #server nodejs:9090; #参数说明(keepalive): #用途:保持nginx到server的连接是长连接 #配置:设置 worker 进程和后端服务器之间保持空闲连接的最大值,如果空闲连接数大于这个值,将会关闭使用最少的连接,默认值为0 #keepalive 2048; #} # upstream proxyTomcat { #用server定义http地址 #server 192.168.10.105:8087; #参数说明(keepalive): #用途:保持nginx到server的连接是长连接 #配置:设置 worker 进程和后端服务器之间保持空闲连接的最大值,如果空闲连接数大于这个值,将会关闭使用最少的连接,默认值为0 #keepalive 4092; #} server { listen 80; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; location /siweidjfa/ { proxy_pass http://$NGINX_TOMCAT_IPADDRESS; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } #location / #{ # #通过代理将请求发送给upstream命名的http服务 # proxy_pass http://$NGINX_TOMCAT_IPADDRESS; # # #参数说明(proxy_http_version): # #用途:保持nginx到server的连接是长连接 # #配置:设置 HTTP 请求协议,要确保是 HTTP 1.1 的长连接协议 # proxy_http_version 1.1; # # #参数说明(proxy_set_header): # #用途:保持nginx到server的连接是长连接 # #配置:清空 Connection 请求头,避免客户端传递短连接的请求头信息 # proxy_set_header Connection ""; # # #参数说明(keepalive_timeout): # #用途:保持nginx到server的连接是长连接 # #配置:设置keep-alive客户端连接在服务器端保持开启的超时时间(默认75s);值为0会禁用keep-alive客户端连接 # keepalive_timeout 150s; # # #参数说明(keepalive_requests): # #用途:保持nginx到server的连接是长连接 # #配置: # # 设置每个连接的最大请求次数,超过这个次数就会关闭该连接建立新的连接。默认是100.指一个 # # keep alive建立之后,nginx就会为这个连接设置一个计数器,记录这个keep alive的长连接上已经 # # 接收并处理的客户端请求的数量。如果达到这个参数设置的最大值时,则nginx会强行关闭这个长连接, # # 逼迫客户端不得不重新建立新的长连接。 # keepalive_requests 100000; # #} } } 启动报错
最新发布
05-23
### 解决 Nginx 启动报错问题:`invalid number of arguments in "proxy_set_header" directive` 当遇到 `nginx: [emerg] invalid number of arguments in "proxy_set_header" directive` 报错时,通常是由于配置文件中的语法错误引起的。以下是详细的分析和解决方法: #### 1. **检查指令格式** Nginx 的 `proxy_set_header` 指令需要两个参数:HTTP 头部名称和对应的值。如果仅提供了其中一个参数,则会导致此错误。 例如,以下是一个正确的配置示例: ```nginx proxy_set_header Host $host; ``` 而下面这种写法会导致错误: ```nginx proxy_set_header Host; # 缺少第二个参数 ``` 因此,在配置文件中应确保每条 `proxy_set_header` 指令都包含两个参数[^1]。 --- #### 2. **特殊字符处理** 如果在 `proxy_set_header` 的值部分包含了特殊字符(如 `$`, `<`, `>`),则可能导致解析失败。在这种情况下,建议使用转义符或将整个字符串用双引号括起来。 例如: ```nginx proxy_set_header X-Custom-Header "$value_with_special_chars"; ``` 如果没有正确转义这些字符,可能会引发类似的错误消息[^5]。 --- #### 3. **ConfigMap 或外部模板问题** 如果是通过 Kubernetes ConfigMap 或其他工具动态生成的 Nginx 配置文件,需要注意模板引擎是否会自动替换某些占位符。如果不小心替换了原本应该保留的内容,也可能导致该错误。 例如,Kubernetes ConfigMap 文件中未正确转义变量的情况: ```yaml proxy_set_header Host ${HOST}; # 如果 HOST 为空,则实际生效的是 proxy_set_header Host ; ``` 为了避免此类问题,可以显式指定默认值或使用双引号包裹整个表达式: ```yaml proxy_set_header Host "${HOST:-default_host}"; ``` 这一步骤能够有效防止因变量缺失而导致的语法错误[^5]。 --- #### 4. **验证配置文件合法性** 完成修改后,务必运行以下命令来测试 Nginx 配置文件是否合法: ```bash nginx -t ``` 只有当输出显示 `syntax is ok` 和 `test is successful` 时,才能确认配置无误并安全重启服务。 --- #### 完整示例配置 假设我们需要设置多个自定义头信息,完整的 `server` 块可参考如下形式: ```nginx upstream backend { server 127.0.0.1:8080; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; # 设置标准头部信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 自定义头部信息 proxy_set_header Custom-Header-One "Value One"; proxy_set_header Custom-Header-Two "Value Two with spaces and special chars!"; } } ``` 以上配置展示了如何正确应用 `proxy_set_header` 指令及其常见用途[^1]。 --- #### 总结 为了彻底解决问题,请仔细检查配置文件中的每一行 `proxy_set_header` 指令,确保其遵循正确的语法规则,并妥善处理特殊字符和变量替代情况。最后,利用 `nginx -t` 测试配置文件的有效性后再尝试重新启动服务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值