Jump to content

nginx + fastcgi + cache


Recommended Posts

Доброго времени суток.

 

Имеется: nginx v1.4.4 + fastcgi, PrestaShop 1.5.6.1

 

Проблема вот в чём:

При подключении функиции кеширования nginx'а

fastcgi_cache_path   /var/cache/nginx/cache  levels=1:2 keys_zone=cache:10m inactive=5m;

fastcgi_cache_key "$scheme$request_method$host$request_uri";

fastcgi_cache   cache;
fastcgi_cache_valid   200 302  1h;
fastcgi_cache_valid   301      1d;
fastcgi_cache_valid   any      1m;
fastcgi_cache_min_uses  1;
fastcgi_cache_use_stale error  timeout invalid_header http_500;
fastcgi_hide_header "Set-Cookie";
fastcgi_ignore_headers "Cache-Control" "Expires";

страницы создаются и кешируются без проблем, но появляется другая проблема - если в магазин залогинился пользователь, то на другом компе (в другом браузере) другой пользователь находится под его аккаунтом.

 

Может кто-нибудь что-нибудь посоветовать или подсказать?

Может кто сталкивался с таким чудом?

 

Спасибо.

 
 

Share this post


Link to post
Share on other sites

        location ~ \.php$ {
          fastcgi_pass unix:/var/www/user/data/php-fpm/phpfpm.sock;
          fastcgi_index  index.php;
          include fastcgi_params;
          fastcgi_connect_timeout 12000s;
          fastcgi_read_timeout 12000s;
          fastcgi_send_timeout 12000s;
          fastcgi_buffer_size 64k;
          fastcgi_buffers 16 64k;
          fastcgi_cache_valid 200 301 302 1d;
          fastcgi_cache_valid 304 120d;
          fastcgi_cache_valid 404 1m;
          fastcgi_cache_use_stale error timeout invalid_header updating http_500;
          fastcgi_max_temp_file_size 2M;
          fastcgi_cache_lock on;
          fastcgi_cache_lock_timeout 2m;
          fastcgi_cache_valid 2d;
          root $root_path;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            if (!-f $request_filename) {
                            rewrite  ^(.*)$  /index.php last;
            } 
        }

Вот рабочий конфиг, проверенный временем

 

root $root_path;  <-- под переменной указана корневая папка сайта и путь к fastcgi сокету будет у тебя другой.

Share this post


Link to post
Share on other sites

Спасибо, конфиг поправил.

 

Только не могу разобраться с 

fastcgi_cache_path   /var/cache/nginx/cache  levels=1:2 keys_zone=cache:10m inactive=5m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache   cache;

пользователи получают залогиненную закешированную страницу другого пользователя,

а при добавлении

fastcgi_hide_header "Set-Cookie";
fastcgi_ignore_headers "Cache-Control" "Expires";

пользователи вообще не могут залогиниться в свой аккаунт.

Share this post


Link to post
Share on other sites

Правильно ли я понимаю, что надо определять при помощи nginx зашёл пользователь под своим аккаунтом или нет?

Если так, то эту информацию и кук получить нельзя, т.к. кука зашифрована.

Как тогда добавить ещё одну куку, которую будет определять nginx?

Надо как-то так:

map $http_cookie $no_cache {
    default 0;
    ~_NOTGUEST 1; # session cookie
}

Тогда можно определять и соответственно делать кеширование (microcaching).

Share this post


Link to post
Share on other sites

То что я тебе написал работает 100%, после применения конфига и перезапуска nginx, не мешало бы так же почистить кеш браузера и куки за все время.

Share this post


Link to post
Share on other sites

Т.е. эту информацию

fastcgi_cache_path /var/cache/nginx/cache  levels=1:2 keys_zone=cache:10m inactive=5m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache   cache;

добавлять не надо?

Share this post


Link to post
Share on other sites

