Перейти к контенту
  • 0

Как убрать нагрузку на сервер?


Вопрос

Добрый день. Столкнулась с такой проблемой:

имеем 2 одинаковых форума, одному уже 3 года исполнится. Больше года гнездимся на одном хостинге, к работе которого претензий не имеем, цены тоже приемлемы. В один прекрасный момент получаем письмо от хостера, про увеличенную нагрузку на CPU сервера от одного из форумов. И через определенный период нам закрывают аккаунт. После некоторой переписки сайт заработал, но по адресу, где расположен форум зайти нельзя, выдает ошибку 403.

 

Вот что пишет сам хостер:

У вас сдесь сессия передается не через кукис, а прямо в строке запроса,

потому поисковики бегают по этому форуму кругами дико расходуя ресурсы.

 

Если форум вам не нужен - впишите в его .htaccess

deny from all

 

короче вам нужно чтобы в ссылках на форуме

индекс.пхп?s= 7 8 2 4 6 2 6 6 b 4 8 d 1 5 6 f 0 2 7 6 2 2 e 0 5 2 b 0 2 9 8 ashowforum=2

пропало это самое

s=78246266b48d156f027622e052b0298a

 

(форум нам нужен, вообщето)

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

 

Спасибо заранее.

Ссылка на комментарий
Поделиться на других сайтах

  • Ответы 126
  • Создана
  • Последний ответ

Лучшие авторы в этом вопросе

Лучшие авторы в этом вопросе

Загружено фотографий

Рекомендуемые сообщения

  • 0
тобишь заплатки так и не сделали? кх... ндя... не хочется менять версию на новую только потому, что нельзя защитить от известной дыры такой уже бывалый движок 2.1.7
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Посмотрел в 2.1.7 как парсится айпишник:

		foreach ( $addrs as $ip )
	{
		if ( $ip )
		{
			preg_match( "/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/", $ip, $match );

			$this->ip_address = $match[1].'.'.$match[2].'.'.$match[3].'.'.$match[4];

			if ( $this->ip_address AND $this->ip_address != '...' )
			{
				break;
			}
		}
	}

	//-----------------------------------------
	// Make sure we take a valid IP address
	//-----------------------------------------

	if ( ! $this->ip_address OR $this->ip_address == '...' )
	{
		print "Could not determine your IP address";
		exit();
	}

Вроде все безопасно.

Но мой метод проверки айпишника мне нравится больше. :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0
AEC, выпил таблеточку и нашел таки в себе силы просмотреть весь багтрекер invisionpower.com на предмет экплоитов и патчей на 1.3-2.1.х. Нашел штук 6 или 7 разных сплоитов, и везде ответ один "исправлено в новой версии", ни тебе кода патчей, ни просто указаний на строку ошибки.... Боюсь, ничем, кроме советом обновиться до 2.3.6, помочь вам не могу :D
Ссылка на комментарий
Поделиться на других сайтах

  • 0

спасибо за попытку помочь. очень жалко конечно...

--

поставил все доступные патчи с http://forum.sysman.ru ну и судя по всему помогло. во всяком случае этот метод у хацкера больше не сработал. ура!

Ссылка на комментарий
Поделиться на других сайтах

  • 0

выяснив, что взлом всё же не связан с модом InV-Firewall Script 1.0.0 имеет ли мне смысл его вернуть?

прозвучало замечание о том, что в коде не мало багов. так ли это?

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

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Но мой метод проверки айпишника мне нравится больше. :D

можно обосновать?

Прост и понятен. Пройдет только 4 числа через точку. Если хоть один символ не цифра - не пройдет.

Не ресурсоемкими ненадежными регулярками, а простыми как шпала explode и intval.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
FatCat, регулярные выражения не ненадежны, они просто часто сложны для понимания. Если уметь ими пользоваться, можно леко обеспечить и высокую безопасность, и высокую производительность. Вообще, имхо, знание regexp-ов - большой плюс в анкету любому вебразработчику.
Ссылка на комментарий
Поделиться на других сайтах

  • 0
FatCat, регулярные выражения не ненадежны

Простой пример. 2 кода делают одно и то же: создают массив содержимого контейнеров.

1.

preg_match_all("/<span class='my_class'>(.*?)<\/span>/is",$text,$keys);

2.

$keys =explode("<span class='my_class'>",$text);
unset($keys[0]);
for($i=0;$i<count($keys);$i++)$keys[$i] = substr($keys[$i],0,strpos($keys[$i],"</span>"));

