Nginx1.13版本reload过程中各项连接情况和状态的测试。测试Nginx1.13 Reload过程中,对客户端和服务器的TCP层面的包影响。
    1)对客户端开启长连接,服务端开启/不开启长连接情况下
        测试方法:浏览器发起http自带connection:keep-alive,服务端分别在开启和不开启长连接的情况下,然后在重新打开浏览器访问,连续访问5次,期间会reload nginx。整个过程对81和8010端口抓包。
    2)对TCP长连接代理的情况下
        测试方法:连接82端口,发送tcp,再发送tcp1,断开连接。然后连接ws,发送tcp_reload,执行nginx reload,再发送tcp_reload1,断开连接。整个过程抓82和8012端口的包。
    3)对Websocket保持连接的情况下
        测试方法:连接ws,发送hello,再发送hello1,断开连接。然后连接ws,发送hello_reload,执行nginx reload,再发送hello_reload1,断开连接。整个过程抓81和8010端口的包。
 
如下所示,是测试的环境访问流程。三项测试都是用该环境。

 
** 测试代码见文章末尾

 
1)对客户端开启长连接,服务端开启/不开启长连接情况下
1.1)环境的配置:
Real server使用python的SimpleHTTPServer模块启动一个简单的web服务,监听8010端口。如下图所示:
 

1.2)Nginx的配置:
不开启长连接时的配置如下,开启长连接时把注释去掉即可:
upstream websocket {
server localhost:8010;
#keepalive 2;
} server {
listen 81;
server_name localhost; location /websocket {
proxy_pass http://websocket/;
#proxy_http_version 1.1;
#proxy_set_header Connection "";
}
 
1.3)测试方法:浏览器发起http自带connection:keep-alive,服务端分别在开启和不开启长连接的情况下,然后在重新打开浏览器访问,连续访问5次,期间会reload nginx。整个过程对81和8010端口抓包。
81端口的抓包情况如下:
开启长连接时8010端口的抓包情况如下:
 
发现开启了长连接之后每次请求都会新建连接,进行三次握手,这是因为SimpleHTTPServer没有做处理的原因,换成tomcat(8080端口)之后,同样配置下访问五次使用的是同一个连接进行传输的。如下所示:

不开启长连接时8010端口的抓包情况如下:

2)对TCP长连接代理的情况下
2.1)环境的配置:
Real server使用python实现TCP Server,监听8012端口。如下图所示:

客户端使用python实现TCP Client。连接nginx的82端口。如下图所示:
 
2.2)Nginx的配置:
tcp代理的配置如下:
stream {
upstream tcp_server {
server localhost:8012 weight=5;
}
server {
listen 82;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass tcp_server;
}
}
2.3)测试方法:连接82端口,发送tcp,再发送tcp1,断开连接。然后连接ws,发送tcp_reload,执行nginx reload,再发送tcp_reload1,断开连接。整个过程抓82和8012端口的包。
82端口抓到的包如下:
 
8012端口抓到的包如下:
 
2.4)nginx reload前后进程状态对比:
 
3)对Websocket保持连接的情况下
3.1)环境的配置:
Real server使用nodejs的启动一个简单的websocket服务,监听8010端口。如下图所示:
 
客户端连接如下:

3.2)Nginx的配置:
不开启长连接时的配置如下,开启长连接时把map段和proxy_set_header注释即可:
upstream websocket {
server localhost:8010;
#keepalive 2;
} server {
listen 81;
server_name localhost; location /websocket {
proxy_pass http://websocket/;
#proxy_http_version 1.1;
#proxy_set_header Connection "";
}
 
3.3)测试方法:连接ws,发送hello,再发送hello1,断开连接。然后连接ws,发送hello_reload,执行nginx reload,再发送hello_reload1,断开连接。整个过程抓81和8010端口的包。
81端口抓到的包如下:
 

8010端口抓到的包如下:

3.4)nginx reload前后进程状态对比:
 
 
结论:综上分析可知,不管nginx是否开启长连接,nginx在reload过程中,nginx对客户端和反向代理的后端在TCP代理,websocket代理和upstream反向代理的情况下均没有影响,nginx会在reload时把正常处理连接的worker设置shutting down状态,不接受新的请求,然后新启动一个worker进程接收处理新的请求,shutting down的worker直至处理完当前连接之后优雅退出。对于客户端的连接也是一样的。
 
# cat tcp_server.py
# -*- coding: utf-8 -*- import SocketServer
from SocketServer import StreamRequestHandler as SRH
from time import ctime
import time import sys
reload(sys)
sys.setdefaultencoding('utf8') #host = '127.0.0.1'
host='127.0.0.1'
port = 8012
addr = (host, port) class Servers(SRH):
def handle(self):
print 'got connection from ', self.client_address
self.wfile.write('connection %s:%s at %s succeed!' % (host, port, ctime()))
while True:
data = self.request.recv(1024)
if not data:
break
#print data
cur_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print "%s RECV from %s, data is:%s" % (cur_time,self.client_address[0],data)
self.request.send(data) print 'server is running....'
server = SocketServer.ThreadingTCPServer(addr, Servers)
server.serve_forever()
# cat server.js
console.log("Server started");
var Msg = '';
var WebSocketServer = require('ws').Server
, wss = new WebSocketServer({port: 8010});
wss.on('connection', function(ws) {
ws.on('message', function(message) {
console.log('Received from client: %s', message);
ws.send('Server received from client: ' + message);
});
});

