Кэширование динамики с SSI в nginx

Thank you for reading this post, don't forget to subscribe!

Кеши­ро­вать сай­ты, кото­рые ред­ко изме­ня­ют­ся доволь­но лег­ко. Но ведь боль­шин­ство совре­мен­ных сай­тов име­ют мно­же­ство пер­со­на­ли­зи­ро­ван­ных эле­мен­тов на стра­ни­це (бан­не­ры, видже­ты и т.п.). Для таких слу­ча­ев суще­ству­ет тех­но­ло­гия SSI. Тех­но­ло­гия очень про­стая, она поз­во­ля­ет раз­де­лить стра­ни­цу на бло­ки и вклю­чить кеши­ро­ва­ние толь­ко для неко­то­рых из этих блоков.

SSI

Допу­стим, у нас на стра­ни­це есть ста­ти­че­ский кон­тент и толь­ко один бан­нер. Но бан­нер зави­сит от пер­со­наль­ных дан­ных, поэто­му его нель­зя кеши­ро­вать. Мы мог­ли бы заке­ши­ро­вать стра­ни­цу, но толь­ко не тот уча­сток, где нахо­дит­ся бан­нер. А на месте это­го участ­ка посто­ян­но выво­дить дина­ми­че­ский контент.

Так вот, SSI — это про­сто спе­ци­аль­ная инструк­ция, кото­рая ука­зы­ва­ет Web сер­ве­ру, вста­вить вме­сто нее резуль­тат запро­са к какой-то дру­гой стра­ни­це. При­мер инструкции:

# Вме­сто это­го кода на стра­ни­цу будет встав­лен резуль­тат запро­са к скрип­ту "/authentication.php"

Web сер­вер пони­ма­ет SSI инструк­ции и авто­ма­ти­че­ски заме­ня­ет нуж­ные участ­ки стра­ни­цы перед отправ­кой ее кли­ен­ту. Кеши­ро­вать мож­но как всю стра­ни­цу, так и отдель­ные блоки.

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

Nginx и SSI

В Nginx под­держ­ка SSI вклю­ча­ет­ся очень просто:

Кеширование SSI

Nginx поз­во­ля­ет читать дан­ные из Мemcache.

[codesyntax lang="php"]

[/codesyntax]

Нам оста­нет­ся толь­ко сохра­нить в Memcache нуж­ные дан­ные из при­ло­же­ния (Nginx сам не уме­ет скла­ды­вать туда данные).

PHP

В PHP необ­хо­ди­мо обес­пе­чить сохра­не­ние нуж­ных дан­ных в нуж­ные ключи.

# Сохра­ня­ем резуль­тат буфе­ра выво­да в Memcache

Настоящий пример

Определяем блоки SSI

Пер­вое — выде­ля­ем нуж­ные бло­ки в шаб­лоне и заме­ня­ем их вызо­ва­ми SSI.

Как вид­но, на стра­ни­це есть два SSI бло­ка — блок авто­ри­за­ции и блок кон­тен­та. В нашем при­ме­ре блок авто­ри­за­ции будет пер­со­наль­ным (допу­стим, после вхо­да, там будет имя поль­зо­ва­те­ля). Блок содер­жи­мо­го не будет пер­со­наль­ным (т.е. он будет общим для всех пользователей).

Настраиваем Nginx

Нам нуж­но настро­ить два хоста:

  • Глав­ный хост — к нему будут обра­щать­ся посе­ти­те­ли. Он будет обра­ба­ты­вать SSI и исполь­зо­вать дан­ные из кеша.
  • Бекенд — наше при­ло­же­ние. Он про­сто все­гда будет отда­вать резуль­тат рабо­ты PHP.

[codesyntax lang="php"]

[/codesyntax]

# Бекенд

 

[codesyntax lang="php"]

[/codesyntax]

# Глав­ный хост

PHP

Нам пона­до­бит­ся два скрип­та — authentication.php и somepage.php. Они будут оди­на­ко­вы­ми по сути, somepage.php мог бы выгля­деть так:

Самое важное

SSI поз­во­ля­ет повы­сить гиб­кость обыч­но­го кеши­ро­ва­ния на уровне Web сер­ве­ра. Исполь­зо­ва­ние это­го под­хо­да поз­во­лит исполь­зо­вать пре­иму­ще­ства кеша на дина­ми­че­ских сайтах.