Дальше запись в файл:

foreach($keys as $key)
{
$fh = fopen('output.txt', "a");
flock($fh,2);
fwrite($fh, PHP_EOL.$key);
flock($fh,3);
fclose($fh);
}

На выходе имеем файл с ключами построчно.

Оба кода работают идентично... при простой обработке текста.

Запускаю многопотоковый парсинг большого сайта, и... то файл с кашей, то апач вылетает на регулярках, и отличный файл и минимум загрузки процессора на сабстрингах.

 

Регулярки - для ленивых программистов, или для заведомо ненагрузочных заданий.

 

 

Вообще, имхо, знание regexp-ов - большой плюс в анкету любому вебразработчику.

Несомненно.

Но знание недостатков регулярок и умение использовать более эргономичные процедуры - второй плюс.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

1) Код под цифрой 1 делает не то же самое, что и код под цифрой 2

2) Код под цифрой 1 кушает в разы меньше памяти, чем код 2

3) Поместить fopen внутрь foreach в данном случае - форменное насилие над сервером в грубой форме, особенно в случае с многопоточностью =)

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Поместить fopen внутрь foreach в данном случае - форменное насилие над сервером в грубой форме

Несомненно. И в реальной работе я так не делаю.

Это просто модель, которую каждый может легко сделать и посмотреть.

http://phpforum.ru/index.php?showtopic=19249 - вот подробное описание тестов производительности. Задача: перелинковка страницы топика в форуме.

Изменено пользователем FatCat
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Решил себя попробовать в оптимизации)))

 

Для начала написал свою регулярку:

$pattern = '{<span\s+class="my_class"\s*>((?:(?:(?!<span[^>]*>|</span>).)++|<span[^>]*>(?1)</span>)*)</span>}i';
$matchcount = preg_match_all($pattern, $text, $matches);
$file = fopen('output.txt', "a");
flock($file, LOCK_EX);
for($it=0; $it<$matchcount; $it++) fwrite($file, PHP_EOL.$matches[1][$it]);
fclose($file);

 

Что сделано:

а) учтены вложенные <span> теги,

б) учтены теги в РАЗНОМ рЕгИсТрЕ,

в) медленный foreach заменен на более быстрый for

г) разблокирование через flock не нужно, т.к. дублируется внутри вызова fclose

д) вынес fopen и блокировку за пределы цикла

 

Возьмем два скрипта. Начало у обоих одинаковое:

<?php
$t1 = microtime(true);
$m1 = memory_get_usage();
$text = <<<CODE
Роман «Война и мир» получил большой успех. Отрывок из романа под названием «1805 год» появился в «Русском вестнике» 1865 г.; в 1868 г. вышли три его части, за которыми вскоре последовали остальные две (<SPAN class="my_class">всего четыре тома</SPAN>).

Признанный <SPAN CLASS="my_class">критикой</SPAN> всего мира величайшим <span class="my_class">эпическим произведением</span> новой европейской литературы, «Война и мир» поражает уже с чисто технической точки зрения размерами своего беллетристического полотна. Только в живописи можно найти некоторую параллель в огромных картинах Паоло Веронезе в венецианском Дворце дожей, где тоже сотни лиц выписаны с удивительною отчётливостью и индивидуальным выражением. В романе Толстого представлены все классы общества, от императоров и королей до последнего солдата, все возрасты, все темпераменты и на пространстве целого царствования Александра I. Что еще более возвышает его достоинство как эпоса — это данная им психология русского народа. <span class="my_class">С поражающим проникновением</span> изобразил Толстой настроения толпы, как высокие, так и самые низменные и зверские (например, в знаменитой сцене убийства Верещагина).

Везде Толстой старается схватить стихийное, <SPAN CLASS="my_class">бессознательное</span> начало человеческой жизни. Вся философия романа сводится к тому, что успех и неуспех в исторической жизни зависит не от воли и талантов отдельных людей, а от того, насколько они отражают в своей деятельности стихийную подкладку исторических событий. Отсюда его любовное отношение к Кутузову, сильному не стратегическими знаниями и не геройством, а тем, что он понял тот чисто русский, не эффектный и не яркий, но единственно верный путь, которым можно было справиться с Наполеоном. Отсюда же и нелюбовь Толстого к Наполеону, так высоко ценившему свои личные таланты; отсюда, наконец, возведение на степень величайшего мудреца скромнейшего солдатика Платона Каратаева за то, что он сознает себя исключительно частью целого, без малейших притязаний на индивидуальное значение. Философская <SPAN CLASS="my_class">или</SPAN>, вернее, историософическая мысль Толстого большей частью проникает его великий роман — и этим-то он и велик — не в виде рассуждений, а в гениально схваченных подробностях и цельных картинах, истинный смысл которых нетрудно понять всякому вдумчивому читателю.

