我可以让 nginx 在几秒钟后重新发送请求给 FastCGI 吗?

我可以让 nginx 在几秒钟后重新发送请求给 FastCGI 吗?

我的 FastCGI (PHP-FPM) 应用程序可能会遇到需要一些时间来自我修复的情况。我想告诉 nginx 等待几秒钟,然后将请求重新发送到 FastCGI 后端。

我已经尝试过一个 hacky 设置,其中 nginx 配置为fastcgi_next_upstream http_503查看文档)与具有相同 fastcgi 配置的上游进行两次通信:

upstream php {
    server 127.0.0.1:9000;
    server 127.0.0.1:9000;
}

location ~ \.php(/|$) {
    fastcgi_pass php;
    fastcgi_next_upstream http_503
}

当PHP 应用程序503需要一些时间和空间时,它将回复,使 nginx “向前移动”到下一个显然是同一台服务器的上游。不幸的是,nginx 在几毫秒内就会进行第二次调用。

我想将 nginx 第二次调用延迟几秒钟,以确保错误情况发生后 PHP 后端完全启动并运行。那么,如何在第二次尝试之前添加适当的延迟?

在后台,由于 MongoDB 驱动程序处理副本集故障转移的方式,我需要回收整个 PHP-FPM 进程。这就是为什么我无法在 PHP 级别完全处理这种情况,而需要短暂释放 PHP 进程。

答案1

您可以尝试使用HttpEcho模块完成你需要的。然后你可以这样做:

location ~ \.php(/|$) {
    fastcgi_pass php;
    echo_sleep 3;
    fastcgi_next_upstream http_503;
}

答案2

这不是 nginx 的答案,但你可以将 Varnish 作为前端来处理这种特定情况。请查看 Saint 模式是否可行。

https://www.varnish-cache.org/trac/wiki/VCLExampleSaintMode

相关内容