Я пытаюсь использовать кеш-память для кеширования страницы mediawiki для авторизованных пользователей. Я использую ubuntu 14.04, varnish 4.0.3 (порт 80) и nginx в качестве веб-сервера (порт 8080). В качестве vcl я скопировал конфигурацию из mediawiki.org и с моим ограниченным пониманием vcl лака я не могу найти проблему.
Теперь у меня проблема, что страницы mediawiki не кешируются (они доставляются через лак, но не кешируются (возраст всегда равен 0 и только один идентификатор запроса X-Varnish). Поэтому я попытался кэшировать тестовый файл php (test .php), который находится в корне моей веб-страницы (т.е. example.com/test.php
) и проверил, правильно ли он кэширован, но это не так. Я вижу те же заголовки, а иногда и Cache-control с max-age = 0. Файл test.php имеет следующее содержимое:
<?php
echo 'Hello world';
Теперь я понятия не имею, в чем проблема, я искал сам, но не смог найти ни одного потока, в котором хотя бы нефункциональная статическая тестовая страница не кэшируется правильно. Кто-нибудь может мне помочь?
Вот заголовки для первого запроса (я заменил ip и домен на примеры :)):
Заголовки запроса
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:no-cache
Connection:keep-alive
Host:example.com
Pragma:no-cache
User-Agent:Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36
Remote Address:0.0.0.0:80
Request URL:http://example.com/test.php
Request Method:GET
Status Code:200 OK
Заголовки ответа
Accept-Ranges:bytes
Age:0
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 10 May 2015 20:05:05 GMT
Server:nginx/1.4.6 (Ubuntu)
Transfer-Encoding:chunked
Via:1.1 varnish-v4
X-Powered-By:HHVM/3.7.0
X-Varnish:2
И заголовки для второго запроса:
Заголовки запроса
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Host:example.com
User-Agent:Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36
Remote Address:0.0.0.0:80
Request URL:http://example.com/test.php
Request Method:GET
Заголовки ответа
Status Code:200 OK
Accept-Ranges:bytes
Age:0
Connection:keep-alive
Content-Encoding:gzip
Content-Length:24
Content-Type:text/html
Date:Sun, 10 May 2015 20:07:49 GMT
Server:nginx/1.4.6 (Ubuntu)
Via:1.1 varnish-v4
X-Powered-By:HHVM/3.7.0
X-Varnish:5
Просто для полноты здесь конфигурация nginx для этого сайта:
server {
# Running port
listen 8080;
server_name example.com;
# Root directory
root /data/www/example.com/main;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
client_max_body_size 5m;
client_body_timeout 60;
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?title=$1&$args;
}
location ^~ /maintenance/ {
return 403;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
try_files $uri /index.php;
expires max;
log_not_found off;
}
location = /_.gif {
expires max;
empty_gif;
}
location ^~ /cache/ {
deny all;
}
location /dumps {
root /data/www/example.com/local;
autoindex on;
}
}
РЕДАКТИРОВАТЬ: заголовки ответа с помощью curl:
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Sun, 10 May 2015 20:42:01 GMT
Content-Type: text/html
X-Powered-By: HHVM/3.7.0
Vary: Accept-Encoding
X-Varnish: 17
Age: 0
Via: 1.1 varnish-v4
Content-Length: 4
Connection: keep-alive
Accept-Ranges: bytes
EDIT2: И журнал varnishlog для этого запроса:
* << BeReq >> 53
- Begin bereq 52 pass
- Timestamp Start: 1431291731.991895 0.000000 0.000000
- BereqMethod GET
- BereqURL /test.php
- BereqProtocol HTTP/1.1
- BereqHeader User-Agent: curl/7.35.0
- BereqHeader Host: example.com
- BereqHeader Accept: */*
- BereqHeader X-Forwarded-For: 0.0.0.1
- BereqHeader X-Varnish: 53
- VCL_call BACKEND_FETCH
- VCL_return fetch
- Backend 17 default default(127.0.0.1,,8080)
- Timestamp Bereq: 1431291731.991930 0.000035 0.000035
- Timestamp Beresp: 1431291731.992944 0.001049 0.001014
- BerespProtocol HTTP/1.1
- BerespStatus 200
- BerespReason OK
- BerespHeader Server: nginx/1.4.6 (Ubuntu)
- BerespHeader Date: Sun, 10 May 2015 21:02:11 GMT
- BerespHeader Content-Type: text/html
- BerespHeader Transfer-Encoding: chunked
- BerespHeader Connection: keep-alive
- BerespHeader X-Powered-By: HHVM/3.7.0
- BerespHeader Vary: Accept-Encoding
- TTL RFC 120 -1 -1 1431291732 1431291732 1431291731 0 0
- VCL_call BACKEND_RESPONSE
- TTL VCL -1 120 0 1431291732
- VCL_return deliver
- Storage malloc Transient
- ObjProtocol HTTP/1.1
- ObjStatus 200
- ObjReason OK
- ObjHeader Server: nginx/1.4.6 (Ubuntu)
- ObjHeader Date: Sun, 10 May 2015 21:02:11 GMT
- ObjHeader Content-Type: text/html
- ObjHeader X-Powered-By: HHVM/3.7.0
- ObjHeader Vary: Accept-Encoding
- Fetch_Body 2 chunked stream
- BackendReuse 17 default(127.0.0.1,,8080)
- Timestamp BerespBody: 1431291731.993028 0.001132 0.000083
- Length 4
- BereqAcct 129 0 129 212 13 225
- End
* << Request >> 52
- Begin req 51 rxreq
- Timestamp Start: 1431291731.991840 0.000000 0.000000
- Timestamp Req: 1431291731.991840 0.000000 0.000000
- ReqStart 79.193.10.211 52555
- ReqMethod GET
- ReqURL /test.php
- ReqProtocol HTTP/1.1
- ReqHeader User-Agent: curl/7.35.0
- ReqHeader Host: example.com
- ReqHeader Accept: */*
- ReqHeader X-Forwarded-For: 0.0.0.1
- VCL_call RECV
- ReqUnset X-Forwarded-For: 0.0.0.1
- ReqHeader X-Forwarded-For: 0.0.0.1
- VCL_return hash
- VCL_call HASH
- VCL_return lookup
- Debug "XXXX HIT-FOR-PASS"
- HitPass 2147516455
- VCL_call PASS
- VCL_return fetch
- Link bereq 53 pass
- Timestamp Fetch: 1431291731.993038 0.001199 0.001199
- RespProtocol HTTP/1.1
- RespStatus 200
- RespReason OK
- RespHeader Server: nginx/1.4.6 (Ubuntu)
- RespHeader Date: Sun, 10 May 2015 21:02:11 GMT
- RespHeader Content-Type: text/html
- RespHeader X-Powered-By: HHVM/3.7.0
- RespHeader Vary: Accept-Encoding
- RespHeader X-Varnish: 52
- RespHeader Age: 0
- RespHeader Via: 1.1 varnish-v4
- VCL_call DELIVER
- VCL_return deliver
- Timestamp Process: 1431291731.993080 0.001240 0.000041
- RespHeader Content-Length: 4
- Debug "RES_MODE 2"
- RespHeader Connection: keep-alive
- RespHeader Accept-Ranges: bytes
- Timestamp Resp: 1431291731.993190 0.001350 0.000110
- Debug "XXX REF 1"
- ReqAcct 82 0 82 269 4 273
- End
* << Session >> 51
- Begin sess 0 HTTP/1
- SessOpen 0.0.0.1 52555 :80 0.0.0.1 80 1431291731.989801 14
- Link req 52 rxreq
- SessClose REM_CLOSE 0.037
- End
EDIT3: заголовки для двух запросов после нового deliver
конфигурация:
florian@florian-VirtualBox:/var/www/html/w$ curl -v http://example.com/test.php
* Hostname was NOT found in DNS cache
* Trying 0.0.0.0...
* Connected to example.com (0.0.0.0) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.35.0
> Host: example.com
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.4.6 (Ubuntu) is not blacklisted
< Server: nginx/1.4.6 (Ubuntu)
< Date: Sun, 10 May 2015 21:32:52 GMT
< Content-Type: text/html
< X-Powered-By: HHVM/3.7.0
< X-Varnish: 2
< Age: 0
< Via: 1.1 varnish-v4
< X-MISC: MIS
< Transfer-Encoding: chunked
< Connection: keep-alive
< Accept-Ranges: bytes
florian@florian-VirtualBox:/var/www/html/w$ curl -v http://example.com/test.php
* Hostname was NOT found in DNS cache
* Trying 0.0.0.0...
* Connected to dexample.com (0.0.0.0) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.35.0
> Host: example.com
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.4.6 (Ubuntu) is not blacklisted
< Server: nginx/1.4.6 (Ubuntu)
< Date: Sun, 10 May 2015 21:32:53 GMT
< Content-Type: text/html
< X-Powered-By: HHVM/3.7.0
< Vary: Accept-Encoding
< X-Varnish: 32770
< Age: 0
< Via: 1.1 varnish-v4
< X-MISC: MIS
< Content-Length: 4
< Connection: keep-alive
< Accept-Ranges: bytes
EDITX: теперь работает с первым запросом, но все последующие запросы доставляются сервером, здесь заголовки: / Звучит неверно, этот лак отправляет заголовок управления кешем max-age = 0?
Первый запрос: Заголовки запроса
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Host:example.com
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Заголовки ответа
Accept-Ranges:bytes
Age:32
Cache-Control:s-maxage=18000, must-revalidate, max-age=0
Connection:keep-alive
Content-Encoding:gzip
Content-language:de
Content-Length:12102
Content-Type:text/html; charset=UTF-8
Date:Sun, 10 May 2015 22:33:34 GMT
Last-Modified:Sun, 10 May 2015 17:33:34 GMT
Server:nginx/1.4.6 (Ubuntu)
Vary:Accept-Encoding, Cookie
Via:1.1 varnish-v4
X-Content-Type-Options:nosniff
X-Powered-By:HHVM/3.7.0
X-UA-Compatible:IE=Edge
X-Varnish:131094 32817
Второй запрос: Заголовки запроса
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:centralnotice_bucket=0-4.2; __atuvc=1%7C19; __atuvs=554fdce151aee950000; mediaWiki.user.bucket%3Aext.articleFeedback-tracking=0%3Aignore; clicktracking-session=gCQO3Eyuh6ZzPCP0q9mTliq4RNSPD1u2O
Host:example.com
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Заголовки ответа
Accept-Ranges:bytes
Age:0
Cache-Control:s-maxage=18000, must-revalidate, max-age=0
Connection:keep-alive
Content-Encoding:gzip
Content-language:de
Content-Type:text/html; charset=UTF-8
Date:Sun, 10 May 2015 22:37:48 GMT
Last-Modified:Sun, 10 May 2015 17:37:48 GMT
Server:nginx/1.4.6 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding, Cookie
Via:1.1 varnish-v4
X-Content-Type-Options:nosniff
X-Powered-By:HHVM/3.7.0
X-UA-Compatible:IE=Edge
X-Varnish:65630
Взгляните на заголовки ваших запросов.
Cache-Control:no-cache
и
Cache-Control:max-age=0
Редактировать: Это не было причиной проблем, и на них можно спокойно не обращать внимания. Документация по лаку заявляя:
Примечание. По умолчанию Varnish не заботится о заголовке запроса Cache-Control. Если вы хотите разрешить пользователям обновлять кеш с помощью принудительного обновления, вам нужно сделать это самостоятельно.
кстати. это хорошая идея проверить эти вещи с помощью curl, который не добавляет никаких «случайных» заголовков ...
Изменить: ваша проблема заключается в хитрость сохраняется для запроса.
- Debug "XXXX HIT-FOR-PASS"
- HitPass 2147516455
Он сохраняется в предыдущем запросе и сообщает varnish не пытаться кэшировать при следующих запросах того же ресурса.
Изменить: Хорошо, решение (или, скорее, проблема) находится в этой части VCL:
if (beresp.ttl < 48h) {
set beresp.uncacheable = true;
return (deliver);
}
Что в значительной степени говорит о том, что если TTL ответа короче 48 часов, установите этот ответ (или, скорее, запрос) как некэшируемый (= попадание для прохода). Я не могу придумать причину, по которой это находится в образце конфигурации (может, кто-нибудь мне поможет). Но я бы попробовал прокомментировать это и посмотреть, что будет.
Кажется, это ошибка в конфигурации образца, поскольку образец Varnish 3 содержит следующее:
if (beresp.ttl < 48h) {
set beresp.ttl = 48h;
}
Что просто увеличивает время ttl до 48 часов. (это тоже довольно странно, но, возможно, это работает с mediawiki)
кстати. Я предполагаю, что вы оставили свой default_ttl
при значении по умолчанию, которое составляет 120 секунд. (это можно изменить на varnishd
командная строка)
Вы можете опубликовать содержание /etc/varnish/default.vlc
Файл конфигурации? Похоже, ваш запрос даже не отправляется в лак, или, по крайней мере, проходит через него, а лак проверяет, доступен ли контент из кеша.
Более того, можете ли вы добавить это в этот конфигурационный файл и после этого перезапустить varnish? А потом от вашего клиента (wget
или curl
) дать нам результат двух последовательных запросов? Специально для добавленного дополнительного HTTP X-MISC?
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-MISC = "HIT";
} else {
set resp.http.X-MISC = "MIS";
}
}