В первом издании «Войны и мира» был длинный ряд чисто теоретических страниц, мешавших цельности художественного впечатления; в позднейших изданиях эти рассуждения были выделены и составили особую часть. Тем не менее, в «Войне и мире» Толстой-мыслитель <span class="my_class">отразился далеко не весь</span> и не самыми характерными своими сторонами. Нет здесь того, что проходит красною нитью через все произведения Толстого, как писанные до «Войны и мира», так и позднейшие — <SPAN CLASS="my_class">нет <span>глубоко</span></SPAN> пессимистического настроения. И в «Войне и мире» есть ужасы и смерть, но здесь они какие-то, если можно так выразиться, нормальные. Смерть, например, князя Болконского принадлежит к самым потрясающим страницам всемирной литературы, но в ней нет ничего разочаровывающего и принижающего; это не то, что <SPAN CLASS="my_class">смерть <SPAN>гусара</SPAN> в</SPAN> «Холстомере» или смерть Ивана Ильича. После «Войны и мира» читателю хочется жить, потому что даже обычное, среднее, серенькое существование озарено тем ярким, радостным светом, который озарял личное существование автора в эпоху создания великого романа.

В позднейших произведениях Толстого <span class="my_class">превращение изящной</span>, грациозно кокетливой, обаятельной Наташи в расплывшуюся, неряшливо одетую, всецело ушедшую в заботы о доме и детях помещицу производило бы грустное впечатление; но в эпоху своего наслаждения семейным счастьем Толстой все это возвёл в перл создания.

Позже Толстой скептически относился к своим романам. В январе 1871 года Толстой отправил Фету письмо: «Как я счастлив,.. что писать <span class="my_class">дребедени многословной</span> вроде „Войны“ я больше никогда не стану».

6.12.1908 года Толстой записал в дневнике: «Люди любят меня за те пустяки — „Война и мир“ и т. п., которые им кажутся очень важными».

Летом 1909 года один из посетителей Ясной Поляны выражал свой восторг и благодарность за создание «Войны и мира» и «Анны Карениной». Толстой ответил: «Это всё равно, что к Эдисону кто-нибудь пришёл и сказал бы: „Я очень уважаю вас за то, что вы хорошо танцуете мазурку“. Я приписываю значение совсем другим своим книгам.»

<SpAn ClAsS="mY_ClAsS">Nya!</sPaN>
CODE;

 

А вот два продолжения и результата работы:

1. regexp

$pattern = '{<span\s+class="my_class"\s*>((?:(?:(?!<span[^>]*>|</span>).)++|<span[^>]*>(?1)</span>)*)</span>}i';
$matchcount = preg_match_all($pattern, $text, $matches);
$file = fopen('output.txt', "a");
flock($file, LOCK_EX);
for($it=0; $it<$matchcount; $it++) fwrite($file, PHP_EOL.$matches[1][$it]);
fclose($file);
$t2 = microtime(true);
$m2 = memory_get_usage();
echo $t2-$t1;
echo " ";
echo $m2-$m1;
?>

 

2. explode vs substr

$keys =explode('<span class="my_class">',$text);
unset($keys[0]);
for($i=0;$i<count($keys);$i++)$keys[$i] = substr($keys[$i],0,strpos($keys[$i],"</span>"));

foreach($keys as $key)
{
$fh = fopen('output.txt', "a");
flock($fh,2);
fwrite($fh, PHP_EOL.$key);
flock($fh,3);
fclose($fh);
}

$t2 = microtime(true);
$m2 = memory_get_usage();
echo $t2-$t1;
echo " ";
echo $m2-$m1;
?>

 

Результаты работы:

1. regexp

time: 0.00041604042053223

memory: 18848

output:

всего четыре тома
критикой
эпическим произведением
С поражающим проникновением
бессознательное
или
отразился далеко не весь
нет <span>глубоко</span>
смерть <SPAN>гусара</SPAN> в
превращение изящной
дребедени многословной
Nya!