И да и нет, точно сказать не могу, тут можно сделать и настроить все по разному, но вот тот конфиг что я привел, он у меня работает отлично без ошибок которые ты описал на многих сайтах. Ты этими строчками задаешь путь где будет хрониться кеш, задаешь подуровни его хранения, максимальный размер файла и 5 минут хранения его...причем первая строчка должна быть в http секции, а вторые две в location ~ \.php$ {....но проблема у тебя где то в fastcgi_cache_key "$scheme$request_method$host$request_uri"

Попробуй без этих трех строчек вообще..

Share this post


Link to post
Share on other sites

Вот целый конфиг для сайта:

 

######################site.ru#####################
server {
    server_name www.site.ru;
    listen 10.20.03.05;
    rewrite ^ http://site.ru$request_uri?'>http://site.ru$request_uri? permanent; #301 redirect
  }
server {
    listen 10.20.03.05;
    server_name site.ru;
    charset UTF8;
    disable_symlinks if_not_owner from=$root_path;
    set $root_path /var/www/user/data/www/site.ru;
    include kiev.conf;  #Тут ЧПУ прописаны
# Static
    location / {
       root $root_path;
       index index.php;
       client_max_body_size 10m;
       client_body_buffer_size 128k;
       access_log /var/www/nginx-logs/user isp;
       access_log /var/www/httpd-logs/site.ru.access.log ;
# Rewrite rules
      if ( !-e $request_filename ) {
      rewrite (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ /index.php last;
      break;
      }
    }

    location ~ ^/(status|ping)$ {
       root $root_path;
       include fastcgi_params;
       fastcgi_pass unix:/var/www/user/data/php-fpm/phpfpm.sock;
       fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
       allow 127.0.0.1;
       deny all;
        }

    error_page  404 /404/;
        location = /404/ {
      rewrite ^ http://site.ru permanent;
        }
        error_page  502 503 504  /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
      expires 120d;
        }
    location ~ \..*/.*\.php$ {
        return 404;
    }
    
        # PHP scripts -> PHP-FPM server listening on 127.0.0.1:9000
        location ~ \.php$ {
          fastcgi_pass unix:/var/www/user/data/php-fpm/phpfpm.sock;
          fastcgi_index  index.php;
          include fastcgi_params;
          fastcgi_connect_timeout 12000s;
          fastcgi_read_timeout 12000s;
          fastcgi_send_timeout 12000s;
          fastcgi_buffer_size 64k;
          fastcgi_buffers 16 64k;
          fastcgi_cache_valid 200 301 302 1d;
          fastcgi_cache_valid 304 120d;
          fastcgi_cache_valid 404 1m;
          fastcgi_cache_use_stale error timeout invalid_header updating http_500;
          fastcgi_max_temp_file_size 2M;
          fastcgi_cache_lock on;
          fastcgi_cache_lock_timeout 2m;
          fastcgi_cache_valid 2d;
          root $root_path;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            if (!-f $request_filename) {
                            rewrite  ^(.*)$  /index.php last;
            } 
        }
 
        # Security (hidden files)
        location ~ /\. {
            deny  all;
            access_log  off;
            log_not_found  off;
        }
 
        # Stuffs
        location = /robots.txt  { root $root_path; access_log off; log_not_found off; expires 30d; }
        location = /favicon.ico { root $root_path/img; access_log off; log_not_found off; expires 30d; }
        location = /sitemap.xml { root $root_path; access_log off; log_not_found off; expires 30d; }        
 
        # static files
        location ~* ^.+\.(jpg|jpeg|gif|css|png|js|pdf|html)$ {
                expires         10d;
                access_log      off;
                log_not_found   off;
        root $root_path;
        }
        location /js/jquery/ {
            root $root_path;
            expires         10d;
            access_log      off;
            add_header Content-Type image/jpeg;
            add_header Cache-Control public;
        }
        location /img/ {
            root $root_path;
            expires         14d;
            access_log      off;
            add_header Content-Type image/jpeg;
            add_header Cache-Control public;
        }
        location /themes/user/user-img/ {
            root $root_path;
            expires         120d;
            access_log      off;
            add_header Content-Type image/jpeg;
            add_header Cache-Control public;
        }

        location /themes/user/img/ {
            root $root_path;
            expires         120d;
            access_log      off;
            add_header Content-Type image/jpeg;
            add_header Cache-Control public;
        }

        location ~* \.(admin-dev|override|tools|translations|webservice|modules|char|classes|install|config|controllers|docs|export|localization|log|.*sql|.*bz2|.*csv|.*tpl(\.php)?|xtmpl)$|^(\..*|Entries.*)$|\.php_ {
               deny all;
        }
        include /usr/local/ispmgr/etc/nginx.inc;
        location ~ /\.ht {
        deny  all;
        }
}

user - юрер под которым сайт пашет на сервере
site.ru - твой сайт
include /usr/local/ispmgr/etc/nginx.inc; - в том случае если у тебя ISPmanager есть, если нет то у тебя ошибка конфига будет, закомментируй тогда.

/themes/user/user-img/ - тут user поменяй на название темы своей и user-img заменить на имя папки с картинками темы

 

Я не бьюсь об заклад что это идеальный конфиг и совершенством наверное он не обладает и думаю его чуток нужно подправить чтобы была правильная переадресация на страницу 404 престашопа..

Но этот конфиг у меня на очень многих сайтах которые давно уже работают и проблем не было!

Edited by Kerm (see edit history)

Share this post


Link to post
Share on other sites

Ого, спасибо за конфиг, поизучаю.

В общем, с твоим конфигом всё работает, у всех всё нормально.

 

Только я не понимаю тогда, где у тебя хранится закешированные данные? На сколько я понимаю, по-умолчанию нет такого параметра.

В моём примере параметр

fastcgi_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=cache:10m inactive=5m; 

указывает на то, что кеш будет хранится в /var/cache/nginx/cache.

 

Кеш-то создаётся, другому пользователю отдаётся закешированный файл, но с информацией и кукой другого пользователя.
Конечно, этот параметр сейчас отключен, пока не разберусь.

В твоём конфиге этот параметр может указан в include fastcgi_params?

 

Или я чего-то не понимаю. :-)

