我试图添加一个自定义的响应头响应从上游服务器在Nginx的基础上响应主体。
为了简单起见,让这个自定义头是响应体的 SHA1 哈希。为了实现这一点,我尝试使用Nginx的njs脚本模块。
我参考了njs-examples存储库中的示例。但是,这些示例分别处理头和主体部分,我正在努力将它们合并来实现我的目标。
以下是我当前的配置:
# nginx.conf
load_module modules/ngx_http_js_module.so;
events {}
http {
js_path "/etc/nginx/njs/";
js_import main from hello.js;
# Configuration containing list of application servers
upstream app_servers {
server flask:5000;
}
server {
listen 80;
server_name localhost;
location / {
js_body_filter main.hello;
proxy_pass http://app_servers/;
}
}
}
# hello.js
function hello(r, data, flags) {
var val = data.length;
ngx.log(1, val);
r.headersOut["X-Hello"] = val;
r.sendBuffer(data, flags);
}
export default { hello };
然而,当我向Nginx服务器发送请求时,我在响应中看不到X-Hello
头。
有没有一种方法可以在Nginx中使用njs脚本来实现我的用例?如果没有,我应该考虑哪些替代方法,例如实现自定义Nginx模块?如有任何关于如何开展工作的建议或指导,将不胜感激。
PS:我在Docker容器上运行这个安装程序,使用official nginx image和一些用于热重装的脚本。如果需要,我也可以共享Dockerfile
和docker-compose.yml
。
1条答案
按热度按时间rsaldnfx1#
由利亚姆克里利在Nginx community slack上的Ancarter。
这可能不起作用,因为NGINX将在阅读整个主体之前将响应头发送给客户端。所以当你读到响应体的时候,修改头已经太晚了。
您可以尝试使用
js_header_filter
函数(使用res.length
),但正如我所说,在接收主体之前已经发送了头。我不认为它会工作再想想这个。你可以用拖车来做,只要客户接受。
使用
js_header_filter
切换到分块传输编码,删除内容长度头,并定义尾部。使用
js_body_filter
收集并散列正文,发送正文,然后在我们上面定义的trailer中发送散列。好吧,所以我不能让这个下降:lolsob:这里有一个解决方案,它添加了响应的SHA-1哈希作为尾部。不知道这是否解决了你的问题,@Gaurav Jain,但我很高兴发现!
nginx.conf
片段body.js
Test