近期,线上Nginx服务器的TPS未超过100,但其Writing、Active连接数有时却超过了300。因为服务对响应时间要求较高,同时每个调用方使用的IP地址有限(即总的不同的连接地址有限),所以使用HTTPs长连接技术。(HTTP长连接与短连接)
问题现象:使用"sudo netstat -antp | grep 80"发现,存在大量的"TIME_WAIT" socket等待中断请求确认的线程(8000+)
原因:使用Wireshark分析tcpdump.txt发现,eleme使用短连接请求(非长连接,Keep-Alive),而服务器端使用的却是长连接。eleme每次请求都会新开一个连接,请求完之后就把该连接关闭了;而服务端线程在处理完请求后却一直打开等待着下一个请求的到来(5min最长存活时间),同时对新的请求又需要新建一个线程,致使大量线程出现"TIME_WAIT"现象,所有请求处理线程都等待5min后才会被服务器关闭。
解决方法:让eleme改为长连接请求
[参考]
- Apache服务器的 FIN_WAIT1 过多 TIME_WAIT 过多问题解决
- UNIX / Linux: 10 Netstat Command Examples
- netstat命令详解 (10 Netstat Command Examples 中文版)
- netstat(8) - Print network connections, routing tables, interface statistics - Linux manual page
[RFC] 服务端无状态的传输层安全(TLS)会话恢复协议
无状态TLS会话恢复机制概述
先说说TLS会话恢复机制的出现是为了解决什么问题?
【背景】
SSL会话恢复的原理是在服务端缓存所有的session,客户端之后在每次和服务端握手时通过Session ID完成session状态恢复。这种机制对服务端有如下挑战:
1. 如果是在本机缓存session,必须保证同一个客户端的请求要落到同一台服务器,这无疑给前端负载均衡策略增大了压力。
2. 如果是为一个集群单独建立一个shared的session cache,同样也增加了请求的处理环节,并增加了系统的成本(都是money啊)。
之所以如此纠结是因为SSL觉得session信息必须放在服务端缓存,而SSL的替代者TLS则提供了新的选择,服务端无状态的会话恢复机制。
【原理】
简单的说,就是服务端不再缓存session的状态信息,而是将其加密并分发和转存到客户端,缓存在客户端的session状态信息叫Ticket(船票,你懂得)。客户端每次请求时同时发送ticket到服务端,服务端将其解密并reuse之前的session状态信息。
[参考]
- 服务端无状态的TLS session resumption机制 - 淘宝千石
- Optimizing for TLS - Chapter 4. Transport Layer Security (TLS)
- TLS优化 - Optimizing for TLS
1. 触发新的会话票证的完整握手的消息流
真实的网络数据包:
“Message Flow for Full Handshake Issuing New Session Ticket”适合HTTPS短连接场景。
3. 不触发新的会话票证的服务器完成完整握手的消息流
真实的网络数据包:
“Message Flow for Server Completing Full Handshake Without Issuing New Session Ticket”适合HTTPS长连接场景。
待解决“存在TCP重复ACK和丢包现象”:
参考
[PDF] Transport Layer Security (TLS) Session Resumption without Server-Side State
玩的开心!^_^
相关推荐
本文讨论了在线上环境中,服务端长连接和客户端短连接配置不当导致Nginx服务器产生大量“TIME_WAIT”状态线程的问题,同时提供了问题的分析和解决方法。本文主要涉及的网络编程知识点包括长连接与短连接的定义和区别...
1. Nginx作为负载均衡器,与PHP-FPM通信时通常采用短连接方式,这会导致大量连接在完成数据交换后进入TIME_WAIT状态。 2. TCP/IP协议的设计,为了防止旧连接的延迟数据影响新连接,以及确保TCP连接可靠关闭,会将...
"TCP 状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题解决" TCP 状态迁移是 TCP 协议中的一种机制,它用于描述 TCP 连接的不同状态。在 TCP 连接中,客户端和服务器端都可以处于不同的状态,例如 ESTABLISHED、CLOSE_WAIT...
另一方面,`upstream_response_time` 是用来跟踪从Nginx与上游服务器建立连接到接收完整响应并关闭连接的时间。这个时间仅包括了Nginx与后端服务器之间的交互,不包含客户端的网络延迟和Nginx自身的处理时间。格式...
从提供的文件信息中,我们可以提取出有关于Nginx与Tomcat以及客户端之间请求的长连接配置不一致问题的分析解决知识点。同时,文件中提到了Linux系统中netstat命令的用法,我们可以从这部分内容中提取出与网络连接...
4. 关闭 TIME_WAIT 连接:使用 netstat -ant | grep TIME_WAIT | awk '{print $2}' | xargs kill -9 命令可以关闭 TIME_WAIT 连接。 网络连接状态详解: 网络连接状态可以分为 12 种可能的状态,前面 11 种是按照 ...
### Nginx安装与后端健康检查模块配置详解 #### 一、Nginx环境搭建与核心组件安装 **1.1 基础环境准备** - **操作系统**: CentOS 6.5 - **基本服务器配置**: 在安装过程中选择了“基本服务器”配置。 **1.2 安装...
1. **端口资源耗尽**:对于作为客户端的主机而言,如果频繁地创建和关闭大量连接,将使得短时间内产生大量的`TIME_WAIT`状态,占用端口资源。在Linux系统中,默认端口范围为32768-61000。根据TCP连接的四元组特性,...
在Nginx配置文件中,`nginx_upstream_check_module`的使用涉及到一些特定的指令,如`check`、`check_interval`、`check_timeout`等。以下是一个简单的示例: ```nginx http { upstream backend { server backend1...
5. **客户端集成**:在客户端JavaScript代码中,通过Ajax或者WebSocket与服务器建立长连接,订阅频道并接收推送的数据。 在实际应用中,需要注意以下几点: 1. **性能优化**:由于Web推送可能导致大量并发连接,...
这里`include`指令用于引入其他配置文件,`default_type`定义默认MIME类型,`sendfile`启用高效文件传输,`keepalive_timeout`设置客户端保持连接的超时时间。 4. **server块** - `server`块定义了一个监听特定...
5. **超时设置**:通过`proxy_timeout`可以设置与后端服务器的连接超时时间。 6. **Proxy Protocol**:如果开启`proxy_protocol`选项,Nginx会传递客户端的原始IP地址和其他信息,这对于需要识别真实客户端IP的情况...
Nginx 默认会记录访问日志,这些日志可以帮助分析服务器的运行状态、流量情况以及问题排查。日志格式可以通过 log_format 指令自定义,日志文件路径在 access.log 和 error.log 中设定。通过日志分析工具,如 ...
4. **keepalive_timeout**: 这个参数设置的是与客户端保持长连接的超时时间。默认值为75秒,你可以设置为更长的时间,如600秒,以便在处理大量短连接请求时减少连接开销。 5. **proxy_connect_timeout**: 定义Nginx...
linux nginx nginx_upstream_jvm_route
`nginx_upstream_check_module`还可以与其他模块结合使用,如`nginx_plus_api`,以提供更丰富的监控和管理功能。同时,可以根据实际需求调整检查算法、增加自定义检查脚本等,以实现更高级的健康检查逻辑。 总之,`...
在Nginx配置文件(通常是`/etc/nginx/nginx.conf`或`/usr/local/nginx/conf/nginx.conf`)中,可以使用`allow`和`deny`指令来允许或禁止特定IP或IP段的访问。以下是一个示例: ```nginx server { listen 80; ...