Apache 优雅停止等待重写请求

Apache 优雅停止等待重写请求

我正在使用 Apache 作为反向代理,并使用 mod_rewrite 将请求传递给后端服务进行处理。

我想使用 Apache 优雅停止,以允许正在进行的请求完成,但是,它不会等待重写请求完成后再终止。这是预期的吗?(Apache 是否认为重写后请求已处理?)如果是这样,还有其他方法可以在关闭前等待这些请求完成吗?

我已经进行了如下测试,首先我有一个基本的循环卷曲我的服务:

for (( i=1; i <= 200; ++i )); do curl -s -o /dev/null -w "%{http_code}" https://example.com/api?request=$i | sed "s/^/\n${i} /"; done;

我将请求索引附加到 URL,以便可以全程跟踪请求,然后使用 WINCH 信号关闭 apache(我可以看到它记录了接收到正确的信号,很高兴发送成功)

然后我看到的是,当它关闭时,curl 循环输出:

97 200
98 502

如果我随后查看 Apache 的日志,最后记录的请求与此匹配 - Apache 中最后记录的请求是请求 97,返回 200 OK(然后我看到关闭日志消息)。但是,如果我转到后端服务,我可以在日志中看到请求 98 已通过,并且底层服务返回 200 响应,但它永远不会返回到我的 curl 客户端,因为它们收到 502。

我尝试过使用 RewriteRule 和 ProxyPass(代理可以很好地使用该配置,但不能使用优雅元素)

RewriteRule ^/api/(.*) @backend_service@api/$1 

或者

ProxyPass /api/ @backend_service@api/

(backend_service 只是一个标记值,稍后插入 - 但一切都在那里工作)

有什么想法可以确保这些代理请求在正常关闭之前完成?

相关内容