在CentOS 7上为NGINX启用TCP快速打开

420次阅读
没有评论

共计 3973 个字符,预计需要花费 10 分钟才能阅读完成。

TCP协议是大多数应用程序层协议(例如HTTP,SSH,FTP,NFS等)的基础。事实上,TCP位于IP层(IP地址路由)和应用程序层(用户数据)之间,并负责保证和有序字节流传递。TCP也是指示源端口和目标端口的层。

应用程序对发送方和接收方之间的距离如此敏感的原因之一是,TCP 在发送任何用户数据之前需要进行3次握手。

  1. 发送方向接收方发送一个TCP同步(SYN)数据包,指示其进行传输的愿望;
  2. 接收方以TCP-SYN / ACK数据包作为响应,同时确认发送方并打开自己的TX管道(TCP是双向的)。
  3. 最后,发送方发送一个TCP-ACK数据包以确认接收方的传输意图。

仅在  步骤3之后,发送方才可以真正开始发送数据。实际上,如果查看Wireshark跟踪,通常会看到发送方的TCP-ACK数据包紧跟着一堆数据包。

因此,发送方和接收方之间的距离问题在于,它在步骤1步骤2之间产生了有意义的延迟。此延迟称为往返时间(RTT,也称为ping时间),因为发送方必须等待其数据包一直传输到接收方,然后等待答复返回。

这就是TCP快速打开(TFO)的地方。TFO是TCP协议的扩展,它允许  握手期间启动连接,方法是允许TCP-SYN数据包的有效负载中的数据,从而触发服务器的即时响应。 。

但是,只有在执行了正常的初始握手之后,才能进行TFO。换句话说,TFO扩展提供了一种方法,发送方和接收方可以通过该方法保存彼此之间的一些数据,并基于TFO cookie在历史上相互识别。

TFO非常有用,因为:

  1. TFO是一个内核设置,因此可用于所有希望从TFO中受益的应用程序。
  2. TFO可以 在应用程序的生命周期内有意义地加速打开,使用-关闭连接的应用程序。

加速度有多有意义?首先,有意义的是考虑减少响应时间。如果发送方和接收方彼此分开,则尤其如此。例如,您可能希望您的电子商务站点更快地加载单个目录项,因为每次延误都是客户三思而后行或走开的机会。作为另一个示例,减少用户点击播放按钮与视频实际开始时间之间的时间可以显着改善用户体验。就响应时间而言,它是RTT的函数。

其次,就周转时间而言,这可能非常有意义。如果考虑花费在传输较小文件上的时间,则初始延迟通常比实际数据传输时间大一个或多个数量级。例如,如果应用程序正在同步许多小文件或中文件,则消除握手延迟可以显着改善总传输时间。

为NGINX启用TFO

好的,让我们开始工作,有3个任务需要完成:

  1. 更新内核设置以支持TFO;
  2. 具有TFO支持的源代码编译NGINX;
  3. 修改NGINX配置以接受TFO连接。

TFO的内核支持

从3.7开始,对IPv4 TFO的客户端和服务器支持已合并到Linux内核主线中–您可以使用来检查您的内核版本uname -r。如果您运行的是3.13,则可能默认情况下已启用TFO。否则,请按照以下步骤将其打开。

 

  • 以root用户身份创建文件  /etc/sysctl.d/tcp-fast-open.conf,其内容如下
  • net.ipv4.tcp_fastopen = 3
    
      
    net.ipv4.tcp_fastopen = 3
    Restart sysctl:
    # systemctl restart systemd-sysctl
    
    # systemctl restart systemd-sysctl
    Check the current setting:
    # cat /proc/sys/net/ipv4/tcp_fastopen 3
      
    # cat /proc/sys/net/ipv4/tcp_fastopen

    使用TFO支持编译NGINX

    大多数NGINX软件包当前不包括TFO支持。TFO所需的最低NGINX版本为1.5.8。但这是一个相当旧的版本,因为NGINX现在为1.9.7。接下来的过程将使用1.9.7,但可能会在将来的NGINX版本中使用。检查NGINX新闻页面以获取最新版本。

    1. 以普通用户(不是root用户)的身份下载NGINX源  nginx-1.9.7.ta​​r.gz,将其压缩并移至nginx-1.9.7目录
    2. sudo yum install wget -y wget http://nginx.org/download/nginx-1.9.7.tar.gz tar -xvf nginx-1.9.7.tar.gz cd nginx-1.9.7
      
      sudo yum install wget -y
      wget http://nginx.org/download/nginx-1.9.7.tar.gz
      tar -xvf nginx-1.9.7.tar.gz
      cd nginx-1.9.7

      安装Fedora EPEL存储库(必须在下一个yum install命令之前完成)

    3. sudo yum install -y epel-release
    4. 安装必备软件包:

      sudo yum install -y gcc zlib-devel libatomic_ops-devel pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel GeoIP-devel gperftools-devel
      

      配置构建,并指定  -DTCP_FASTOPEN=23 编译器标志。还要注意,--prefix=/usr/share/nginx配置选项指定了安装根目录,并且还需要手动设置一些其他目录。如果您不担心粉碎现有的NGINX安装和/或想要构建更标准的安装,请将prefix选项更改为/ usr并从其余路径规范中删除  / usr / share / nginx前缀。

      $ ./configure \ --prefix=/usr/share/nginx \ --conf-path=/usr/share/nginx/etc/nginx/nginx.conf \ --error-log-path=/usr/share/nginx/var/log/nginx/error.log \ --http-log-path=/usr/share/nginx/var/log/nginx/access.log \ --http-client-body-temp-path=/usr/share/nginx/var/lib/nginx/tmp/client_body \ --http-proxy-temp-path=/usr/share/nginx/var/lib/nginx/tmp/proxy \ --http-fastcgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/fastcgi \ --http-uwsgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/uwsgi \ --http-scgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/scgi \ --user=nginx \ --group=nginx \ --build="TFO custom build" \ --with-threads \ --with-file-aio \ --with-ipv6 \ \ --with-http_ssl_module \ --with-http_v2_module \ \ --with-http_realip_module \ --with-http_addition_module \ --with-http_xslt_module \ --with-http_image_filter_module \ --with-http_geoip_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_auth_request_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_degradation_module \ --with-http_stub_status_module \ \ --with-mail \ --with-mail_ssl_module \ --with-stream \ --with-stream_ssl_module \ --with-google_perftools_module \ \ --with-pcre \ --with-pcre-jit \ --with-google_perftools_module \ --with-debug \ --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -DTCP_FASTOPEN=23' \ --with-ld-opt='-Wl,-z,relro -Wl,-E'

       

编译NGINX

make

make install

用于TFO的NGINX配置

使用TFO就像将fastopen选项添加到服务器的listen指令一样简单。从NGINX文档中:

fastopen = number为侦听套接字(1.5.8)启用“ TCP快速打开”,并限制尚未完成三向握手的连接队列的最大长度。
编辑/ usr / share / nginx / etc / nginx / nginx.conf文件,并按如下所示修改您的listen指令:
listen 80 fastopen=256
正文完
 
admin
版权声明:本站原创文章,由 admin 2019-12-16发表,共计3973字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码