Nginx和memcached

时间:2014-04-29 13:52:00

标签: php nginx memcached

我使用nginx和memcached来缓存完整的html页面。最大的问题是我们的模板被平板电脑,手机,电脑分开。所以我需要使用设备类型作为键+ $ request_uri。

我在nginx中尝试这个没有运气。使用php调用memcached :: getAllKeys()会显示密钥存在,这对nginxs来说一定是个问题'侧。我是nginx的新手。

保存的密钥如下所示:

computer_$request_uri,
tablet_$request_uri,
phone_$request_uri,

我在php中为这样的用户设置了一个cookie:

setCookie('devicetype', $deviceType, strtotime('+30 days'), '/', $params["domain"], FALSE, TRUE);

其中$ deviceType是计算机或手机或平板电脑。

我正在尝试在nginx中获取此cookie并将其附加到$ request_uri以匹配memcached密钥,以便我可以从memcache服务模板而不是访问apache。

这是nginx配置:

server {
    listen 80;
    server_name www.example.com;
    return 301 $scheme://example.com;
}

server {
    listen 80;
    server_name example.com;
    root /srv/www/example.com/public_html;
    index index.php;

    location ~* ^/blog/.*\.xml$ {
            include /etc/nginx/proxy_params;
            proxy_pass http://127.0.0.1:8080;
    }        

   location ~* ^.+\.(?:js|css|jpe?g|htc|xml|otf|ttf|eot|woff|gif|png|svg|ico|pdf|html|htm)$ {
            access_log off;
            expires 30d;
            tcp_nodelay off;
            open_file_cache max=3000 inactive=120s;
            open_file_cache_valid 45s;
            open_file_cache_min_uses 2;
            open_file_cache_errors off;
    }

    location ~* \.php {
            include /etc/nginx/proxy_params;
            proxy_pass http://127.0.0.1:8080;
    }

    location / {
            default_type text/html;
            set $cachable 1;
            if ($request_method != GET) {
                    proxy_pass http://127.0.0.1:8080;
                    set $cachable 0;
                    break;
            }

            if ($http_cookie ~* "no_cache") {
                    proxy_pass http://127.0.0.1:8080;
                    set $cachable 0;
                    break;
            }

            set $memcached_key "{$cookie_devicetype}_{$request_uri}";
            memcached_pass 127.0.0.1:11211;
            if ($cachable = 1) {
                    add_header X-Header-Memcached true;
            }
            error_page 404 = @proxy;
    }

    location @proxy {
            include /etc/nginx/proxy_params;
            proxy_pass http://127.0.0.1:8080;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt { access_log off; log_not_found off; }

    location ~ /\.ht {
            deny all;
            access_log off;
            log_not_found off;
    }
}

这是nginx中匹配键的行:

set $memcached_key "{$cookie_devicetype}_{$request_uri}";

然而,这不是打击。这是将变量连接在一起的正确方法吗? 非常感谢帮助

有人要求:

设置$ memcached_key $ cookie_devicetype:$ request_uri;

1 个答案:

答案 0 :(得分:0)

我从未听说过您的花括号表示法,但无法找到有关它的任何信息。我不会说它不存在。但最简单的做法是使用不同的分隔符,不能将其误解为变量的一部分。像这样:

set $memcached_key $cookie_devicetype:$request_uri;