代码之家  ›  专栏  ›  技术社区  ›  Chris McCauley

为什么nginx+memcache会损坏我的响应体?

  •  1
  • Chris McCauley  · 技术社区  · 14 年前

    我在memcache中缓存一些网页。当我直接从缓存中读取页面时,页面的格式是这样的。。。

    !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"-:--     0
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    
      <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    

    但是,当我使用浏览器或curl从nginx(0.8.50版)中读取它时,看起来响应头像这样结束在响应的主体中。。。

         �{
            "    ETag"'"16bb9f51667d334aa4e7663ca28d308a""X-Runtime177"Content-Type"text/html; charset=utf-8"Content-Length"5428"Set-Cookie""Cache-Control"(private, max-age=0, must-revalidate"4<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    


    我的nginx配置非常简单。。。

         set $memcached_key $cookie__app_session$uri;
         memcached_pass     localhost:11211;
         default_type       text/html;
             error_page         404 502 /fallback$uri;
    

    有人知道为什么反应是腐败的吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Chris McCauley    14 年前

    做!愚蠢的开发者问题!


    有两个错误

    (a)我将响应头和主体存储在memcache中,然后在nginx规则中添加头。在memcache中只存储响应体就消除了大部分问题

    (b)我以Ruby的marshal格式(memcache客户机中的默认设置)存储响应——使用一个简单的Ruby客户机读取memcache的内容隐藏了nginx不能直接使用该格式的事实。

    希望这能帮助别人!

    克里斯