Простой вариант - разорвать клиентское соединение как можно скорее, продолжая процесс бэкэнда.
server {
location /test {
# map 402 error to backend named location
error_page 402 = @backend;
# pass request to backend
return 402;
}
location @backend {
# close client connection after 1 second
# Not bothering with sending gif
send_timeout 1;
# Pass the request to the backend.
proxy_pass http://127.0.0.1:8080;
}
}
Опция, приведенная выше, хотя простой может привести к клиенту, получающему ошибкусообщение, когда соединение разорвано.Директива ngx.say гарантирует, что заголовок «200 OK» будет отправлен и, поскольку это асинхронный вызов, не будет задерживать события.Для этого нужен модуль ngx_lua.
server {
location /test {
content_by_lua '
-- send a dot to the user and transfer request to backend
-- ngx.say is an async call so processing continues after without waiting
ngx.say(".")
res = ngx.location.capture("/backend")
';
}
location /backend {
# named locations not allowed for ngx.location.capture
# needs "internal" if not to be public
internal;
# Pass the request to the backend.
proxy_pass http://127.0.0.1:8080;
}
}
Более краткий вариант на основе Lua:
server {
location /test {
rewrite_by_lua '
-- send a dot to the user
ngx.say(".")
-- exit rewrite_by_lua and continue the normal event loop
ngx.exit(ngx.OK)
';
proxy_pass http://127.0.0.1:8080;
}
}
Определенно интересная задача.