Edited by vxd (see edit history)

Share this post


Link to post
Share on other sites

Вот тут есть хорошее объяснение с примером конфига, о том, что я имею ввиду

https://www.digitalocean.com/community/articles/how-to-setup-fastcgi-caching-with-nginx-on-your-vps

 

Но дело в том, что в престе сессия зашифрована, и информация о ней находится в куке в зашифрованном виде.

Поэтому, определить, зашёл ли пользователь и нет (т.е. гость) нет возможности (точнее, я пока не понял как это сделать).

Для гостя страницы можно отдавать из кеша (как статичную страницу, созданную nginx'ом), а залогиненным пользователям уже отдавать сгенерированные страницы налету (для них же динамика).

 

Вот я и думаю, как создавать куку, когда клиент залогинился, и удалять её, когда клиент вышел из своего аккаунта.

Надеюсь, идея понятна.

Share this post


Link to post
Share on other sites

Смотри в сторону nginx+php-fpm без использования таких вещей как apc cache, xcache, memcache с отключенными опциями сжатия файлов в престе...и оптимизации SQL запросов на уровне специальных модулей для престы.

Share this post


Link to post
Share on other sites

  • 2 years later...

Вот целый конфиг для сайта:

 

 

######################site.ru#####################
server {
    server_name www.site.ru;
    listen 10.20.03.05;
    rewrite ^ http://site.ru$request_uri?'>http://site.ru$request_uri? permanent; #301 redirect
  }
server {
    listen 10.20.03.05;
    server_name site.ru;
    charset UTF8;
    disable_symlinks if_not_owner from=$root_path;
    set $root_path /var/www/user/data/www/site.ru;
    include kiev.conf;  #Тут ЧПУ прописаны
# Static
    location / {
       root $root_path;
       index index.php;
       client_max_body_size 10m;
       client_body_buffer_size 128k;
       access_log /var/www/nginx-logs/user isp;
       access_log /var/www/httpd-logs/site.ru.access.log ;
# Rewrite rules
      if ( !-e $request_filename ) {
      rewrite (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ /index.php last;
      break;
      }
    }

    location ~ ^/(status|ping)$ {
       root $root_path;
       include fastcgi_params;
       fastcgi_pass unix:/var/www/user/data/php-fpm/phpfpm.sock;
       fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
       allow 127.0.0.1;
       deny all;
        }

    error_page  404 /404/;
        location = /404/ {
      rewrite ^ http://site.ru permanent;
        }
        error_page  502 503 504  /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
      expires 120d;
        }
    location ~ \..*/.*\.php$ {
        return 404;
    }
    
        # PHP scripts -> PHP-FPM server listening on 127.0.0.1:9000
        location ~ \.php$ {
          fastcgi_pass unix:/var/www/user/data/php-fpm/phpfpm.sock;
          fastcgi_index  index.php;
          include fastcgi_params;
          fastcgi_connect_timeout 12000s;
          fastcgi_read_timeout 12000s;
          fastcgi_send_timeout 12000s;
          fastcgi_buffer_size 64k;
          fastcgi_buffers 16 64k;
          fastcgi_cache_valid 200 301 302 1d;
          fastcgi_cache_valid 304 120d;
          fastcgi_cache_valid 404 1m;
          fastcgi_cache_use_stale error timeout invalid_header updating http_500;
          fastcgi_max_temp_file_size 2M;
          fastcgi_cache_lock on;
          fastcgi_cache_lock_timeout 2m;
          fastcgi_cache_valid 2d;
          root $root_path;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            if (!-f $request_filename) {
                            rewrite  ^(.*)$  /index.php last;
            } 
        }
 
        # Security (hidden files)
        location ~ /\. {
            deny  all;
            access_log  off;
            log_not_found  off;
        }
 
        # Stuffs
        location = /robots.txt  { root $root_path; access_log off; log_not_found off; expires 30d; }
        location = /favicon.ico { root $root_path/img; access_log off; log_not_found off; expires 30d; }
        location = /sitemap.xml { root $root_path; access_log off; log_not_found off; expires 30d; }        
 
        # static files
        location ~* ^.+\.(jpg|jpeg|gif|css|png|js|pdf|html)$ {
                expires         10d;
                access_log      off;
                log_not_found   off;
        root $root_path;
        }
        location /js/jquery/ {
            root $root_path;
            expires         10d;
            access_log      off;
            add_header Content-Type image/jpeg;
            add_header Cache-Control public;
        }
        location /img/ {
            root $root_path;
            expires         14d;
            access_log      off;
            add_header Content-Type image/jpeg;
            add_header Cache-Control public;
        }
        location /themes/user/user-img/ {
            root $root_path;
            expires         120d;
            access_log      off;
            add_header Content-Type image/jpeg;
            add_header Cache-Control public;
        }

        location /themes/user/img/ {
            root $root_path;
            expires         120d;
            access_log      off;
            add_header Content-Type image/jpeg;
            add_header Cache-Control public;
        }

        location ~* \.(admin-dev|override|tools|translations|webservice|modules|char|classes|install|config|controllers|docs|export|localization|log|.*sql|.*bz2|.*csv|.*tpl(\.php)?|xtmpl)$|^(\..*|Entries.*)$|\.php_ {
               deny all;
        }
        include /usr/local/ispmgr/etc/nginx.inc;
        location ~ /\.ht {
        deny  all;
        }
}

user - юрер под которым сайт пашет на сервере

site.ru - твой сайт

include /usr/local/ispmgr/etc/nginx.inc; - в том случае если у тебя ISPmanager есть, если нет то у тебя ошибка конфига будет, закомментируй тогда.

/themes/user/user-img/ - тут user поменяй на название темы своей и user-img заменить на имя папки с картинками темы

 

Я не бьюсь об заклад что это идеальный конфиг и совершенством наверное он не обладает и думаю его чуток нужно подправить чтобы была правильная переадресация на страницу 404 престашопа..

 

Но этот конфиг у меня на очень многих сайтах которые давно уже работают и проблем не было!

 

 

А ничего так, что в этом конфиге fastcgi кэш вообще не включен?
 
Должно вклюаться следующей инструкцией:
 
fastcgi_cache cache_name;
где cache_name - это имя инструкции кэширования в http{ }
 
А в приведенном выше конфиге вообще кэш не включается, и все fastcgi_cache_valid игнорируются, поэтому все нормально и работает)))
  • Like 1

