Ere*_*bih 5 linux nginx load-balancing
我有一个 Nginx 服务器,它不断地处理高负载的请求。我希望能够更改服务器的配置文件并在零停机时间的情况下动态重新加载它。
我在 shell 中运行以下行:
httperf --server=127.0.0.1 --port=80 --uri=/ --num-conns=1 --num-calls=10
Run Code Online (Sandbox Code Playgroud)
当它发送请求时,我正在重新加载我的 nginx 配置。我尝试了以下两个选项:
sudo nginx -s reload
sudo kill -s HUP [pid]
Run Code Online (Sandbox Code Playgroud)
它们都会导致 httperf 返回一些错误。平均而言,在两次良好的请求后,httperf 会退出并打印其日志,相关行如下:
Errors: total 1 client-timo 0 socket-timo 0 connrefused 0 connreset 1
Run Code Online (Sandbox Code Playgroud)
我在很多地方都读到过,重新加载应该无缝地完成,没有停机时间,但从我运行的测试来看,事情似乎有所不同。
我的问题是:
在此先感谢您的帮助,期待看到一些有见地的答案。
Yar*_*min 10
要了解以下答案,需要一些背景知识:
我是否以错误的方式执行测试?
是的,您执行的测试有些错误。问题是您的测试正在使用 PERSISTENT 连接发送 10 个请求。您可以通过运行以下测试轻松检查它,并且不会重置任何连接(因为每个连接仅发送一个请求):
httperf --server=127.0.0.1 --port=80 --uri=/ --num-conns=10 --num-calls=1
Run Code Online (Sandbox Code Playgroud)
为什么我会重置此连接?
如果您查看nginx 文档,您会发现:
旧的工作进程,接收到关闭命令,停止接受新连接并继续为当前请求提供服务,直到所有此类请求都得到服务。之后,旧的工作进程退出。
这是真的,但文档没有提到持久连接发生了什么。我在旧邮件列表中找到了答案。当前正在运行的请求被服务后,nginx 将通过发送[FIN, ACK]到客户端来启动持久连接关闭。
为了检查它,我使用了 WireShark 并配置了一个带有一个简单工作器的服务器,它根据请求休眠 5 秒然后回复。我使用以下命令发送请求:
httperf --server=127.0.0.1 --port=80 --uri=/ --num-conns=1 --num-calls=2
Run Code Online (Sandbox Code Playgroud)
在发出前面提到的命令后,我重新加载了 nginx(在它处理第一个请求时)。以下是 WireShark 嗅探到的软件包:
nginx reload被处决了。没关系,该服务器没有对第二个请求发送任何响应。根据TCP 连接终止:
终止的一方不能再向连接发送任何数据,但另一方可以。终止端应继续读取数据,直到另一端也终止。
下一个问题是为什么客户端在收到服务器的关闭连接信号后会发生 4093?
大概这就是答案:
我会说 POST 与 FIN 同时发生,即客户端发送 POST 是因为它的 TCP 堆栈还没有处理来自服务器的 FIN。请注意,数据包捕获是在系统处理数据之前完成的。
我不能对此发表评论,因为我不是网络专家。也许其他人可以给出更深入的答案,为什么要发送第二个请求。
UPD先前链接的问题不相关。询问了有关该问题的单独问题。
这个问题有解决方案吗?
正如邮件列表中提到的:
HTTP/1.1 客户端需要处理 keepalive 连接关闭,所以这应该不是问题。
我认为它应该在客户端处理。如果连接被服务器关闭,客户端应该打开新连接并重试请求。
我实际上需要一个负载平衡器,我可以从中动态添加和删除服务器,有没有适合我的问题的更好的解决方案?
我不知道其他服务器,所以不能在这里提供建议。
一旦您的客户端可以正确处理连接关闭,就不应该有任何理由阻止您使用 nginx。
| 归档时间: |
|
| 查看次数: |
2982 次 |
| 最近记录: |