HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

大米“绑上”区块链,江苏为农产品上“身份证”

CECBC

上线仅仅三小时,豆瓣评分均9.0的“四本程序员必刷书籍”火了

Java架构之路

Java 程序员 架构 面试 编程语言

EOKEX交易所系统开发方案丨EOKEX交易所源码平台

系统开发咨询1357O98O718

第八大洲环游记(二):中东云计算,异口同韵

脑极体

架构师实战营 模块三作业(基于自研集群 + MySQL存储的消息队列系统架构设计文档)

代廉洁

架构实战营

4.1 Go语言从入门到精通:函数

xcbeyond

函数 Go 语言 5月日更

卸载 Navicat!事实已证明,正版客户端,它更牛逼

比伯

Java 编程 架构 互联网 计算机

Tomcat 中是怎么处理文件上传的?

AI乔治

Java tomcat 架构 HTTP

Github标星过万!能让面试官满意的Java面试笔记到底有多强?

Java 程序员 架构 面试

教你写好代码注释

元闰子

软件开发 代码注释

从分层架构到微服务架构(一)

元闰子

学习 读书笔记 架构

不爱跳槽的程序员集中在8-17k,揭晓中国开发者的真实现状

Java架构师迁哥

测试

bilibili

从理论走向实践,金五银六Java线程池指南已上线,一次性教给你!

飞飞JAva

Java 线程池

【Vue3】起步

德育处主任

JavaScript Vue 大前端 Web Vue 3

牛客网亲测有效!牛客下载量近百万的Java程序员复盘秘籍真滴强

Java架构之路

Java 程序员 架构 面试 编程语言

这可能是史上最易懂的计算机网络科普文

追谏

面试 大前端 网络协议 科普 TCP/IP

数字经济如何推动制造业高质量发展

CECBC

教你写好技术文章

元闰子

技术人 写作技巧

一张漫画解读:程序员为什么会跑路?

Java架构师迁哥

CPU战争40年,终于把Intel打趴下了

Java架构师迁哥

Boss直聘超90W次转发的Java面试题库!已超神

Java架构师迁哥

你开25k?我给30k!能让面试官满意的Java面试笔记到底有多强?

Java 程序员 架构 面试

马特机器人系统开发具体详情丨马特现成源码开发

系统开发咨询1357O98O718

架构师实战营 模块三总结

代廉洁

架构实战营

差点跳起来了!阿里首推22w字Java面试复盘宝典成功助我入职美团

Java架构之路

Java 程序员 架构 面试 编程语言

GreenPlum数据库介绍

数据社

5月日更

别再纠结“性能优化方案有哪些”了

追谏

面试 大前端

对Spring Cloud+Nginx架构的主要组件不清楚,看这个就好

小Q

Java 学习 架构 面试 微服务

网络攻防学习笔记 Day4

穿过生命散发芬芳

5月日更 网络攻防

☕JVM技术之旅-带你认识GC回收的原理

洛神灬殇

Java JVM GC GC Root 5月日更

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