运维开发网

ruby – 如何让nginx返回静态响应并向应用程序发送请求标头?

运维开发网 https://www.qedev.com 2020-05-11 16:55 出处:网络 作者:运维开发网整理
我正在通过嵌入< img>制作一个高负荷的网络统计系统.标记到网站.我想做的是: > nginx从某个主机获取图像请求 >它给出了从文件系统托管小1px静态图像的答案 >此时它以某种方式将请求的标头传输到应用程序并关闭与主机的连接 我正在使用Ruby,我将制作一个纯机架应用程序来获取标题并将它们放入队列以进行进一步计算. 我无法解决的问题是,如何配置sphinx为Rack应用程序提供标头,并返回静
我正在通过嵌入< img>制作一个高负荷的网络统计系统.标记到网站.我想做的是:

> nginx从某个主机获取图像请求

>它给出了从文件系统托管小1px静态图像的答案

>此时它以某种方式将请求的标头传输到应用程序并关闭与主机的连接

我正在使用Ruby,我将制作一个纯机架应用程序来获取标题并将它们放入队列以进行进一步计算.

我无法解决的问题是,如何配置sphinx为Rack应用程序提供标头,并返回静态图像作为回复而无需等待Rack应用程序的响应?

此外,如果有更常见的Ruby解决方案,则不需要Rack.

一个简单的选择是在继续后端进程的同时尽快终止客户端连接.

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

绝对是一个有趣的挑战.

0

精彩评论

暂无评论...
验证码 换一张
取 消