将http中止/关闭从nginx传播到uwsgi/Django
我有一个Django应用程序web应用程序,我想知道nginx是否可以将abort/close传播到uwsgi/Django 基本上,我知道nginx知道提前中止/关闭,因为它默认将将http中止/关闭从nginx传播到uwsgi/Django,django,nginx,uwsgi,Django,Nginx,Uwsgi,我有一个Django应用程序web应用程序,我想知道nginx是否可以将abort/close传播到uwsgi/Django 基本上,我知道nginx知道提前中止/关闭,因为它默认将uwsgi\u ignore\u client\u abort设置为“off”,并且在发送响应之前中止/关闭请求时,nginx日志中会出现nginx 499错误。一旦uwsgi完成对请求的处理,当它将响应返回给nginx时,会抛出一个“IO错误” 将uwsgi\u ignore\u client\u abort设置为
uwsgi\u ignore\u client\u abort
设置为“off”,并且在发送响应之前中止/关闭请求时,nginx日志中会出现nginx 499错误。一旦uwsgi完成对请求的处理,当它将响应返回给nginx时,会抛出一个“IO错误”
将uwsgi\u ignore\u client\u abort
设置为“开”只会使nginx不知道中止/关闭,并删除uwsgi“IO错误”,因为uwsgi仍然可以写回nginx
我的用例是,我有一个应用程序,其中人们可以快速浏览一些ajax结果,因此,如果快速浏览页面,我将中止他们跳过的页面的挂起ajax请求,这将保持客户机干净高效。但是这对服务器端(uwsgi/Django)没有任何作用,因为即使没有任何东西等待响应,它们仍然必须处理每个请求
现在很明显,可能有某些页面,我不希望由于任何原因导致请求过早中止。但我使用芹菜来处理可能属于这一类的长时间运行的请求
那么这可能吗uwsgi的
hariakari设置让我觉得它在某种程度上。。。。就是不知道怎么做
现在很明显,可能有某些页面,我不希望由于任何原因导致请求过早中止
这正是采取这种或那种方式背后的问题
- 显然,您可能不想继续花费系统资源来处理一个已经中止的连接,例如,一个昂贵的搜索操作
- 但是,可能连接非常重要,即使客户端断开连接,也必须对其进行处理
- 例如,同样昂贵的搜索操作,但实际上不是特定于客户端的,并且将由nginx为所有后续客户端缓存
- 或者可能是修改应用程序状态的操作—您显然不希望应用程序的状态不一致
uwsgi.is\u connected(uwsgi.connection\u fd())
:
abort()
时请求尚未发出,则请求不会发出。但是,如果请求已发送,服务器将不知道请求已中止。连接不会关闭,不会向服务器发送任何消息,什么都不会。如果希望服务器知道不再需要某个请求,则基本上需要找到一种方法来识别请求,以便在发出初始请求时获得该请求的标识符。然后,通过另一个AJAX请求,您可以告诉服务器应该取消先前的请求。(如果您搜索有关abort()
的问题并搜索“服务器”,您会找到与此相同的解释。)
请注意,uwsgi\u ignore\u client\u abort
是在TCP级别处理连接关闭的功能。这与中止AJAX请求不同。在JavaScript中,通常没有需要关闭TCP连接的操作。浏览器优化连接的创建和销毁以满足其需要。刚才我是这样做的:
lsof
检查是否有任何进程连接到example.com
。没有。(lsof
是一个*nix实用程序,允许列出打开的文件。网络连接是*nix中的“文件”。)lsof
显示了连接和打开连接的进程lsof
进行了轮询,以查看我之前标识的连接是否仍然打开在我关闭页面后,它保持打开状态大约一分钟,即使没有必要保持连接打开。XMLHttpRequest.abort()执行的中止。
您给出的用例场景是一个用户快速搜索某些结果的场景。我认为问题中的描述有两种可能性: