- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有大量的 HTTP POST 请求被发送到 nginx 服务器,然后负载平衡到一组反向代理的 node.js/express.js 后端服务器。为了节省一些网络消耗,使用 GZIP 和 header Content-Encoding: gzip 发送有效负载。
我正在努力实现这样的目标:
[Client] [Nginx Reverse Proxy] [BackEnd]
| [gziped payload] | [raw payload] |<br/>
|--------------------> | ----------------------------->|
| | |<br/>
| [Raw Response] | [Raw response] |
| <------------------ | <-----------------------------|
| | |
出于效率原因,我想在 Nginx 上运行 Gunzip,但我一直无法这样做。这是 http nginx.conf 文件:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
gunzip on;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
这是一个请求示例:
echo "{"id": 0,"mypayload":"This is an example"}" | gzip -c - | curl -v -i -X POST -H 'Content-Encoding: gzip' --data-binary '@-' http://localhost/test
我希望 nginx 解压缩有效负载的内容并将原始内容传送到后端服务器,但内容仍以压缩形式传送。
我见过很多人在做相反的事情(Nginx gziping 响应,甚至对没有 Accept-Encoding: gzip header 的客户端的 gunzip 响应)却找不到它成功地将 payload gunziping 到后端。
有什么线索吗?
最佳答案
我知道这是一个较旧的问题,但我希望对发送压缩请求的 IOS 客户端执行相同的操作,在查看您的问题后,我发现了一个描述为 here 的 lua 解决方案。并想将其张贴在这里以供将来引用。
lua 模块看起来像:
-- Debian packages nginx-extras, lua-zlib required
ngx.ctx.max_chunk_size = tonumber(ngx.var.max_chunk_size)
ngx.ctx.max_body_size = tonumber(ngx.var.max_body_size)
function create_error_response (code, description)
local message = string.format('{"status":400,"statusReason":"Bad Request","code":%d,"exception":"","description":"%s","message":"HTTP 400 Bad Request"}', code, description)
ngx.status = ngx.HTTP_BAD_REQUEST
ngx.header.content_type = "application/json"
ngx.say(message)
ngx.exit(ngx.HTTP_OK)
end
function inflate_chunk (stream, chunk)
return stream(chunk)
end
function inflate_body (data)
local stream = require("zlib").inflate()
local buffer = ""
local chunk = ""
for index = 0, data:len(), ngx.ctx.max_chunk_size do
chunk = string.sub(data, index, index + ngx.ctx.max_chunk_size - 1)
local status, output, eof, bytes_in, bytes_out = pcall(stream, chunk)
if not status then
-- corrupted chunk
ngx.log(ngx.ERR, output)
create_error_response(4001, "Corrupted GZIP body")
end
if bytes_in == 0 and bytes_out == 0 then
-- body is not gzip compressed
create_error_response(4002, "Invalid GZIP body")
end
buffer = buffer .. output
if bytes_out > ngx.ctx.max_body_size then
-- uncompressed body too large
create_error_response(4003, "Uncompressed body too large")
end
end
return buffer
end
local content_encoding = ngx.req.get_headers()["Content-Encoding"]
if content_encoding == "gzip" then
ngx.req.read_body()
local data = ngx.req.get_body_data()
if data ~= '' then
local new_data = inflate_body(data)
ngx.req.clear_header("Content-Encoding")
ngx.req.clear_header("Content-Length")
ngx.req.set_body_data(new_data)
end
end
然后你可以像这样使用它:
location / {
proxy_pass http://127.0.0.1:8080;
proxy_pass_request_headers on;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 512k; # Max request body size of 512 KB
client_body_buffer_size 512k;
set $max_chunk_size = 10240; # Chunks of 10 KB
set $max_body_size = 524288; # Max inflated body size of 512 KB
rewrite_by_lua_file inflate_body.lua;
}
关于node.js - Nginx gunzip POST 请求到后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29766154/
我将多个文件解压缩到一个文件夹中,如下所示: gunzip -f -k *.gz 一些 .gz 文件已损坏,导致命令中止。 什么是解压缩所有文件同时忽略损坏文件的好方法? 最佳答案 原始答案给出了一个
一个 API 返回大量结果集,我希望我可以用 PHP 压缩它,但我不知道如何用 Javascript 压缩它。在 Javascript 中是否有某种库能够做到这一点?我在网上搜索并找到了一些东西,但不
这是我的代码的最新版本。感谢您的 zpipe.c,它现在适用于我所有的 gunzipped 文件,无论它们的大小如何。但是我不明白的是,在内部循环中 printf("%s", out) 仍然打印相同的
对于 node.js 和异步处理方式来说相对较新,到目前为止,我已经能够使用 Promise 来使用 fs readFile 来读取文件,但我还没有让 zlib Gunzip 工作。用 Coffees
背景 我正在使用那些硬盘分区的 mysql 服务器: ... /dev/vdd 99G 58G 39G 61% /var/lib/mysql tmpfs 2
我需要在 Windows 的终端中使用 gunzip(这是 gzip 的解压工具) 我已经从 here 下载了 gzip (第一个下载链接) 我安装了它并添加了它的 /bin文件夹到我的 PATH变量
我在一个磁盘空间有限的共享服务器上,并且我有一个 gz 文件,它可以 super 扩展为一个巨大的文件,比我拥有的还要多。我怎样才能“部分”地提取它(假设一次 10 MB),并处理每个部分,甚至暂时不
我有一个 Perl 项目(CGI 脚本,在 Apache 上运行),它以前一直使用 gunzip 和 tac(将 gunzip 管道传输到 tac,然后将其管道传输到文件句柄)以完成其工作负载,即处理
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我只是在测试 Node.js 的 ZLIB,但很快就会遇到奇怪的结果。这是我的脚本(灵感来自 Node.js 手册示例 http://nodejs.org/api/zlib.html#zlib_exa
我正在开发一个程序,该程序从 curl 函数读取 header 并搜索特定 header ,如果找到,则压缩内容部分并在内容中搜索另一个字符串。我需要实现最后一部分。休息完成了。有没有办法从 C++
我正在尝试创建一个 R API for StackOverflow .输出被压缩。例如: readLines("http://api.stackoverflow.com/0.9/stats/", wa
the task 的文档说它有一个即时版本。 在我的例子中,这会导致 NullPointerException: >ant download Java HotSpot(TM) 64-Bit Serv
我已经为我的数据库恢复自动化创建了一个 bash 脚本。当我运行以下命令时,我得到/my/sql/file/path.sql: No such file or directory。 ssh $USER
我在发送到服务器的文件的 .gz 文件中遇到 crc 错误/长度错误。 在手动检索文件时,我得到的文件大小为 1932 字节,并且 gunzips 正常,没有任何问题。 但是当我通过 shell 脚本
在使用 twistedmatrix ProxyClient 时,我如何压缩和处理响应部分? 我需要检查文本或 javascript 和 ajax 查询/答案。我应该使用 handleResponseE
我有大量的 HTTP POST 请求被发送到 nginx 服务器,然后负载平衡到一组反向代理的 node.js/express.js 后端服务器。为了节省一些网络消耗,使用 GZIP 和 header
我正在尝试,只是为了好玩,将 gzip Writer 直接连接到 gzip Reader,这样我就可以动态地写入 Writer 并从 Reader 读取。我希望能准确阅读我写的内容。我正在使用 gzi
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
正如某些 StackOverflow 答案所示,您可以使用 decompressedSize = gzipFile.seek(0, io.SEEK_END) 获得确切的 gzip 解压缩文件大小。 .
我是一名优秀的程序员,十分优秀!