python - 用压缩数据填充 memcached,直接从 nginx 服务

标签 python nginx memcached gzip

在 python 中,我生成复杂的静态页面。然后我将它们放入 memcached 中,以便下次请求它们时,它们可以直接从 Nginx 提供(完全不需要 python)

在我意识到在 Nginx 中存储未压缩的 html 是多么低效之前,这一直很有效。所以我尝试在存储之前手动 gzip 数据,并让 Nginx 直接返回它(只需设置 content-encoding:gzip),但是尽管 Nginx 的文档表明这是可能的,但我无法让它工作。

在我的测试中,我通过 NPE 在 How do I gzip compress a string in Python? 的回答,让 python 用我在 python 中 gzip 的数据填充了缓存。 .我还将这些的 memcached 标志设置为 1。

此时,在没有其他更改的情况下,Nginx 提供原始数据,这些数据在浏览器中显示为垃圾。

在那之后,我更改了该位置的 Nginx 设置,将 memcached_gzip_flag 字段设置为 1,以便 Nginx 知道数据已经压缩,但 nginx 仍然提供原始数据。我已经尝试了 nginx 设置的每种组合:gzip onmemcached_gzip_flag 1 但在所有情况下,浏览器都会显示原始数据(在第一次直接 python 命中之后);在某些情况下,firebug 报告内容编码为 gzip(但仍显示原始 gzip 数据),而在其他情况下,内容编码未设置。

总的来说,我的攻击计划是欺骗 nginx 使用正确的 header 提供已经压缩的数据,以便浏览器将其解压缩。

我在 nginx 1.6 和 memcached 1.4.13

这是相关的 nginx 配置行,最初可以使用。第一次命中从填充缓存的 python 获取数据,第二次命中直接从 memcached 获取数据。

location ~* <matching stuff> 
{
    if ($request_method = POST){
        break;
    }
    memcached_gzip_flag 1;
    set $memcached_key $uri;
    memcached_pass 127.0.0.1:11211;
    error_page 404 405 502 = @redo;
    default_type text/html;
}

更新: 我尝试了更多(评论中的详细信息),但仍然没有结果。

更新帖子赏金: 对此我完全没有好的答案。基本上,我根本无法使 memcached_gzip_flag 函数工作。给 future 的回答者的注意事项:如果你回答这个问题,我会悬赏并奖励给你。这比将一半的赏金自动奖励给完全错误的答案要好。

最佳答案

文档有点稀疏,但如果我理解正确的话:memcached_gzip_flag 指定 flag 中与缓存对象关联的哪些位指示内容已经存在压缩。您需要这样说:memcached_gzip_flag 1,然后使用设置了匹配位的标志存储数据:

 memcache.set('key', 'gzipped-value', flags=1)

关于python - 用压缩数据填充 memcached,直接从 nginx 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23270129/

相关文章:

java - 如何对 memcached 中 get 返回的对象进行 unhash

python - 测试命令行实用程序

python - Python蛋的缺点?

python - 解析 SNMP MIB 文件以生成设备和 OID 列表

django - 为什么我的 docker-compose 卷没有通过本地文件添加进行更新?

mysql - PostgreSQL 和 PQC

security - 如何在敌对的云环境中保护 memcached/beanstalkd 的安全?

python - 如何使用 fuzzywuzzy 比率将一个数据框中的值与另一个数据框中的列进行比较

php - 我无法在 nginx 中测试 PHP

nginx 位置匹配扩展中的正则表达式不带 "resolve"