写点什么

NGINX 应用性能优化指南(第六部分):连接优化

  • 2016-05-08
  • 本文字数:1860 字

    阅读完需:约 6 分钟

【编者的话】本文是“NGINX 应用性能优化指南”系列文章的第六篇,主要介绍了如何从连接优化方面实现 NGINX 应用性能优化。

注:本文最初发布于 MaxCDN 博客,InfoQ 中文站在获得作者授权的基础上对文章进行了翻译。

正文

RFC 7413 定义了 TCP Fast Open(TFO)——一种对 TCP 协议的扩展,允许在 TCP 握手期间的 TCP-SYN 和 TCP-SYN/ACK 数据包中夹带数据,这样就减少了一个 RTT。

在原有 TCP 连接的基础上,客户端生成一个TFO cookie,并将其放进 TCP-SYN 数据包作为一个 TCP 选项。稍后,当客户端再次连接时,它会在 TCP-SYN 数据包中再次发送同样的 cookie,同数据一起——可能是一个 HTTP 请求或者一个 TLS ClientHello。如果服务器识别出这个 cookie,那么它立即就会转换为已连接状态,并接收在 TCP-SYN 数据包中找到的数据。

虽然服务器可以使用 TCP-SYN/ACK 数据包中的数据回复,但更可能(从时间角度),TCP 栈会在 a 应用程序数据跟随到来之前发出 TCP-SYN/ACK 数据包。不管哪一种情况,数据较少的 TCP 握手往返现在可以用于发送和接收数据了,节省了一次往返。

这有益于加速 HTTP 请求,改善流媒体的首字节时间(TTFB)。实现 TFO 的核心以及 NGINX 所需要的所有东西就是listen指令的fastopen参数。

自 3.7 版本开始,在 IPv4 上支持 TFO 已经合并进 Linux 内核主干上(可以使用uname -r查看内核版本)。如果你运行着 3.13 或更好版本的内核,TFO 很可能已经默认启用。可以使用下面的命令(Linux)检查 TFO 是否启用:

复制代码
$ cat /proc/sys/net/ipv4/tcp_fastopen

0 值表明它被禁用了;位 0 对应客户端操作,而位 1 对应服务器操作。把tcp_fastopen设为 3 可将两者同时启用。

大多数可下载 NGINX 程序包都不包含TFO 支持,因为 TCP_FASTOPEN 并不一定在tcp.h中定义——即使内核提供了支持。你可以通过源代码构建 NGINX,并将编译时将限定-DTCP_FASTOPEN=23添加到 NGINX 的配置脚本中(--with-cc-opt)。

相关教程:在 CentOS 7 上启用 TFO for NGINX

证书验证

在 TLS 协商期间,客户端必须验证服务器的证书,以确信那个服务器就是它实际上请求的服务器。

验证通常包括生成一个 OCSP 请求,并发送给证书认证中心(CA),这意味着生成一个 DNS 查询和一个新的 TCP 连接。所有这些步骤都延长了同服务器进行 TLS 协商的时间。

OCSP Stapling 概念将 OCSP 查询的负担从客户端移到了服务器。结果是,服务器将 CA 的时限应答“钉合(stapling)”到服务器的证书上,这样一来就简化了客户端的证书验证步骤。

NGINX 通过ssl_stapling及相关指令来支持 OCSP Stapling。

TLS 会话恢复

有两种机制可以用于让后续 TLS 连接(下面会讨论)少一次往返:

  1. TLS 会话 ID
  2. TLS 会话票证

需要注意的是,TLS 会话恢复在服务器端会泄露 TLS 会话信息,破坏“完全前向保密(perfect forward secrecy)”。因此,如果需要 PFS,就不应该用它。另一方面,通过在一个 TLS 隧道中复用多个请求,HTTP/2 提供了同TLS 会话恢复一样的 RTT 优化,而且不用牺牲 PFS。

TLS 会话 ID

在最初的 TLS 握手期间,服务器会生成一个 TLS 会话 ID,并通过 ServerHello 消息发送给客户端——这在 Wireshark 跟踪文件中可以看到:

对于后续的 TLS 握手,客户端可能会在其 ClientHello 消息中发送会话 ID。这就使得服务器可以恢复缓存的 TLS 上下文,在一次 TLS 握手中省掉两次往返。