2. explode vs substr:

time: 0.00061798095703125

memory: 12272

output:

эпическим произведением
С поражающим проникновением
отразился далеко не весь
превращение изящной
дребедени многословной

 

Усложним эксперимент. Для начала уберем разницу в результатах вывода скрипта (уберем все нестандартные и вложенные теги из текста на входе, чтобы выравнять теоретические использование памяти на хранение/запись результатов) и будем наращивать данные на входе:

 

1) оригинальный текст с тегами только в нижнем регистре и без вложенных:

1. regexp:: 0.00017499923706055 14192

2. explode vs substr: 0.00054597854614258 12600

 

2) при помощи Ctrl+C & Ctrl+V увеличим текст так, что получим файл test.php весом в 1 Мб. Результаты замера таковы:

1. regexp: 0.011566162109375 1480008

2. explode vs substr: 0.021740198135376 1256112

 

3) 5 Мб текста:

1. regexp: 0.055512189865112 7361336

2. explode vs substr: 0.14691686630249 6256440

 

Выводы сделайте сами. Одно ясно - не все так однозначно и прямо уж сильно заметной разницы между методами работы нет)

 

Пришла мысль - а что если операции открытия файла тормозят скрипт? Переделал тест с 5 Мб теста с таким кодом:

$keys =explode('<span class="my_class">',$text);
unset($keys[0]);
for($i=0;$i<count($keys);$i++)$keys[$i] = substr($keys[$i],0,strpos($keys[$i],"</span>"));
$matchcount=sizeof($keys);
$file = fopen('output.txt', "a");
flock($file, LOCK_EX);
for($it=0; $it<$matchcount; $it++) fwrite($file, PHP_EOL.$keys[$it]);
fclose($file);

И точно, результат вышел:

explode vs substr: 0.036555051803589 6256520

 

Разницы почти и нет) Так о чем спорить? =)

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Одно ясно - не все так однозначно и прямо уж сильно заметной разницы между методами работы нет)

А вот такой алгоритм потестируете?

$key = array();
$temp_el = 0;
$in_tag = 0;
$text0 = "";
while($text)
{
// Где я нахожусь?
if( substr(strtolower($text0),-23)=="<span class='my_class'>" ) /* Вошли в тег */ $in_tag++;
if( substr(strtolower($text),0,7)=="</span>" ) /* Вышли из тега */ 
{
	$in_tag--;
	$temp_el++;
}

// Внутри тегов, заполняем элемент массива
if($in_tag>0)$key[$temp_el] .= substr($text,0,1);

$text0 .= substr($text,0,1);
$text = substr($text,1);
}
$text = $text0;

Сделал регистронезависимость; поленился делать учет вложенности тегов, оно не сложно: просто добавить условия для $in_tag больше единицы. :D

 

По моим тестам этот алгоритм оказался и самым быстрым, и самым ресурсоемким. Именно на нем сделал и перелинковку в классе display, и сравнение двух текстов.

Изменено пользователем FatCat
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Хмммм...

Ваша регулярка:

time: 0.0140659809113

memory: 8632

 

Мой код с substr:

time: 2.20148396492

memory: 13496

 

Что-то странное. Или я где-то с кодом навалял...

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Хмммм...

Ваша регулярка:

time: 0.0140659809113

memory: 8632

 

Мой код с substr:

time: 2.20148396492

memory: 13496

 

FatCat, это вы не о вашем варианте в 100-ом посте? а то я ваш вариант использую сейчас.

 

Я бы предложил ее заменить на:
function fetch_ip()
Ссылка на комментарий
Поделиться на других сайтах

  • 0
AEC, извините, что ввели вас в заблуждение, нет это он не о вашем. Мы уже давно отошли от темы и разговариваем о глубоко абстрактных и нереальных вещах, о самодельных тестовых скриптах и всем таком =)
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Понял где навалял. strtolower - медленная функция, и безумием было ее загонять в цикл.

Надо было делать копию текста в нижнем регистре и уже по нему бродить с включенным счетчиком, фиксировать моменты начала и конца каждого контейнера, чтобы потом из исходного текста посредством substr выдернуть.

В моих экспериментах с "чистым" substr парсинг текста по времени сопоставим со временем чтения файла с винчестера: по 20-40 Мб текста в секунду парсит.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Помогите чем сможете.

 

Сегодня пришло от хоста

 

Ваш аккаунт был заблокирован за привешенные Выделенных для него ресурсов(согласно договору 5%CPU, 32mb ОЗУ и 30с. на исполнения скриптов).

 

Top Process %CPU 50.0 /usr/php4/bin/php /home/softfan/public_html/forum/index.php

Top Process %CPU 43.0

Top Process %CPU 35.0 [php]

 

Можем Вам сказать, что файл /home/softfan/public_html/forum/index.php вызывает нагрузку, но какой именно из его скриптов мы не можем сказать.

Пожалуйста, устраните неполадки и мы откроем сайт.

 

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

Ссылка на комментарий
Поделиться на других сайтах

  • 0

sahno,

 

А) В случае, если проблема действительно в ваших скриптах, у вас три варианта:

 

1) лицензия (если нет) + запрос техподдержке,

2) фрилансер со стороны,

3) самостоятельно откатиться до чистой версии форума без модов.

 

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

 

Б) Есть и другие возможные причины произошедшего:

 

1) активность поисковых ботов,

2) DDoS-атака на ваш форум,

3) значительно возросшая популярность ресурса.

 

Чтобы проверить эти версии, нужно проанализировать логи доступа к сайту, логи ошибок (если есть) в папке /cache/*.cgi. Для каждой из причин есть свое решение, так же как есть и общее решение на все три случая - смена тарифного плана/хостера =)

Ссылка на комментарий
Поделиться на других сайтах

  • 0

 

лучше подправить в коде, и пусть поисковые боты посещают: они в общем не должны мешать работе, в чем-то даже помогут.

Я дал айпишники не поисковых ботов, а самых злобных парсеров, выявленных на моих серврерах за последние 10 дней.

 

ОК, держите простенькую заплатку:

sources\classes\class_session.php

Найти:

function update_guest_session()
	{
и добавить ниже:
if(($this->time_now - $this->last_click) < 5)$this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'server_too_busy', 'INIT' => 1 ) );
Вместо цифры "5" можно попробовать другие цифры. Чем больше цифра, тем меньше нагрузка на сервер, но тем больше гостей будет получать предупреждение при быстром листании страниц:

Сервер не может в данное время выполнить ваш запрос. Попробуйте позже.

Зарегистрированных пользователей и известных поисковых ботов этот мод не затронет.

 

В версии 3.4.5 нету такова файла sources\classes\class_session.php

подскажите пожалуста решение! Тоже задолбали боты форум

Заранее жму руку

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Файл теперь лежит в admin\sources\classes\session\publicSessions.php . Но он довольно сильно изменился.

Попробуйте поставить задержку при сканировании через robots.txt

Crawl-delay: 5

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Файл теперь лежит в admin\sources\classes\session\publicSessions.php . Но он довольно сильно изменился.

 

В любом случае есть функция поддерживающая гостевые сессии. То есть, то, что нам нужно: написанный нами код будет выполняться только для гостей, и не будет выполняться у авторизованных пользователей.

 

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

 

 

Если подходить серьезно, то нужно полностью переписывать алгоритм поддержки сессий, в ИПБ он сделан отвратительно.

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

Во-вторых, нужно сделать привязку всех сессий к айпишнику; чтобы с другого айпишника нельзя было ввалиться в чужую сессию. Это же вечная дыра в безопасности ИПБ.

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

 

И лишь решив эти проблемы, мы получим достоверные сессии, и сможем регулировать допустимую нагрузку.

  • Лайк 1
Ссылка на комментарий
Поделиться на других сайтах

  • 0

 

Файл теперь лежит в admin\sources\classes\session\publicSessions.php . Но он довольно сильно изменился.

 

В любом случае есть функция поддерживающая гостевые сессии. То есть, то, что нам нужно: написанный нами код будет выполняться только для гостей, и не будет выполняться у авторизованных пользователей.

 

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

 

 

Если подходить серьезно, то нужно полностью переписывать алгоритм поддержки сессий, в ИПБ он сделан отвратительно.

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

Во-вторых, нужно сделать привязку всех сессий к айпишнику; чтобы с другого айпишника нельзя было ввалиться в чужую сессию. Это же вечная дыра в безопасности ИПБ.

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

 

И лишь решив эти проблемы, мы получим достоверные сессии, и сможем регулировать допустимую нагрузку.

 

Могу ли я попросить Вас возобнавить доступ к роботс как в етом посте или может есть уже новый?

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.