我使用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;
答案 0 :(得分:0)
我从未听说过您的花括号表示法,但无法找到有关它的任何信息。我不会说它不存在。但最简单的做法是使用不同的分隔符,不能将其误解为变量的一部分。像这样:
set $memcached_key $cookie_devicetype:$request_uri;