nginx и кэширование

shark_255

Новичок
Я хочу попробовать кэширование на nginx пока только для главной cтраницы:

Код:
   set $no_cache 1;

    if ($request_uri = "/")
    {
        set $no_cache 0;
    }
Далее идет такой набор конструкций

Код:
        .....
        fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
        fastcgi_hide_header Set-Cookie;
        fastcgi_cache MYAPP;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_bypass $no_cache;
        fastcgi_no_cache $no_cache;
fastcgi_ignore_headers - это для того, чтобы nginx кэшировал страницу
несмотря на наличие Set-Cookie,
а fastcgi_hide_header Set-Cookie, чтобы закешированная кука юзера
не отдалась не тому юзеру или вообще гостю

А теперь вопрос - сработают ли эти директивы, если fastcgi_cache_bypass 1 и fastcgi_no_cache 1,
и второй вопрос, если эти директивы срабатывают, то как мне описать ignore_headers, и hide_header,
если в if`е их нельзя прописывать.
 

shark_255

Новичок
Отдельный локейшн напиши
location = / {
}
Как вариант, единственное, что нужно будет дублировать содержимое для настроек fastcgi
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param PHP_VALUE "error_log=/var/www/domain/php_errors.log";

}

Хотя этот кусок можно вынести в отдельный файл.
 

shark_255

Новичок
Еще вопрос - можно ли и если да, то как заюзать в моем случае named location ?

Если я сделаю так -
Код:
    location @php {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php-fpm.sock;
        #fastcgi_pass 127.0.0.1:7777;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
То как его применить сюда

Код:
    location = / {
        fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
        fastcgi_hide_header Set-Cookie;
        fastcgi_cache MYAPP;
        fastcgi_cache_valid 200 5m;
        @php;
    }
В случае, если это вообще допустимо.
 

AnrDaemon

Продвинутый новичок
Так делать НЕ НУЖНО.
Нужно написать

Код:
server {
    index index.php;

    if ( $request_uri ~ "^([^#?]*?/)index\.php(?:/)?(.*)" ) {
        return 301 "$1$2";
    }
}
 

fixxxer

К.О.
Партнер клуба
Код:
location = / { 
...
    @php;
}
Если нужно именно чтобы всегда срабатывал @php, без попыток отдать статику (судя по location = /, так и есть), есть 2 способа
1) вынести внутренности location @php в отдельный файл, и в @php и =/ сделать include
2) использовать хак:
Код:
 try_files "" @php;

Еще, как вариант, можно вместо named location использовать обычный, типа

Код:
location /__php__/ {
    internal;
    ...
}
и тогда в него редиректить можно rewrite-ом, типа

Код:
rewrite ^ /__php__/;
но в этом случае, конечно, всякие $uri перебьются на этот __php__.

Штатной возможности перенаправления в named location не хватает, ага. Но там какие-то свои соображения у авторов nginx - типа, нефиг писать goto в конфиге.
 
Последнее редактирование:

MiksIr

miksir@home:~$
На самом деле можно просто вложенное сделать
Код:
location / {
   fast cgi config;
   try_files $uri $uri/ /index.php$is_args$args;
   location = / {
        cache;
        fastcgi_pass xxx;
   }
   location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass xxx;
   }
}
Ну и т.п... с вариациями, ибо я задачи не знаю полной.
Должно работать, вроде.
 

MiksIr

miksir@home:~$
Напиши свой вариант.
А ты объясни, что ты вообще хотел. Редирект? Кто тебе сказал, что он нужен?
Или ты просто так хитро защищаешься от fix_pathinfo? Тогда fix_pathinfo = 0, или
Код:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
try_files $fastcgi_script_name =404;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
 

fixxxer

К.О.
Партнер клуба
fix_pathinfo вообще всегда надо отключать, это идиотизм, унаследованный от древнего cgi sapi. В fpm он не нужен совсем.
 

fixxxer

К.О.
Партнер клуба
На самом деле можно просто вложенное сделать
Мне кажется, что у него кроме index.php никаких php-файлов внутри docroot вообще обрабатывать не надо, они снаружи.

Если я не угадал, можно так, да. Я, правда, не уверен, что все fcgi-директивы наследуются.
 

AnrDaemon

Продвинутый новичок
А ты объясни, что ты вообще хотел. Редирект? Кто тебе сказал, что он нужен?
Когда пишут " location = / { ... }", 99% что хотят избавиться от /index.php

Или ты просто так хитро защищаешься от fix_pathinfo?
Нет.

fix_pathinfo вообще всегда надо отключать
Только после того, как PHP пофиксят.
 

MiksIr

miksir@home:~$
Я, правда, не уверен, что все fcgi-директивы наследуются
Наследуются вообще все, кроме: "action" директив (proxy_pass, fastcgi_pass и т.п.), rewrite_mod директив и try_files.
Ну и для "array" (несколько директив в рамках одного локейшена) директив - такая же директива во вложенном локейшене ресетит весь наследованный массив.
 

AnrDaemon

Продвинутый новичок
Так в том то и дело, что = / для скрытия index.php не годится.
А кеширование… Поставь фронт для кэша отдельно. Будет НАМНОГО проще писать конфиги.
 
Сверху