Share this post


Link to post
Share on other sites

Интересно.

 

Вы конечно совершенно правы, я не стал прописывать это, статика там кешируется и этого вполне достаточно, а чтоб кешировать еще и fastcgi я тогда не нашел информацию о том что нужно указывать в параметре "fastcgi_cache_key" для престашоп, чтобы сайт работал стабильно после этого и не кешировал, то что не нужно, а именно чтобы не было проблем с куки и сессиями после.

Share this post


Link to post
Share on other sites

Интересно.

 

Вы конечно совершенно правы, я не стал прописывать это, статика там кешируется и этого вполне достаточно, а чтоб кешировать еще и fastcgi я тогда не нашел информацию о том что нужно указывать в параметре "fastcgi_cache_key" для престашоп, чтобы сайт работал стабильно после этого и не кешировал, то что не нужно, а именно чтобы не было проблем с куки и сессиями после.

 

Беда в том, что в престе кеширование fastcgi практически нереально настроить. Если вход в админку и вообще саму админку можно не кэшировать благодаря отдельным инструкциям в nginx, то блок с корзиной, например, который сквозной через весь сайт и везде всегда для всех уникальный, нельзя закрыть от кэширования. Если весь фронтэнд закэшировать через nginx, то мы даже добавить товары в корзину не сможем (точнее сможем, в базу запишется все, но мы будем видеть всегда пустую корзину).

 

