MERN站点Express.js后端接口请求到达延迟过高该如何优化?
问题排查与优化方向
1. 网络链路层排查
- 首先排查域名解析耗时:在客户端本地执行
nslookup www.edvicer.com或者dig www.edvicer.com,查看DNS解析是否有延迟、是否存在DNS缓存污染、是否配置了多线解析导致线路匹配错误 - 测试网络链路延迟:在客户端执行
tracert www.edvicer.com(Windows)或者traceroute www.edvicer.com(Linux/macOS),排查中间路由节点是否存在丢包、跳数异常的情况,重点看目标服务器前几跳的延迟数据 - 端口连通性与防火墙策略:检查服务器端1235端口的防火墙规则,是否存在速率限制、连接数限制,是否配置了DDoS防护规则导致正常请求被先拦截校验再放行,多数云服务商的默认高防规则会对陌生IP的首次请求做几秒的延迟校验
2. HTTPS握手环节排查
- 你使用的是自定义端口的HTTPS服务,优先检查TLS配置:是否开启了TLS会话复用(Session Ticket、Session ID),如果每次请求都要重新走完整的TLS 1.2/1.3握手流程,会增加几百毫秒到几秒的延迟
- 检查证书链配置是否完整:如果服务器返回的证书缺少中间证书,客户端会额外发起请求去拉取中间证书,大幅增加握手耗时,可以用本地的openssl命令验证:
openssl s_client -connect www.edvicer.com:1235,查看证书链是否完整、握手耗时是多少
3. Express服务前置环节排查
- 检查是否有反向代理层:如果你的Express服务前面部署了Nginx、CDN、WAF等中间层,优先排查中间层的配置:是否有请求缓存校验规则、是否有速率限制、是否开启了请求体缓冲、是否存在中间层到Express服务的网络异常
- 检查Express全局中间件:你贴的/test路由代码本身没有问题,但要注意所有挂载在app级别的前置中间件都会在路由匹配前执行,比如自定义的日志中间件、CORS中间件、鉴权中间件、cookie解析中间件等,是否在这些中间件里有异步操作(比如数据库查询、远程接口调用)卡住,你可以在第一个全局中间件的第一行加打印,看请求到第一个中间件的时间和到/test路由的时间差,定位是否是中间件的问题
- 检查Express服务的连接配置:是否配置了
server.maxConnections限制了最大连接数,当前连接数溢出导致请求被挂在TCP队列里等待,没有被Express进程处理
4. 服务器系统层面排查
- 检查服务器的负载状态:用
top、htop查看CPU、内存占用,用iftop查看网卡流量,用ss -s查看TCP连接数,是否存在CPU跑满、内存不足、TCP连接数耗尽的情况 - 检查系统文件描述符限制:如果进程的open files限制过低,新的TCP连接无法被分配文件描述符,会导致请求挂起,用
ulimit -n查看当前进程的文件描述符限制
优化建议
- 如果是公网链路延迟问题,可以考虑把接口服务接入CDN的动态加速功能,或者将服务部署到离用户群体更近的地域节点
- 开启TLS会话复用,优化HTTPS握手耗时,如果你没有特殊需求,也可以考虑把自定义端口的服务迁移到443标准端口,避免部分运营商对非标准端口的限速、限流
- 给Express服务前面加一层Nginx反向代理,由Nginx处理TLS握手、静态资源、连接复用,比Express直接对外提供HTTPS服务的性能高很多
内容的提问来源于stack exchange,提问作者Vaibhav Srivastava
相关产品推荐
相关产品推荐

