zoukankan      html  css  js  c++  java
  • 高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式

    通过《高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景》一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率是相当高的。那么:


    1. 如果不命中呢?


    我们可以到相应的数据服务器上读取数据,然后将它缓存到Nginx服务器上,然后再将该数据返回给客户端。这样,对于该资源,只有穿透 Memcached的第一次请求是需要到数据服务器读取的,之后在缓存过期时间之内的所有请求,都是读取Nginx本地的。不过Nginx的 proxy_cache是本地硬盘缓存,效率要远低于Memcached。


    2. 应该如何安装和配置呢?


    (1)HttpMemcModule模块

    如果使用Nginx的非核心模块——HttpMemcModule模块,则可以下载模块:

    http://github.com/agentzh/memc-nginx-module/tags


    1. michael@dev-machine:~$ tar -zxvf agentzh-memc-nginx-module-a0bc33a.tar.gz  
    2. michael@dev-machine:~$ tar -zxvf nginx-1.1.12.tar.gz  
    3. michael@dev-machine:~$ cd nginx-1.1.12  
    4. michael@dev-machine:~$ ./configure --add-module=/home/michael/agentzh-memc-nginx-module-a0bc33a  
    5. michael@dev-machine:~$ sudo make  
    6. michael@dev-machine:~$ sudo make install  


    目前验证发现Nginx 1.0.10版本 Nginx的1.1.3及其之前的版本,需要额外通过--add-module来加载upstream-keepalive模块,请自行google之。其他版本还不确定,猜测是在1.1  从nginx的1.1.4及其之后的版本开始,自动携带upstream-keeplive模块的。 (感谢agentzh的提示)


    然后我们来编辑配置文件吧。如下:

    1. http {  
    2.     ...  
    3.     upstream data_server {  
    4.         server  192.168.0.133:1234;  
    5.         server  192.168.0.134:1234;  
    6.         server  192.168.0.135:1234;  
    7.         ip_hash;  
    8.     }  
    9.   
    10.     upstream memc_backend {  
    11.         server  127.0.0.1:11211;  
    12.     }  
    13.     ...  
    14.     server {  
    15.   
    16.         listen      8080;  
    17.         server_name localhost;  
    18.   
    19.         default_type    text/html;  
    20.   
    21.         location / {  
    22.             set     $memc_cmd   get;  
    23.             set     $memc_key   $uri;  
    24.             memc_pass   memc_backend;  
    25.   
    26.             error_page  404 @fallback;  
    27.         }  
    28.   
    29.         location @fallback {  
    30.   
    31.             internal;  
    32.   
    33.             proxy_pass      http://data_server;  
    34.   
    35.             proxy_cache     cache_one;  
    36.             proxy_cache_valid   200 302 1h;  
    37.             proxy_cache_valid   301 1d;  
    38.             proxy_cache_valid   any 1m;  
    39.             expires         30d;  
    40.         }  
    41.     }  
    42.     ...  
    43. }  


    从上面的配置文件我们可以看出,一个请求到达后,会其uri作为key去Memcached服务器127.0.0.1:11211上查找 value,如果没有命中,则返回404。这时通过error_page将404接收转到@fallback,然后去data_server中取文件,取 完后将该文件在本地磁盘缓存,同时用户的浏览器也通过expires设置缓存时间。


    这样绝大多数请求如果被第一层Memcached的内存缓存拦截的话,剩余的请求可以通过访问第二层Nginx服务器的硬盘缓存文件,来减少穿透。


    按照上面的方式,客户端得到的请求响应中虽然包含了正确的文件内容,但状态码都是404(可以通过Fiddler来观察)。这似乎会引起问题。什么 问题呢?绝大多数浏览器,即使在404的情况下,也会尝试去读取内容,如果有正确的内容,是可以正确显示的。但是比较常见的可能引起问题的两种情况是:

    (a)、搜索引擎的spider爬到的404时,一般不会收录该URL,我想这不是你所希望看到的;

    (b)、Flash等方式加载时,如果头是404,可能不予显示,我想着也不是你所希望看到的。


    那我们把它改成都是200,是不是很好呢?

    1. error_page  404 =200 @fallback;  


    非也,这样404传递到fallback处理请求后的状态如果不是200,就很不一致了,会引起更多问题。所以应该如下配置:

    1. error_page  404 = @fallback;  


    这样fallback的处理结果状态是什么,就用什么替换404。


    (2)Nginx内部的Memcached模块

    如果你想使用Nginx内部的Memcached模块,配置文件可以结合参考上面的示例和《高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景》

  • 相关阅读:
    Ubuntu 16.04 compare 软件安装
    ubuntu 18 常用软件安装
    LSTM时间序列预测学习
    ubuntu 16.04 屏幕截图
    ubuntu 16.04 tensorboard 学习
    ubuntu 16 .04常见指令整理
    ABAP 更改销售订单(BAPI'BAPI_SALESORDER_CHANGE')
    ABAP SM30表维护生成器,新加一列描述仅供用户维护时参考,不存内表。(例如物料描述,客户描述)
    93年到底多少岁
    一个93年的中年人对2019年的总结
  • 原文地址:https://www.cnblogs.com/breg/p/4043799.html
Copyright © 2011-2022 走看看