Была идея подключить SSI, но придется сильно переписать шаблоны, так как они все по умолчанию на шаблонизаторах .tpl работают. Поэтому я пока отложил эту идею кэширования на fastcgi.

Share this post


Link to post
Share on other sites

  • 3 months later...

Добрый день!

Задам вопрос не прям в тему, а рядом, чтобы не создавать новую ветку.

Сейчас магазин работает на связке Apache + MariaDB 10.1 + Memcashed.  В данный момент меня не устраивает время ответа сервера, хотя куплен хороший VPS (2*Xeon 2,4Ghz/2Gb/60 Gb SSD)

В какую сторону смотреть в целях повышения скорости отклика web-сервера?

1) Полный переход на Ngnix + Fast CG

2) Отдача статики Ngnix'ом + Apache для динамики.

 

Какой выигрыш будет в том и в другом случае и стоит ли морочиться?

Заранее огромное спасибо!

Share this post


Link to post
Share on other sites

Как показывает практика, если все отдать nginx, то работает быстрее. Но больше всего ресурс жрёт php на престе. И кэш fastcgi отличное решение, но его очень непросто реализовать на этом движке.

 

Если товаров больше 1000, время ответа становится все более заметным. Пробовали даже php7 fpm + nginx + percona на сервере с параметрами как у Вас, все равно ответ 1-2 сек на сайте с 12000 товаров. в общем, это я к тому, что преста для обьемных магазов слишком прожерливая, и мы пока не смогли найти решение сильно снизить нагрузку...

Share this post


Link to post
Share on other sites

О как! У меня оч много товаров, более 20000 тысяч. Сейчас время ответа сервера 3-4 секунды. Цель сделать 1-2 секунды хотя бы.

Больше всего времени занимает контроллер initContent судя по профилированию.  И видно что дело именно в работе web-сервера, потому что запросы к базе кешируются в самом движке MySQL и с помощью memcached.

 

На сколько дает прирост Ngnix + Fast CGI по вашему опыту?  Будет ли хотя бы 40-50% сокращения отклика?

 

Есть конечно второй путь, наращивать железо, но это крайний случай уже.

Share this post


Link to post
Share on other sites

В связке не работал. Но чистый апач у нас вышел где-то в 3 раза медленнее, чем чистый nginx.

1-2 сек не очень хорошо, как вы на 3-4 работаете?))

7 пхп почти в 4 раза нас ускорила. Плюс чистый сервер, на котором один сайт толькл был, даже пхпмайадмин снесли от греха подальше.

Share this post


Link to post
Share on other sites

Тяжело работаем! =(

1. Чистый сервер -- да скоро будет

2. Рекомендуете попробовать перейти на PHP7 вместо 5.4.16 ? Стоит ли пробывать Apache + PHP7

3. Как настраивали Ngnix, по инструкции ( http://prestashop24.ru/2015/09/16/%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8-nginx-%D0%B8-php-fpm-%D0%B4%D0%BB%D1%8F-prestashop-1-6-x/ ) ?

 

Поделитесь опытом, что работает, что нет, и как не изобретать велосипед.

Заранее спасибо огромное!

Share this post


Link to post
Share on other sites

Вообще, в принципе, я не вижу ни одной причины, по которой стоит пользоваться Apache вместо nginx))))

 

Php7 намного быстрее 5, тем более старой 5.4

Share this post


Link to post
Share on other sites

Доброе утро!

>Вообще, в принципе, я не вижу ни одной причины, по которой стоит пользоваться Apache вместо nginx))))

 

Касательно престы плюсы Апача только в работе из коробки, все модули вносят то что им надо в .htaccess

 

3. Как настраивали Ngnix, по инструкции ( http://prestashop24....estashop-1-6-x/ ) ?  Установлен ли у вас Advansed Search4 ?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More