动态修改由 nginx 代理的数据

0x6*_*16E 10 nginx reverse-proxy

我有一个 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/;
        }
}
Run Code Online (Sandbox Code Playgroud)

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

对于例如,如果我想压缩HTML在代理我会贯穿htmlcompressor服务器的响应,然后发送输出作为代理的响应给客户端。最终结果将是最终客户端获得缩小的 html。

我知道有各种各样的 nginx 插件和示例可以为本地提供的数据完成此操作,但是如何为代理设置它?

cns*_*nst 10

那么,您想nginx将来自客户端的请求代理到后端服务器,然后在将后端的回复返回给客户端之前,将此类回复通过另一个外部处理器进行管道传输?

我认为您目前无法使用nginxIgor Sysoev 和 Nginx, Inc 提供的任何官方模块执行上述操作。可用于更改响应主体的最接近的是一些与 nginx 一起提供的过滤器模块,但默认情况下是关闭的,包括add_before_body,add_after_bodysub_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;这正是您要寻找的;否则,如果您可以修改原始的 webapp,我认为您最好的选择可能是在 webapp 本身中安装某种后处理器,这似乎是下一个最简单的解决方案。潜在地,您可以研究过滤器模块是如何实现的,例如前面提到的 ngx_http_addition_filter_module.c,以及一些更明显相关的过滤器,例如 ngx_http_gzip_filter_module.c,并实现您自己的嵌入式过滤器模块。或者聘请 Nginx, Inc. 为您编写此代码!但是,说gzip on;真的,它可以正常工作,并且可能会给您带来更好的结果,而不会出现任何麻烦、性能或稳定性问题,并且默认情况下已经编译了它,您只需在其中启用它nginx.conf.