即时修改nginx代理的数据


9

我有一个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有各种各样的插件和示例来完成本地提供的数据,但是如何为代理设置它呢?


只是为了澄清。您是否希望nginx将请求转发到代理服务器,接收回响应,将其压缩,然后将其转发给用户?您希望nginx在服务器和用户中间处理它吗?
sjdaws

@sjdaws,不一定要压缩它,而是通过任意程序运行它,并将输出用作发送到客户端的输出。因此,从本质上讲,我想修改从服务器到客户端的输出。
0x6A75616E 2013年

Answers:


10

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

我认为您目前无法使用nginxIgor Sysoev和Nginx,Inc提供的任何官方模块来完成上述操作。这可改变反应的身体最接近的是nginx的走到一起的几个过滤模块,但默认情况下被关闭,其中包括add_before_bodyadd_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并愿意运行一个完全实验性的模块,请查看嵌入perlnginx,其中带有默认情况下处于关闭状态且(显然是)完全实验性的官方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


感谢您的回复!我知道gzip上的内容,而我要完成的工作比压缩输出要更高级。我有一个代理,用于控制对某些内部Web服务的访问,并且我希望能够将诸如Google Analytics(分析)之类的内容附加到输出中,就像cloudflare的工作方式一样。就像您说的那样,听起来fastcgi是一个选择,所以我将对此进行研究。再次感谢!
0x6A75616E

如果您只是想添加内容或添加Google Analytics(分析),那么add_after_bodysub_filter正是您所需要的。nginx.org/en/docs/http/ngx_http_sub_module.html上的示例完全显示了这种情况:将“ </ head>”替换为“ </ head> <script…”。您可能必须重新编译nginx才能启用这些模块(检查nginx -Vnginx的编译方式),但是否则它们已经是标准模块。
cnst

也看看subs_filter模块。
franzlorenzon 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.