将http中止/关闭从nginx传播到uwsgi/Django

将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设置为

我有一个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
设置为“开”只会使nginx不知道中止/关闭,并删除uwsgi“IO错误”,因为uwsgi仍然可以写回nginx

我的用例是,我有一个应用程序,其中人们可以快速浏览一些ajax结果,因此,如果快速浏览页面,我将中止他们跳过的页面的挂起ajax请求,这将保持客户机干净高效。但是这对服务器端(uwsgi/Django)没有任何作用,因为即使没有任何东西等待响应,它们仍然必须处理每个请求

现在很明显,可能有某些页面,我不希望由于任何原因导致请求过早中止。但我使用芹菜来处理可能属于这一类的长时间运行的请求

那么这可能吗
uwsgi的
hariakari设置让我觉得它在某种程度上。。。。就是不知道怎么做

现在很明显,可能有某些页面,我不希望由于任何原因导致请求过早中止

这正是采取这种或那种方式背后的问题

  • 显然,您可能不想继续花费系统资源来处理一个已经中止的连接,例如,一个昂贵的搜索操作

  • 但是,可能连接非常重要,即使客户端断开连接,也必须对其进行处理

    • 例如,同样昂贵的搜索操作,但实际上不是特定于客户端的,并且将由nginx为所有后续客户端缓存

    • 或者可能是修改应用程序状态的操作—您显然不希望应用程序的状态不一致

如前所述,问题在于uWSGI,而不是NGINX。然而,如果你不亲自向uWSGI透露你的意图,你就不能让uWSGI自动决定你的意图

您将如何在代码中准确地揭示您的意图?许多编程语言并不真正支持多线程和/或异步编程模型,这使得取消操作非常重要

因此,这里没有神奇的解决方案您可能必须在每个可能阻塞的函数调用中传递它,这使得代码非常难看

您是否已经在Django中传递了上述上下文?如果没有,那么解决方案很难看,但非常简单-任何时候您都可以明确中止请求,检查客户端是否仍然与
uwsgi.is\u connected(uwsgi.connection\u fd())

我的用例是,我有一个应用程序,其中人们可以快速浏览一些ajax结果,因此,如果快速浏览页面,我将中止他们跳过的页面的挂起ajax请求,这将保持客户机干净高效

在客户端中止AJAX请求是通过以下方式完成的。如果调用
abort()
时请求尚未发出,则请求不会发出。但是,如果请求已发送,服务器将不知道请求已中止。连接不会关闭,不会向服务器发送任何消息,什么都不会。如果希望服务器知道不再需要某个请求,则基本上需要找到一种方法来识别请求,以便在发出初始请求时获得该请求的标识符。然后,通过另一个AJAX请求,您可以告诉服务器应该取消先前的请求。(如果您搜索有关
abort()
的问题并搜索“服务器”,您会找到与此相同的解释。)

请注意,
uwsgi\u ignore\u client\u abort
是在TCP级别处理连接关闭的功能。这与中止AJAX请求不同。在JavaScript中,通常没有需要关闭TCP连接的操作。浏览器优化连接的创建和销毁以满足其需要。刚才我是这样做的:

  • 我使用
    lsof
    检查是否有任何进程连接到
    example.com
    。没有。(
    lsof
    是一个*nix实用程序,允许列出打开的文件。网络连接是*nix中的“文件”。)

  • 我用Chrome打开了example.com的一个页面
    lsof
    显示了连接和打开连接的进程

  • 然后我关闭了页面

  • 我用
    lsof
    进行了轮询,以查看我之前标识的连接是否仍然打开在我关闭页面后,它保持打开状态大约一分钟,即使没有必要保持连接打开。

  • 而且,不需要再修改uswgi设置,就可以知道通过
    XMLHttpRequest.abort()执行的中止。

    您给出的用例场景是一个用户快速搜索某些结果的场景。我认为问题中的描述有两种可能性:

  • 用户在进一步分页之前等待刷新。例如,Alice正在查看按用户“Zeno”字母顺序排列的用户名列表,每次显示新页面时,她都会看到名称不存在,页面向下。在这种情况下,没有什么好担心的