2013-11-08 2 views
2

Я перешел от установки Apache 2 + Varnish к Nginx в одиночку, и я как бы зациклился на том, как мне настроить ESI, а также fastcgi_cache в этой настройке.Кэширование Symfony 2 на Nginx

Прежде всего, идея ESI заключалась в том, что мы устанавливаем обратный прокси-сервер перед сервером для кэширования частей, относящихся к кэшу, а затем с помощью esi для извлечения динамических частей. В моей предыдущей настройке Varnish действовал как обратный прокси-сервер, и Apache обрабатывает только запросы esi, когда это необходимо.

Мой вопрос в том, что теперь, когда Nginx действует как единственный сервер здесь, как мне заставить его работать? Нужно ли мне настраивать другой экземпляр Nginx, который работает как обратный прокси-сервер или что-то еще? Я не мог найти документа об этом.

Второй вопрос касается fastcgi_cache. Я установил его, как описано ниже, но кеш не работает для меня, никакого файла кэша не заполняется, и я всегда получаю «MISS». Интересно, это потому, что мне нужно установить max-age/shared-max-age в каждом контроллере, чтобы каждый работал?

fastcgi_cache_path /run levels=1:2 keys_zone=www_mysite_com:100m inactive=60m; 
fastcgi_cache_key "$scheme$request_method$host$request_uri"; 
fastcgi_cache_use_stale error timeout invalid_header http_500; 

server { 
     #listen 80; ## listen for ipv4; this line is default and implied 
     #listen [::]:80 default ipv6only=on; ## listen for ipv6 

     root /var/www/mysite.com/w/w/w/www/web; 
     index index.php index.html index.htm; 

     # Make site accessible from http://www.mysite.com 
     server_name www.mysite.com; 

     # Specify a character set 
     charset utf-8; 

     # strip app.php/ prefix if it is present 
     rewrite ^/app\.php/?(.*)$ /$1 permanent; 

     # h5bp nginx configs 
     # include conf/h5bp.conf; 

     location/{ 
       index app.php; 
       try_files $uri @rewriteapp; 
     } 

     location @rewriteapp { 
       rewrite ^(.*)$ /app.php/$1 last; 
     } 

     # Deny access to .htaccess 
     location ~ /\.ht { 
      deny all; 
     } 

     # Don't log robots.txt or favicon.ico files 
     location = /favicon.ico { log_not_found off; access_log off; } 
     location = /robots.txt { access_log off; log_not_found off; } 

     # 404 errors handled by our application, for instance Symfony 
     error_page 404 /app.php; 

     # pass the PHP scripts to FastCGI server from upstream phpfcgi 
     location ~ ^/(app|app_dev|backend/app|backend/app_dev|config)\.php(/|$) { 
       fastcgi_split_path_info ^(.+\.php)(/.*)$; 
       # With php5-fpm: 
       fastcgi_pass unix:/var/run/php5-fpm.sock; 
       fastcgi_index index.php; 

       include fastcgi_params; 
       fastcgi_param SCRIPT_FILENAME web/$fastcgi_script_name; 
       fastcgi_param HTTPS off; 
       fastcgi_cache www_mysite_com; 
       fastcgi_cache_valid 200 60m; 
     } 

     # Only for nginx-naxsi : process denied requests 
     #location /RequestDenied { 
       # For example, return an error code 
       #return 418; 
     #} 

     # redirect server error pages to the static page /50x.html 
     # 
     #error_page 500 502 503 504 /50x.html; 
} 

ответ

3

По умолчанию, ответы из приложения Symfony 2 имеет заголовок управления кэша, который отключает кэширование:

Cache-Control: no-cache 

Если вы хотите Nginx для кэширования страниц вам придется изменить эти заголовки.

Вы можете найти общую информацию о кэшировании в documentation

Самым простым решением является использование SymfonyFrameworkExtraBundle (у вас уже есть, если вы используете стандартный выпуск SF2) и использовать аннотации на контроллерах и/или действия укажите заголовки кеша. Вы можете найти дополнительную информацию об этом подходе: docs for the @Cache annotation.

Смежные вопросы