我有一个nginx设置,接收来自外部主机的请求,并将它们代理到内部服务器。
configuration看起来像这样:
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/; } }
为了实验/testing目的,我希望能够运行内部主机通过任意二进制回复的内容,并回应二进制响应的内容。
例如 ,如果我想在代理上缩小html,我将通过htmlcompressor运行服务器的响应,然后将输出作为代理的响应发送到客户端。 最终的结果是最终客户端得到缩小的HTML。
我知道有各种各样的插件和nginx的例子来完成这个本地服务的数据,但如何设置它的代理?
那么,你需要nginx将来自客户端的请求代理到后端服务器,然后在将后端的回复返回给客户端之前,通过另一个外部处理器来pipe理这种回复?
我不认为你可以使用Igor Sysoev和Nginx,Inc目前提供的官方nginx模块来完成上述任务。 最接近改变响应主体的是一些与nginx一起使用的filter模块,但默认closures,包括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并且愿意运行一个完整的实验模块,那么可以看一下将perlembedded到nginx ,并且默认closures一个官方的nginx模块,并且(显然)完全是实验性的:
http://nginx.org/en/docs/http/ngx_http_perl_module.html
另一个select是使用某种Fast-CGI设置,您将redirect请求,然后您的Fast-CGI脚本将对后端进行请求,然后在返回之前执行最终处理回复nginx的回复caching并返回给用户。
还有proxy_set_body (但还没有fastcgi_set_body ),来改变请求的主体(例如,从客户端提供的内容),但似乎没有任何等价的指令或variables来获得响应的主体传递给某个后处理器的后续请求。 在任何情况下,filter模块可能是您想要的后处理器。
(另外,你也意识到,通过一个普通的行政人员进行交叉和pipe道回复的一个天真的方法将会超出特别慢,对吧?)
总结一下 ,我想gzip on; 正是你想要的; 否则,假如你可以修改原来的webapp,我认为你最好的select是在webapp中安装一些后处理器,这看起来就像下一个最简单的解决scheme。 有可能的话,你可以看看过滤模块是如何实现的,例如上面提到的ngx_http_addition_filter_module.c,以及一些更明显相关的filter,比如ngx_http_gzip_filter_module.c,并且实现你自己的embedded式过滤模块。 或者聘请Nginx公司为你写这个! 但是,严重地, gzip on; 只是工作,并可能给你更好的结果没有任何麻烦,性能或稳定性问题,它已经编译默认情况下,你只需要在nginx.conf启用它。
我想如果你想运行任意代码来模仿nginx输出,你可以写一个lua脚本。
寻找“nginx lua”。
(例如: http : //www.londonlua.org/scripting_nginx_with_lua/slides.html?full#hello-lua )