Перейти к контенту
  • 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 . Но он довольно сильно изменился.

 

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

 

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

 

 

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

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

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

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

 

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

 

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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

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

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

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

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

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

Зарузка...

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

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

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