[原创] Nginx1.13版本reload过程对TCP包影响的测试的更多相关文章

  1. centos7安装nginx-1.13.6 新手入门,图文解析

    系统环境 操作系统:64位CentOS Linux release 7.2.1511 (Core) 安装nginx依赖包 [root@localhost ~]# yum install gcc-c++ ...

  2. CentOS7 + Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装

    一.安装Nginx 1.安装依赖扩展 # yum -y install wget openssl* gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng ...

  3. [转帖]IP /TCP协议及握手过程和数据包格式中级详解

    IP /TCP协议及握手过程和数据包格式中级详解 https://www.toutiao.com/a6665292902458982926/ 写的挺好的 其实 一直没闹明白 网络好 广播地址 还有 网 ...

  4. CentOS 7配置nginx-1.13.10支持http/2和Server Push

    0.确保openssl版本大于1.0.2 openssl version 1.下载nginx-1.13.10 wget http://nginx.org/download/nginx-1.13.10. ...

  5. CentOS下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装

    一.安装Nginx ①安装依赖扩展 # yum -y install wget openssl* gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng l ...

  6. 《k8s-1.13版本源码分析》-测试环境搭建(k8s-1.13版本单节点环境搭建)

    本文原始地址(gitbook格式):https://farmer-hutao.github.io/k8s-source-code-analysis/prepare/debug-environment. ...

  7. CentOS 7 Nginx1.12.2平滑升级到新版本nginx-1.13.3

    查看当前Nginx版本信息 [root@web ~]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/ built by gcc (Red H ...

  8. windows10下 MySQL5.7.18版本安装过程及遇到的问题

    windows10下 MySQL5.7.18版本安装过程及遇到的问题           mysql-5.7.18-winx64 安装           1.解压 此次将MySQL装在H盘,依个人喜 ...

  9. Centos7 下nginx nginx-1.13.4 安装

    环境:CentOS Linux release 7.3.1611 (Core)  Linux localhost.localdomain 3.10.0-514.26.2.el7.x86_64 #1 S ...

随机推荐

  1. PHP-- B/S结构

    B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简 ...

  2. PLSQL连接数据库报监听程序找不到符合协议堆

    服务器上某个数据库出现' ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程'错误,要解决该问题首先查看一下数据库现有的进程数,是否已经达到参数processes的大小   根 ...

  3. .Net Core CLR FileFormat Call Method( Include MetaData, Stream, #~)

    .Net Core  CLR PE 文件启动方法,找到函数入口点,调用整个.Net 程式宿主. 使用方法:可以利用Visual Studio新建一个控制台应用程序,然后生成DLL,替换掉本程序DLL, ...

  4. codeforces 322 A Ciel and Dancing

    题目链接 题意: 有n个男孩和m个女孩,他们要结对跳舞,每对要有一个女孩和一个男孩,而且其中一个要求之前没有和其他人结对,求出最大可以结多少对. 如图,一条线代表一对,只有这样三种情况. #inclu ...

  5. codeforces 318 A.Even Odds B.Sereja and Array

    A.Even Odds 给你n和k, 把从1到n先排奇数后排偶数排成一个新的序列,输出第k个位置的数. 比如 10 3  拍好后就是 1 3 5 7 9 2 4 6 8 10   第3个数是5. // ...

  6. Cannot attach the file “MvcMovie.mdf” as database “aspnet-MvcMovie”

    今天在微软开发人员官网上学习asp.net mvc5入门的时候,遇到一个棘手的问题,我是按照教程一步一步操作的,但期间遇到一个自己觉得莫名其妙的问题,教程中也没有提到这个, 在添加新字段这一章节,跟着 ...

  7. Python 四大主流 Web 编程框架

    Python 四大主流 Web 编程框架 目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架 ...

  8. 完整原型链详细图解之JS构造函数、原型 原型链、实例化对象

    一.首先说一下什么是构造函数: 构造函数:用来在创建对象时初始化对象.特点:构造函数名一般为大写字母开头:与new运算符一起使用来实例化对象. 举例: function Person(){} //Pe ...

  9. 非常实用的select下拉框-Select2.js

    在Web开发中,Select下拉框是常用的输入组件.由于原生的Select几乎很难通过CSS样式控制.一些好看的Select下拉框就只能通过模拟来实现.PHP程序员雷雪松给大家推荐一筐款不错的Sele ...

  10. LeetCode——264. Ugly Number II

    题目: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fact ...