用nginx拦截上游错误

时间:2015-03-30 10:58:15

标签: nginx uwsgi http-error

我的应用程序使用nginx和uwsgi(python)运行。我的目标是放弃连接(如here所述),例如当python应用程序决定这样做时。

是否存在nginx参数"拦截"上游错误类似于proxy_intercept_errors

根据this answer

我的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;
}

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

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

1 个答案:

答案 0 :(得分:3)

事实证明答案比我想象的要简单 - 使用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;
}