- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Добрый день. Нуждаюсь в совете.
Имеется - VPS - 1 ядро CPU, 1ГБ ОЗУ, 20 Гб SSD диск. Посещаемость сайтов - 10-15 уников в сутки.
Сегодня в очередной раз пришла смс от ping-admin о недоступности сервера. Упал Mysql - в связи с созданием огромного количества процессов apache.
Что происходит - по логам nginx - на сервер приходит какой-то робот, и начинает усиленно качать все страницы сайта. В секунду получается 40-60 запросов к apache. Из-за нехватки памяти - убивается Mysql.
Решил попробовать ограничить кол-во запросов с одного IP. В nginx есть специальный модуль - ngx_http_limit_req_module
Почитал мануал, в принципе все понятно, кроме нескольких моментов.
Дописав в секцию http конфига nginx следующий фрагмент:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_req zone=one burst=15;
limit_req_status 503;
Вопрос №1 и самый важный - правильно ли я мыслю, выбрав такой вариант борьбы с ботами?
Вопрос №2 - насколько я понимаю - ограничение сработает для всех типов запрашиваемых документов (в т.ч. и статика). Как можно применить это правило только для динамического контента?
Вопрос №3 - достаточно ли написать фрагмент вышеуказанного кода в секцию http, и не дописывать в каждую секцию server (на VPS крутится около 20 сайтов)?
Буду благодарен за любые советы и подсказки.
Я борюсь пока так /ru/forum/comment/13743376
Думаю поставить это http://habrahabr.ru/post/139931/
Сколько ОЗУ на сервере?
Сколько ОЗУ на сервере?
Прошу прощения, поправил первый пост...
на сервере 1 Гб ОЗУ
Вопрос №2 - насколько я понимаю - ограничение сработает для всех типов запрашиваемых документов (в т.ч. и статика). Как можно применить это правило только для динамического контента?
В вашем примере - будет распространяться и и на статику.
Если нужно тормознуть только вызов апача, то для этого в секцию http пропишите только это:
А в секцию location / каждого виртуальго хоста добавить это:
И тогда это правило будет применяться только для динамики в указанных виртуальных хостах.
Прошу прощения, поправил первый пост...
на сервере 1 Гб ОЗУ
Что за скрипт? ОС? покажите кто-что грузит больше всего при нагрузках бд. Таблицы InnoDB или MyISAM?
top
ТС может все же не давать серверу плодить апачи чрезмерно много, тогда и база отваливаться не будет ;)
В вашем примере - будет распространяться и и на статику.
Если нужно тормознуть только вызов апача, то для этого в секцию http пропишите только это:
А в секцию location / каждого виртуальго хоста добавить это:
И тогда это правило будет применяться только для динамики в указанных виртуальных хостах.
Спасибо за ответ. У меня возник только 1 вопрос - обязательно ли для каждой локации прописывать вручную
limit_req zone=one burst=15
или достаточно прописать это в секцию - http? Понимаю, что маловероятно, но как говорится, а вдруг? :)
Что за скрипт? ОС? покажите кто-что грузит больше всего при нагрузках бд. Таблицы InnoDB или MyISAM?
top
Без шаловливого робота ВПС-ка держит нагрузку на отлично. ЛА не выше 0,1. Тут проблема именно в создании огромного кол-ва запросов от робота за единицу времени - в моем случае это 40-60 запросов/сек, на протяжении 30-40 секунд, чего достаточно, чтобы положить apache :(
ТС может все же не давать серверу плодить апачи чрезмерно много, тогда и база отваливаться не будет ;)
Я как бы и спрашиваю совета - верно ли мое мышление, либо нужно плясать не в сторону настройки nginx, а в сторону к-ва дочерних процессов апача. К сожалению, опыта у меня не так много в этом вопросе.
http://nginx.org/ru/docs/http/ngx_http_limit_req_module.html#limit_req_zone
nano /etc/nginx/nginx.conf
---------- Добавлено 08.06.2015 в 17:11 ----------
nano /etc/apache2/apache2.conf
Проставить
MaxClients
Директива MaxClients устанавливает максимальное количество параллельных запросов, которые будет поддерживать сервер. Apache не будет порождать больше процессов/потоков чем MaxClients. Значение MaxClient не долно быть слишком маленьким (иначе много клиентов останутся необслуженными), но и не стоит устанавливать слишком большое количество - лучше не обслужить часть клиентов чем исчерпать все ресурсы, залезть в своп и умереть под нагрузкой. Хорошим может быть значение MaxClients = количество памяти выделенное под веб-сервер / максимальный размер порожденного процесса или потока. Для статических файлов apache использует около 2-3 Мб на процесс, для динамики (php, cgi) - зависит от скрипта, но обычно около 16-32 Мб.
Вы можете прикинуть примерный размер посмотрев на колонку rss в выводе `ps -ylC httpd --sort:rss`
Если сервер уже обслуживает MaxClients запросов, новые запросы попадут в очередь, размер которой устанавливается с помощью директивы ListenBacklog.
MinSpareServers, MaxSpareServers, и StartServers
Т.к. создание потока, и особенно процесса - дорогая операция, apache создает их заранее. Директивы MaxSpareServers и MinSpareServers устанавливают как много процессов/потоков должны ожидать в готовности принять запрос (максимум и минимум). Если значение MinSpareServers слишком маленькое и неожиданно приходит много запросов, apache вынужден будет создавать много новых процессов/потоков, что создаст дополнительную нагрузку в этой стрессовой ситуации. С другой стороны, если MaxSpareServers слишком велико, apache будет сильно нагружать систему этими процессами, даже если количество клиентов минимально.
Постарайтесь установить такие MinSpareServers и MaxSpareServers, чтобы apache не создавал более 4 процессов/потоков в секунду. Если он создаст более 4, в ErrorLog будет помещено сообщение об этом. Это - сигнал того что MinSpareServers слишком мало.
MaxRequestsPerChild
Директива MaxRequestsPerChild устанавливает сколько запросов может обработать один дочерний процесс/поток прежде чем он будет завершен. По умолчанию значение этой директивы установлено в 0, что означает что однажды созданный процесс/поток не будет завершен никогда (ну кроме случаев остановки сервера или краха этого процесса/потока). Рекомендую установить MaxRequestsPerChild равное какому-нибудь достаточно большому числу (несколько тысяч). Это не создаст излишней нагрузки, связаной с тем что apache будет вынужден создавать новые дочерние процессы, в то же время это поможет избавиться от проблем с утечкой памяти в дочерних процессах (что очень возможно например если вы используете нестабильную версию php).
KeepAlive и KeepAliveTimeout
KeepAlive позволяет делать несколько запросов в одном TCP-подключении. Это особенно полезно для html-страниц с большим количеством изображений. Если KeepAlive установлен в Off, то для самой страницы и для каждого изображения будет создано отдельное подключение (которое нужно будет обработать master-процессу), что плохо и для сервера и для клиента. Так что для подобных случаев рекомендуется устанавливать KeepAlive в On. Для других применений (например для download-сервера) KeepAlive может быть бесполезен и даже вреден, т.к. при включенном KeepAlive сервер закрывает соединение не сразу, а ждет KeepAliveTimeout секунд нового запроса. Для того чтобы процессы не висели слишком долго в бесполезном ожидании, устанавливайте KeepAliveTimeout достаточно малым, около 5-10 секунд обычно достаточно.
Вообще обсуждалось по-моему где-то уже ;)
или достаточно прописать это в секцию - http?
Если только в секцию http, то эта директива будет действовать и на статику. А ограничение в 15 может задеть нормальных юзеров с быстрым каналом(если много картинок, стилей и т.д.).
А если за одним ip сидит несколько человек, то кому то не повезет :)
Но если прописать в location / для каждого защищаемого хоста, то действовать будет на динамический контент и 15 запросов в секунду это более чем достаточно.
итог:
т.е. http -глобально на все, location / - только для конкретного локейшина.
ps
И еще умерьте аппетиты апач, как посоветовал kgtu5