使用 nginx 拦截上游错误

lor*_*zog 1 nginx http-error uwsgi

我的应用程序使用 nginx 和 uwsgi (python) 运行。我的目标是要断开连接(如解释在这里),例如,当Python应用程序决定这样做。

是否有一个 nginx 参数来“拦截”类似的上游错误proxy_intercept_errors

根据这个答案

我的 nginx 配置:

location / {
    uwsgi_pass                myapp;
    include                   uwsgi_params;

    uwsgi_buffering           on;
    uwsgi_buffer_size         8k;

    uwsgi_connect_timeout     800;

    uwsgi_read_timeout        800;
    uwsgi_send_timeout        800;

    proxy_intercept_errors  on;
    error_page 420 =444 @foo;
}

location @foo {
    return 444;
}
Run Code Online (Sandbox Code Playgroud)

我尝试了所有可能的组合,我可以想到有/没有proxy_intercept_errorserror_page但无论我如何配置 nginx,当我返回420 Enhance your calm(或任何其他错误代码,显然)时,它都会直接传递给客户端。

这个答案建议使用,proxy_next_upstream但这意味着使用proxy_pass而不是uwsgi_pass. 我需要使用,uwsgi_pass因为我需要将某些参数传递给 python 应用程序。

lor*_*zog 5

事实证明,答案比我想象的要简单 - 使用uwsgi_intercept_errors指令。

首先,从上游应用程序(在我的例子中是 python)返回444.

其次,配置nginx如下:

location / {
    uwsgi_pass                myapp;
    include                   uwsgi_params;
    [...]

    uwsgi_intercept_errors  on;
    error_page 444 @drop;
}

location @drop {
    return 444;
}
Run Code Online (Sandbox Code Playgroud)