Распределение нагрузки на сервер с помощью мини CDN - PullRequest
3 голосов
/ 30 октября 2011

Использование плагина кэширования для моего сайта WordPress значительно снизило нагрузку на сервер, но я пытаюсь уменьшить его еще больше.Плагин кэширования создает статический HTML-файл, который можно использовать повторно, а не заново создавать его с помощью php при каждом отдельном запросе.

Я хочу скопировать этот статический файл на несколько серверов, чтобы его можно было обслуживать из разных мест, что увеличивает нагрузку на сервер.

Концепция

concept

Я делаю это в основном так:

Главный сервер:

//Echo's what the pointer server will echo, which echo's what the sub-server echo's (which is the stored html file's content)
echo file_get_contents("http://$pointerserver?f=$fileNameWeAreRequesting";

Сервер указателей:

if(isset($_GET['f'])){ $requestedfile = $_GET['f']; }
/* Redirect user to file */
if(isset($_GET['redirect']))
{
    //Filename example: file.html (shares same filename as it's original, 
    //but the content holds a string of sub-servers that host the file, seperated by a comma)
    $servers = file_get_contents("filelocations/$requestedfile");
    $pieces = explode(",", $servers); //Sub-Servers to array
    //Check for online server
    foreach ($pieces as $server)
    {
        if(file_get_contents("servercheck/$server") == "1") //Check if sub-server online
        {
            /* Echo file from sub-server NOW */
            echo file_get_contents("http://$server?f=$requestedfile"); //Echo's whatever the sub-server echo's
            break;
        }
    }
}

Подсервер

/* Provide requested file */
echo file_get_contents("files/$requestedfile"); //Echo's the static html page stored on the sub-server
  1. Это вообще снижает нагрузку на главный сервер?Или file_get_contents работает таким образом, что главный сервер все равно «разбирает» (собирает файл для вывода html) файл.

  2. Как добавить проверку, чтобыесли субсервер находится в автономном режиме, а сервер-указатель не знает об этом, вместо этого мы подаем статический html-файл с основного сервера.

Подготовка основного сервера к этому

main-server-cdn-ready

Модуль кэширования обрабатывает создание статического файла, поэтому для его отправки я подумал:

Главный сервер:

//This doesn't send anything physical, just instructions to what file the pointer server needs to retrieve and then copy over to the sub-severs.
echo file_get_contents("http://$pointerserver?propagate&f=$fileNameWeAreRequesting";

Указатель сервера: (я знаю, что это не работает, это иллюстрирует идею)

    if(isset($_GET['f'])){ $requestedfile = $_GET['f']; }
/* Propagate file to sub-servers */
if(isset($_GET['propagate']))
{
    if ($handle = opendir('subservers/')) //Retrieve all available sub-servers
    {
        while (false !== ($server = readdir($handle))) //For-each subserver, send the file
        {
            if ($server != "." && $server != "..") 
            {
                /* CREATE AUTO-SUBMIT FORM HERE TO POST FILE CONTENTS (CONCEPT) */
                action="http://$server/receivefile.php?f=$requestedfile&send"
                $postThisStuff = file_get_contents("http://www.mainserver.xx/cache/$requestedfile"); //Reads the file contents from the main server so it can send it over to the sub-server
            }
        }
    }
}

Подсервер

/* Receive file */
if(isset($_GET['send']))
{
    //Write received post date to file
    $fh = fopen("files/$requestedfile", 'w') or die("can't open file");
    $stringData = $_POST['thefile'];
    fwrite($fh, $stringData);
    fclose($fh);
    die();
}

Итак, мой третий и последний вопрос:Является ли этот метод копирования хорошим подходом с точки зрения ресурсов?Статические файлы на главном сервере редко меняются, только когда кто-то публикует комментарий или редактирует статью (или добавляет новый), но все равно важно сохранять ресурсы.

1 Ответ

1 голос
/ 30 октября 2011

Во-первых, я должен был проголосовать за великолепную презентацию.Ваша идея тоже неплоха, но все же: ответить на ваш вопрос: «Не делайте этого!» .

  1. ЕслиПлагин WP настроен на запись реальных HTML-страниц, сначала их использовать?Например, обойти весь стек PHP, проверив, существует ли html-файл, который может быть обработан для текущего запроса.Apache, Nginx или Lighttpd поддерживают это посредством переписывания URL (или даже в основном с точки зрения nginx).[Примечание: я понятия не имею, какой веб-сервер или плагин Wordpress вы используете, поэтому я пропустил фрагменты конфигурации.]

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

  3. Если Varnish недостаточно хорош, и вашСайт может обслуживаться из CDN целиком, посмотрите на кого-то вроде edgecast ( speedyrails является их реселлером).Они позволяют вам выполнять прозрачное кэширование:

    • http://my -blog.com указывает на сервер Edgecast
    • вы настраиваете Edgecast для проверки http://mainserver.my -blog.com если кеш не заполнен
    • настраивать заголовки кеша, чтобы избежать частых поисков
    • они также позволяют очищать кеш (при обновлении блога)
  4. Если все вышеперечисленное не для вас, я предлагаю вам проверить Cloudflare .Они делают то, что вы хотите сделать (и больше).Я сам тестирую их, пока работает без нареканий.

...