使用memcached从远程服务器缓存nginx缓存

时间:2014-09-03 08:15:10

标签: caching nginx memcached

我有以下nginx配置:

upstream backend {
  server localhost:8080;
}

upstream memcached_server {
  server 127.0.0.1:11211;
}

server {
    listen       3000;
    server_name  localhost;

    location /picture {
            set $memc_cmd get;
            set $memc_key $arg_login;
            memc_pass memcached_server;
            error_page 404 = @cache_miss;
    }

    location @cache_miss {
            proxy_pass http://backend;
    }

    location /image {
            proxy_pass http://myimageservice;
    }

当我向localhost:3000/picture?login=john发送请求时,它会尝试使用密钥“john”在memcached中查找内容。当memcached中不存在内容时,它将代理传递请求传递给后端服务器(localhost:8080),该服务器将“X-Accel-Redirect”设置为John的图像路径。路径以'/ image'开头,因此nginx从myimageservice获取数据并将其返回给客户端。

问题是我想缓存从'myimageservice'返回的响应,所以下次调用localhost:3000/picture?login=john时,没有请求发送到后端服务器(localhost:8080),响应立即生效从memcache返回。有可能吗?

1 个答案:

答案 0 :(得分:3)

本周我遇到了同样的问题,这是我的解决方案(见下面的设置和nginx的编译)

在nginx.conf下添加此行(它添加了对Lua的支持,请参阅下面的原因)

lua_package_path '/usr/local/lib/lua/?.lua';

网站配置(在我的情况下默认):

upstream memcached {
    server 127.0.0.1:11211;
    keepalive 32;
}

server {
    listen 8080 default_server;

    root /usr/share/nginx/html;
    index index.fhtml index.fhtm;

    # Make site accessible from http://localhost/
    server_name localhost;

    location = /memc {
        internal;

        memc_connect_timeout 100ms;
        memc_send_timeout 100ms;
        memc_read_timeout 100ms;
        memc_ignore_client_abort on;

        set $memc_key $arg_key;
        set $memc_exptime 300;

        memc_pass memcached;
    }

    location /memc-stats {
        add_header Content-Type text/plain;
        set $memc_cmd stats;
        memc_pass memcached;
    }

    location / {
        set_by_lua $key 'return ngx.md5(ngx.arg[1])' $request_uri;

        srcache_fetch GET /memc key=$key;
        srcache_methods GET;
        srcache_store_statuses 200 301 302;

        proxy_pass http://127.0.0.1:80$request_uri;
        set_by_lua $key 'return ngx.md5(ngx.arg[1])' $request_uri;
        srcache_request_cache_control off;
        srcache_store PUT /memc key=$key;
    }

}

我的设置类似于Ubuntu 14.04,nginx在端口8080上运行,Apache在80上运行(只是为了测试这个),nginx 1.7.5在“full_configure_flags”下使用以下参数编译

full_configure_flags := \
    $(common_configure_flags) \
    --with-http_addition_module \
    --with-http_dav_module \
    --with-http_geoip_module \
    --with-http_gzip_static_module \
    --with-http_image_filter_module \
    --with-http_secure_link_module \
    --with-http_spdy_module \
    --with-http_sub_module \
    --with-http_xslt_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --add-module=/opt/nginx/modules/ngx_devel_kit-0.2.19 \
    --add-module=/opt/nginx/modules/set-misc-nginx-module-0.26 \
    --add-module=/opt/nginx/modules/memc-nginx-module-0.15 \
    --add-module=/opt/nginx/modules/srcache-nginx-module-0.28 \
    --add-module=$(MODULESDIR)/headers-more-nginx-module \
    --add-module=$(MODULESDIR)/nginx-auth-pam \
    --add-module=$(MODULESDIR)/nginx-cache-purge \
    --add-module=$(MODULESDIR)/nginx-dav-ext-module \
    --add-module=$(MODULESDIR)/nginx-echo \
    --add-module=$(MODULESDIR)/nginx-http-push \
    --add-module=$(MODULESDIR)/nginx-lua \
    --add-module=$(MODULESDIR)/nginx-upload-progress \
    --add-module=$(MODULESDIR)/nginx-upstream-fair \
    --add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module

我已经编译了Lua和其他模块,如您所见。对Lua的需求是因为我希望有一种一致的方法来对memcached键的值进行散列,而不必担心如果有人发送一些意外的值并且能够以相同的方式从其中散列它将会发生什么。后端。

希望这可以帮助你(和其他人)。

编辑: 你可以从这里获得我添加的模块: