Системный администратор в Черногории и по всему миру

Администрирование серверов, разработка плагинов к хостинг-панелям

Архивы тэга: php

Веб-кластер для бедных

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

Если выделить типовые задачи, которые можно решить путем создания веб-кластера, это:
1) возможность распределить нагрузку по серверам путем обычного round robin на уровне dns;
2) возможность "вынести" сервер поближе к пользователям, когда для одной страны/города, трафик отдается с одного сервера, а для остальных, с другого;
3) возможность делать бэкапы на узле который не участвует в отдаче трафика, но тем не менее, содержит на себе всю актуальную информацию и т.п.
(далее…)

Тэги: , , , , , ,

Защищаем от хотлинкига

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

Конфиг nginx в общем случае будет выглядеть так:
location ^~ /downloads/ {
secure_link $arg_hash,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr salt";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
alias /var/www/sites/data/www/test/files/;
}

где $arg_hash - $_GET['hash'] переменная hash кодирующая ссылку, а $arg_expires - $_GET['expires'] содержащее время "протухания" ссылки, а salt - "соль" которой добавляем уникальность (как вариант, можно добавлять в secure_link_md5 user_agent или любые другие переменные). Я использую alias, так как физически имя папки в url отличается от фактической в файловой системе.

Генерация ссылки на php происходит следующим образом:

$salt="salt";
$time = time() + 10800;
$file="/downloads/file.rar"
$hash=md5($time."/".$file.$_SERVER['REMOTE_ADDR']." ".$salt,TRUE);
$hash = strtr( base64_encode($hash), array( '+' => '-', '/' => '_', '=' => '' ));
$link="http://test.com".$file."?hash=".$hash."&expires=".$time;

Тэги: , ,