写点什么

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:065454
用户头像

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

关注

评论

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

大选获胜,盘点特朗普相关加密货币资产

TechubNews

《实力见证,卓越前行 ——伊克罗德信息荣获 Amazon Redshift Delivery 认证》

伊克罗德信息科技

大数据 Amazon

覆盖30个省市自治区万余家医疗机构,原生鸿蒙助力打造智慧医疗便利体验

最新动态

GitLab 出现 500错误怎么解决?

极狐GitLab

gitlab

比 Copilot 快两倍以上!在我的开源项目 AI Godot 桌宠中用通义灵码解决问题

阿里云云效

阿里云 云原生

5分钟搞懂 Golang 数据库连接管理

俞凡

golang

快递鸟单号识别API接口代码操作流程

快递鸟

快递

哇喔!20种单例模式的实现与变异总结

威哥爱编程

Java 设计模式 单例模式 JavaEE

MES系统助力中小企业数字化转型

万界星空科技

数字化转型 生产管理系统 mes 万界星空科技 中小企业数字化转型

2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值。 找出nums中长度为k的所有子

福大大架构师每日一题

福大大架构师每日一题

比 Copilot 快两倍以上!在我的开源项目 AI Godot 桌宠中用通义灵码解决问题

阿里巴巴云原生

阿里云 云原生

怎么在线画用户旅程图?分享10个用户旅程图模板!

职场工具箱

职场 产品经理 在线白板 绘图工具 用户旅程图

快递鸟物流跟踪API代码参数接入流程

快递鸟

快递物流

语音 AI 革命:未来,消费者更可能倾向于与 AI 沟通,而非人工客服

RTE开发者社区

第74期 | GPTSecurity周报

云起无垠

鸿蒙网络编程系列47-仓颉版UDP客户端

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

公链数字钱包开发与加密钱包App原生开发

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

【问卷调研】HarmonyOS SDK开发者社区用户需求有奖调研

HarmonyOS SDK

尝鲜智能体,今年双十一“快递100”用上混元大模型

极客天地

如何使用PHP开发API接口?

科普小能手

php API php扩展 API接口 API 测试

Serverless 微服务治理神器: 阿里云 SAE 全链路灰度揭秘

阿里巴巴云原生

阿里云 Serverless 云原生

区块链NFT项目开发流程

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

更经济实惠的SD-WAN组网

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

淘宝订单信息获取接口,淘宝订单信息获取API

tbapi

淘宝API接口 淘宝店铺订单接口 天猫店铺订单接口 淘宝店铺订单API

Python 如何根据给定模型计算权值

不在线第一只蜗牛

Python 深度学习

GitLab 如何降级安装?

极狐GitLab

2024年AI办公工具API:优化工作流程的智能解决方案

幂简集成

API

南京大学 鲲鹏昇腾科教创新孵化中心揭牌,引领高校科研生态新模式

极客天地

【JIT/极态云】技术文档--模型事件

武汉万云网络科技有限公司

【JIT/极态云】技术文档--审批事件

武汉万云网络科技有限公司

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