我有一个 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_body
和add_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)