Re: proxy_cache_key и fastcgi_cache_key
Gena Makhomed
gmm at csdoc.com
Thu Jan 9 13:57:19 UTC 2014
On 09.01.2014 14:10, Maxim Dounin wrote:
>> второй вопрос - по поводу дефолтовых значений
>> proxy_cache_key и fastcgi_cache_key, они почему-то разные.
>>
>> syntax: fastcgi_cache_key string;
>> default: —
>>
>> syntax: proxy_cache_key string;
>> default: proxy_cache_key $scheme$proxy_host$request_uri;
...
> Смысл значения по умолчанию для proxy_cache_key состоит в том, что
> идентифицируется тот ресурс, куда осуществялется проксирование.
> Тем самым, если в разных виртуальных серверах проксирование
> осуществляется в одно и то же место - будет использован один и тот
> же элемент кеша.
так ведь именно в этом и состоит суть проблемы. в разных виртуальных
серверах проксирование обычно осуществляется на один и тот же
backend/upstream, и для *разных* виртуальных серверов будет
использован один и тот же элемент кеша $scheme$XXX$request_uri.
при proxy_pass http://127.0.0.1:80/ в $proxy_host окажется 127.0.0.1
аналогично, и в случае fastcgi_cache_key localhost:9000$request_uri;
- запросы к разным virtual host`ам будут попадать в один и тот же
элемент кеша, и nginx не будет различать *разные* virtual host`ы.
возможно имеет смысл дефолтовые настройки сделать такими,
чтобы они были безопасными по-умолчанию для всех пользователей?
т.е. $host вместо $proxy_host ?
дополнительный плюс: в этом случае можно будет сделать дефолтовые
значения fastcgi_cache_key и proxy_cache_key идентичными, это будет
симметрия и это не будет вызывать лишних вопросов у пользователей.
===================================================================
кстати, аналогичный вопрос касается и дефолтового значнеия
proxy_set_header -
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
syntax: proxy_set_header field value;
default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
хотя ниже идет рекомендация делать proxy_set_header Host $host;
почему бы не сделать $host значением по-умолчанию?
в fastcgi_params: fastcgi_param SERVER_NAME $server_name
- разве здесь не будет лучше передавать значение $host ?
если пользователь пишет в конфиге
server_name example.com example.net example.org;
fastcgi_pass ... ;
- на backend придет example.com даже в том случае,
если исходный запрос был к example.org или к example.net
почему бы здесь тоже не передавать $host ?
тогда fastcgi_* и proxy_* будут максимально похожи между собой,
что облегчит пользователям миграцию между разными типами backend`ов.
ведь нигде в спецификации fastcgi не требуется передавать другое
имя хоста в SERVER_NAME, вместо того, на которое пришел исходный запрос.
тем более, что CGI спецификация, на которой основана FastCGI
спецификация писалась еще в то время, когда никаких виртуальных
хостов еше даже в проекте не было. Там имеется ввиду все-таки $host
P.S.
решить проблему дублирования кеша для разных имен www.example.com
и example.com очень просто - выключить кеш на example.com и сделать
редирект на www.example.com - это и с точки зрения SEO полезно будет.
а кому надо дублирование контента на двух разных доменах в интернете
- могут явно прописать www.example.com или $server_name в *_cache_key
вместо дефолтового значения $host.
--
Best regards,
Gena
Подробная информация о списке рассылки nginx-ru