动态修改 nginx 代理的数据

动态修改 nginx 代理的数据

我有一个 nginx 设置,它接收来自外部主机的请求并将它们代理到内部服务器。

该配置看起来像这样:

server {

        listen 10.0.0.66:443;

        server_name my.example.com;

        root /websites/my.example.com

        ssl on;
        ssl_certificate /websites/ssl/my.example.com.crt;
        ssl_certificate /websites/ssl/my.example.com.key;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;

        location / {
                proxy_pass https://10.0.0.100:3000/;
        }
}

出于实验/测试目的,我希望能够通过任意二进制文件运行内部主机所回复的内容,并使用二进制文件所响应的内容进行响应。

为了例子,如果我想在代理上压缩 html,我会通过 htmlcompressor 运行服务器的响应,然后将输出作为代理的响应发送到客户端。最终结果是最终客户端会得到压缩后的 html。

我知道 nginx 有各种各样的插件和示例可以实现本地数据传送,但是如何设置代理呢?

答案1

因此,您想nginx将客户端的请求代理到后端服务器,然后在将后端的答复返回给客户端之前,通过另一个外部处理器传输该答复?

我认为您nginx目前无法使用 Igor Sysoev 和 Nginx, Inc 提供的任何官方模块执行上述操作。最接近可用于更改响应主体的是一些与 nginx 一起提供的过滤器模块,但默认情况下处于关闭状态,包括 、add_before_bodyadd_after_body指令sub_filter

http://nginx.org/en/docs/http/ngx_http_addition_module.html
http://nginx.org/en/docs/http/ngx_http_sub_module.html

还,也许这才gzip on;是你真正想要的?

http://nginx.org/en/docs/http/ngx_http_gzip_module.html

或者,如果你知道perl并且愿意运行一个完全实验性的模块,那么可以看一下嵌入一个perl默认nginx关闭的、并且(有点明显)完全是实验性的官方 nginx 模块:

http://nginx.org/en/docs/http/ngx_http_perl_module.html

另一种选择是使用某种 Fast-CGI 设置,您将把请求重定向到该设置,然后,您的 Fast-CGI 脚本将向后端发出请求,然后进行最后的处理,然后将答复返回到 nginx 进行缓存并返回给用户。

还有proxy_set_body(但fastcgi_set_body目前还没有)可以更改请求的主体(例如,根据客户端提供的内容),但似乎没有任何等效指令或变量来获取响应的主体,以便传递给后处理器的后续请求。无论如何,过滤器模块可能是您想要的后处理器。

(此外,您是否意识到,通过常规主管来发送和回复的简单方法fork会非常缓慢,对吗?)

总结,我认为gzip on;这正是你正在寻找的;否则,只要你可以修改原始的 web 应用程序,我认为你最好的选择可能是在 web 应用程序本身内安装某种后处理器,这似乎是下一个最简单的解决方案。可能的话,你可以研究一下过滤模块实现,例如前面提到的 ngx_http_addition_filter_module.c,加上一些更明显相关的过滤器,如 ngx_http_gzip_filter_module.c,并实现您自己的嵌入式过滤器模块。或者聘请 Nginx, Inc. 为您编写!但是,认真地说,它gzip on;只是工作,并且可能会给您带来更好的结果,没有任何麻烦、性能或稳定性问题,并且它已经默认编译,您只需在 中启用它nginx.conf

答案2

我认为如果您想运行任意代码来修改 nginx 输出,...您可以编写一个 lua 脚本。

寻找“nginx lua”。

(例子:http://www.londonlua.org/scripting_nginx_with_lua/slides.html?full#hello-lua

相关内容