прежде всего интересует, нет ли по вашему мнению каких-то косяков в настройке? или может вы знаете как сделать еще лучше для высоконагруженного сайта?
nginx.conf абсолютно дефолтен, в server { } для кэша используется try_files таким образом:
try_files $uri /cache/$uri.html $uri/ /cache/$uri/ /index.php?$args&test=$uri;
весь 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?
как вам вообще идея подобной реализации с кэшированием? есть ли узкие места, которые вы знаете как сделать лучше? (прослойку между креслом и монитором в расчет не берем)