NGINX 通过ssl_session_cachessl_session_timeout指令支持 TLS 会话 ID。

TLS 会话票证

TLS 会话票证TLS 会话 ID的概念类似,不过存储会话信息的负担由服务器端转移到了客户端。

在一次普通的 TLS 握手期间,服务器会加密其 TLS 会话信息,并将结果票证发送给客户端。虽然客户端无法解码票证,但它可以在下次想要建立 TLS 连接时将其发回服务器。

TLS 会话 ID一样,这会减少一次往返——但服务器不必维护 SSL 缓存。不过,服务器必须维护一个用于加密票证的密钥(ssl_session_ticket_key),并要确保它的安全。

找到属于自己的理想 NGINX 设置

按照设计,NGINX 是完全开放的。它是一辆装有光面轮胎的赛车,而且驾驶它的是一个疯狂的司机。所以大家一起尽情地玩,尝试一些东西,让我们知道你能让它多快。此外,如果你认为有什么东西应该加入到这份指南中,请告诉我们。我们会在第二个版本中补充和修正。

查看英文原文: NGINX Application Performance Optimization:Connection Optimizations


感谢郭蕾对本文的策划和审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-05-08 18:065205
用户头像

发布了 1008 篇内容, 共 426.4 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

下一个颠覆的领域:区块链如何影响审计行业?(上)

CECBC

☕️【Java技术之旅】【AbstractQueuedSynchronizer】教你自定义实现自己的同步器

码界西柚

Java 并发编程 AQS 同步器

全栈工程师必备技能栈,聊聊月薪两万以内都该会点啥?

java小李

jquery less

21道最新Java面试题剖析(数据库+JVM+微服务+高并发)

java小李

dubbo Spirng

Spring Boot中常用数据库的配置

偏执

Java spring 后端

一篇文章告诉你什么是Spring

愚者

Java spring

多鲸专访拍乐云赵加雨:素质教育进化,音视频探路新风口

拍乐云Pano

弯道超车!阿里甩出Spring Security宝典我粉了

java小李

java 14 Sprin

百度人脸离线识别SDK安卓版升级指南

百度大脑

人工智能 升级迭代

阿里面试必备:100个高频Spring面试题,助你一臂之力

java小李

Spring Boot Sprin

中国信通院发布2021年首批“可信AI成果” 百度摘取5项大奖

百度大脑

人工智能

「从零开始学SpringBoot」—如何开始使用?

java小李

maven Sprint Boot

阿里大出血!SpringBoot/SpringCloud全套学习脑图+面试笔记免费分享了

愚者

面试 Spring Cloud Spring Boot

2021年涌现大量低代码玩家,如何辨别低代码平台“真假”?

优秀

低代码

从一线城市回到三四线城市的第四个月

布衣骇客

回忆 个人总结 生活随想

插件编排在 Apache APISIX 中的应用与实践

API7.ai 技术团队

lua 开源 网关 APISIX

MySQL数据的备份和恢复

java小李

myqr java基础

来自阿里资深架构师的吐血制作,39W字千道Java一线大厂面试题手册

愚者

Java 面试

区块链技术在产品溯源领域的应用

CECBC

百度AI师资培训兰州站启动 社会科学家的第一节人工智能课来了!

百度大脑

人工智能 启蒙 教室

[架构实战营]模块三作业

xyu

#架构实战营

非常全面!Java的方法详解和总结,建议收藏

java小李

java基础

云计算深度挖掘“创新潜力”,北鲲云深耕生命科学领域

北鲲云

架构实战营 - 模块 3 - 外包学生管理系统架构文档

蔸蔸

MySQL 基础知识+索引相关

java小李

MySQL

学生管理系统架构设计文档示例-模块3

小牧ah

架构实战营

Java集合框架

愚者

Java 集合

多线程交替输出

愚者

Java 多线程

模块三

泰戈

降低“美丽成本”,区块链助力化妆品行业数字化转型

CECBC

外包学生管理系统架构文档

十二万伏特皮卡丘

架构实战营

NGINX应用性能优化指南(第六部分):连接优化_后端_谢丽_InfoQ精选文章