LINUX.ORG.RU

несколько вопросов обо всем

 , , ,


0

2

прежде всего интересует, нет ли по вашему мнению каких-то косяков в настройке? или может вы знаете как сделать еще лучше для высоконагруженного сайта?

nginx.conf абсолютно дефолтен, в server { } для кэша используется try_files таким образом:

try_files $uri /cache/$uri.html $uri/ /cache/$uri/ /index.php?$args&test=$uri;
т.е. если существует запрашиваемый файл - отдаем его, либо есть такой .html файл в кэше, либо есть такие директории... иначе идем выполнять index.php с параметром test=запрашиваемая_страница

весь index.php это небольшое «ядро», которое умеет

  • кэширование. страницы кэшируются целиком. есть на сайте и динамичный контент - блок с авторизацией пользователя, поэтому ajax'ом делается запрос за php скриптом для вывода на страницу имени пользователя, если он залогинен. думаю, еще через js сделать проверку на наличие сессионной куки, чтобы зря не отправлять запрос на сервер.
  • человеко-понятные урлы, которые необходимы так же для кэширования - файл имеет точно такой же путь, какой у чпу.

и код:

<?php
foreach (explode('/', $_GET['test']) as $test) {
  if (strlen($test) > 0) $path[] = $test; unset($test);
}
ob_start();
if (implode('/', $path) == 'user') include('./includes/user.inc.php');
elseif (implode('/', $path) == 'about') include('./includes/about.inc.php');
$contents = ob_get_clean();
?>
<?php ob_start(); ?>
<!doctype html>
<html>
...
<?php echo $contents; ?>
...
</html>
<?php if (isset($cache)) file_put_contents('./cache/'.$cache.'.html', ob_get_contents(), LOCK_EX); ?>
<?php ob_end_flush(); ?>

в итоге получается так:
1) если есть запрашиваемый файл - отдаем его, иначе
2) если есть .html-вариант несуществующего запрашиваемого файла в кэше, отдаем его, иначе
3) парсим запрашиваемый урл, например запросили /about, поэтому выдаем "./includes/about.inc.php"
4) если в about.inc.php установлена $cache = 'about'; переменная, то сохраняем всю страницу в кэш "./cache/about.html". аналогично будет со всеми страницами, типа /forum/thread/12345, - все они хранятся с таким же путем, в поддиректориях, в кэше. query_string в данном случае не используется нигде, а если нужно использовать, то значит страница динамична, и $cache устанавливать не нужно чтобы ее не кэшировать.

страницы лежат в кэше пока их оттуда не удалишь, а удалять их будет php скрипт при записи новых данных в базу.
например, при добавлении нового сообщения в тред «/forum/thread/12345», файл "./cache/forum/thread/12345.html" удалит скрипт, который будет заносить сообщение в базу к этому треду. и уже потом, при первом запросе этого треда будет снова создан кэш страницы, которая будет отдаваться статикой при повторных запросах.

теперь к вопросам.

все файлы с кэшем хранятся на винте. обычные, статичные html файлы, - чего с них будет? memcached прикручивать не вижу толку, ведь файл запрашивается один раз, а далее помещается в кэш в памяти уже ядром. и даже в nginx имеются соответствующие настройки для кэширования статики. так что... memcached не нужен?

в таком случае, как файловая система ext4 отнесется, когда у нее в папке ./cache/forum/thread будет лежать 12,345 html-файлов? а 999,999,999 (по количеству тредов на форуме)? может выбрать что-то другое? или все-таки прикрутить memcached и хранить статику там? или где-то еще?

вопрос в выборе базы, как обычно... в данном случае php работает по-минимуму, и просто выполняет роль: разово достать данные из базы, сгенерировать страницу, положить ее в кэш. еще записать новые данные в базу. все. то есть, вообще не будет такого, какой-то php скрипт выполняется при _каждом_ запросе сервера. исключение конечно может составить авторизация пользователя, но и тут сначала будет проверка js скриптом на наличие сессионной куки.
поэтому я не думаю, что выбор базы может быть критичен... может, это самое, хранить все в serialize-файлах? =) и ничего, что если какой-нибудь тред на форуме станет размером ~100мб, и один разик придется скрипту его пропарсить, сгенерировав html страницу? или придется использовать хотя бы mysql?

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

★★★★★

вдогонку, - сейчас каждый уник делает 6 запросов с сервера, но думаю количество запросов можно уменьшить, если два css, один js, один favicon.ico и одну картинку 88х31 засунуть в кэшируемый html. графику туда же, в base64)..

частично-динамичный контент (только один блок (div), с авторизацией пользователя) тоже дергается с сервера ajax'ом, но это опционально, при наличии куки.

в итоге получится всего один запрос html файла с сервера + опционально один php скрипт в 5 строчек кода.

или до такой степени уже не стоит заморачиваться, и на 6 статичных запросов (только для уника) пофиг? :)

Spoofing ★★★★★ ()

А если на форуме используются разные темы оформления, генерить разные закэшированные html-файлы для одного урла?

anonymous ()
Ответ на: комментарий от anonymous

такого не будет. дизайн давно нарисован и не будет меняться нигде. форум тоже свой, оформлен как модуль сайта.

Spoofing ★★★★★ ()

в таком случае, как файловая система ext4 отнесется

кэш можно на ram диск бросить.

pi11 ★★★★★ ()

ajax заменил на ssi.

теперь клиент не будет делать лишних запросов на сервер, а сервер сразу спросит php-fpm для инклуда блока авторизации. замечательно. еще минус один запрос на сервер. и теперь, получается, можно сделать так, что вообще будет отдаваться один лишь html файл)..

осталось придумать место, куда лучше их все складывать.

Spoofing ★★★★★ ()
Ответ на: комментарий от pi11

кэш можно на ram диск бросить.

нет смысла, почитай обсуждения в nginx-ru

true_admin ★★★★★ ()
Ответ на: комментарий от Spoofing

если два css, один js, один favicon.ico и одну картинку 88х31 засунуть в кэшируемый html

выставь для них заголовки кэширования и браузер не будет их дёргать повторно.

Вообще, основная проблема это не статика а динамика.

true_admin ★★★★★ ()

например, при добавлении нового сообщения в тред «/forum/thread/12345», файл "./cache/forum/thread/12345.html" удалит скрипт, который будет заносить сообщение в базу к этому треду. и уже потом, при первом запросе этого треда будет снова создан кэш страницы, которая будет отдаваться статикой при повторных запросах.

Не забудь использовать блокировки при обращении к файлам на запись.

Olegymous ★★ ()

в таком случае, как файловая система ext4 отнесется, когда у нее в папке ./cache/forum/thread будет лежать 12,345 html-файлов?

плохо отнесется, именно для этого нужен параметр levels у кеша nginx

http://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_cache_path

а в чем глубокий смысл кеширования на уровне backend-приложения а не на уровне frontend-сервера?

disarmer ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.