Як збільшити паралельні з'єднання в Apache

Сьогодні я ще раз поговорю з вами про одну з найбільш часто використовуваних веб-служб у світі: веб-сервер Apache2.

Це тема, про яку вже неодноразово говорили, але тепер я прийшов розповісти вам про ще одну особливість, яку слід врахувати за допомогою цієї послуги: Межа одночасних з'єднань. Неважливо, чи є у нас дуже базовий або космічний корабель з процесором i7 і 32 ГБ оперативної пам'яті ...

Межа одночасних з'єднань завжди буде однаковою, якщо ми не вживемо відповідних заходів, а це означає, що якщо ми хочемо мати багато людей одночасно підключеними, нам буде потрібно не тільки гарне обладнання, але і хороша конфігурація.

В цьому випадку не потрібно нічого встановлювати, все базується на простих концепціях, які необхідно враховувати для налаштування apache; концепції, які повинні бути дуже чіткими, перш ніж хотіти внести будь-які зміни.

apache2_logo

Перше, про що слід подумати, це: Яким потенціалом володіє моя команда? Скільки одночасних з'єднань може підтримувати моє обладнання, якщо я змушую його якомога більше? Все це залежить від одного фактора; Оперативна пам’ять (оперативна пам’ять).

Чим більше оперативної пам'яті, тим більша кількість з'єднань, хоча не існує фіксованого значення (тобто X клієнтів для кожного X оперативної пам'яті), тому перш за все важливо зробити кілька невеликих обчислень на нашому веб-сервері, з щоб знати наші межі.

Перше, що ви повинні знати, це те, скільки в середньому споживає оперативної пам'яті кожне підключення до Apache, оскільки кожне встановлене підключення передбачає певне споживання оперативної пам'яті в системі ... Очевидно, не всі з'єднання споживають один і той же оперативний диск, з яким потрібно було media ... Все це можна отримати за допомогою такої команди:

ps -ylC apache2 --sort: rss | awk '{SUM + = 8 $; I + = 1} END {print SUM / I / 1024} '

Отриманий результат буде представлений у мегабайтах і може варіюватися в залежності від кількості активних з'єднань, типу сторінок, до яких здійснюється доступ тощо. Тому доцільно проводити тест із відкритими різними вкладками; кожен з них, якщо це можливо, показує різний зміст. Наприклад, у моєму випадку результат склав 9.5458, що, якщо округлити його до вершини, буде 10 MB Оперативна пам’ять споживається в середньому на підключення.

Важливо також знати, скільки оперативної пам'яті споживають інші процеси, які активні в системі, оскільки веб-служба не єдина, яка працює в операційній системі, і необхідно залишити вільну пам'ять оперативної пам'яті на сервері, щоб вона могла виконати решта завдань. Це можна отримати за допомогою наведеної нижче команди:

ps -N -ylC apache2 --sort: rss | awk '{SUM + = $ 8} END {print SUM / 1024}'

Отриманий результат також буде представлений у мегабайтах, і він покаже нам досить точно обсяг оперативної пам'яті, споживаної рештою процесами; в моєму випадку 800 MB. За допомогою цієї інформації ми могли б зробити загальний розрахунок кількості одночасних з'єднань, які ми могли б мати; Я підрахував, що ми отримали б за допомогою дуже простої операції.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

Маючи на увазі цю формулу, уявімо, що у нас є комп’ютер з 4 ГБ оперативної пам’яті, тобто 4096 МБ, і що наш комп’ютер показав вищезазначені результати; розрахунок буде таким:

(4096 - 800) / 10 = 329 одночасних з'єднань

Проблема цього обчислення полягає в тому, що одна занадто екстремальна, оскільки вона споживає всю оперативну пам'ять (змушуючи сервер споживати обмін), а також, у разі наявності бази даних, такої як MySQL або будь-яка інша, з'єднання з нею також споживають оперативну пам'ять , тому отримане число можна було кваліфікувати як утопічне число. Тому, щоб звільнити пам’ять для можливих додаткових процесів, а також врахувати можливість виконання з’єднань з базою даних, ми зменшимо кількість підключень до 250.

Тепер, коли ми маємо максимальну кількість одночасних з'єднань, нам доведеться підготувати Apache до отримання цього номера, що робиться у файлі конфігурації цього виклику apache2.conf, який розміщений у / etc / apache2.

Файл, про який йде мова, має структуру, засновану на модулі, кожен із відповідним ім’ям, але нас зацікавив би лише один із них, ім’я якого -  mpm_prefork_module. За замовчуванням розглянутий модуль має такі дані:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

Цей модуль має ряд дуже важливих параметрів, хоча є один із них, який би нас особливо зацікавив, називається MaxClients. Цей параметр визначає максимальну кількість одночасних з'єднань і повинен бути змінений на 250.

Однією деталлю, яку слід взяти до уваги, є те, що коли в зазначеному параметрі вказано значення, відмінне від типового, потрібно додати ще одне, просто ДО цього. Цей параметр викликається ServerLimit і встановлює ліміт з'єднань, які сервер міг би "утримувати", навіть коли він знаходиться поза межею.

Параметр ServerLimit завжди повинен бути трохи вище, ніж MaxClients, і тут, оскільки є мало місця для маневру, обмеження 270. Це зробить модуль таким:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 270 MaxClients 250 MaxRequestsPerChild 0

Тепер потрібно було б лише перезапустити службу Apache за допомогою команди: 

/etc/init.d/apache2 перезавантаження

Завдяки цьому ми вже могли насолоджуватися нашим оптимізованим веб-сервером.

Привіт.


22 коментарі, залиште свій

Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   зетатіно - сказав він

    Дякую за допис!

    1.    Драссилл - сказав він

      Я рада, що Ви знайшли це корисним

      Привіт.

  2.   Мікеланджело - сказав він

    Існує спосіб кластеризації Apache та двох серверів, чи можете ви пояснити, як це працює?

    1.    Драссилл - сказав він

      Хоча я прочитав деяку теорію про це, я ніколи не застосовував її на практиці. І все-таки, можливо, ця стаття може дати вам деякі вказівки з цього приводу, хоча я повторюю, що я не мав можливості застосувати це на практиці:

      http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/

    2.    Едуардо Джаліл - сказав він

      ви просили деякий час, якщо не вирішили; У мене є схема балансування з третьою стороною, яка діє як файлова система, ви спрямовуєте папки, що знаходяться у var / www / html / (у моєму випадку) до файлової системи, щоб вони мали однакову інформацію, і вам, можливо, знадобиться віртуальний ip, який відповідає і перенаправити на ips апашів, для цього ви можете зайняти haproxy, і якщо ви хочете, щоб він був у високій доступності, ви можете інтегрувати keepalive на випадок, якщо один впаде, інший продовжить відповідати, а також якщо у вас вже є домен для програми, ви можете балансувати з фунтом роблячи бекенди для обох серверів, для конкретних випадків, таких як moodle або певні додатки, які підключаються до бази даних у mysql, вам доведеться створити користувача для кожного сервера додатків, який вказує на ту саму базу даних.

  3.   шамару - сказав він

    Щиро дякую за пост, ви абсолютно праві, оперативна пам'ять - це основне обчислення, хоча, я думаю, ми також обчислюємо максимальну кількість процесів, які може обробляти наш процесор (звичайно, спочатку робимо обчислення основної пам'яті) і як розподілятиметься диск жорсткий (Приклад розділів / var = 1TR).

    1.    Драссилл - сказав він

      Ти маєш рацію; все важливо, як, зокрема, контроль температури. Очевидно, що потужний процесор може виконувати більшу кількість завдань одночасно з великою ефективністю, але метою цього допису було пояснити важливість оперативної пам'яті щодо кількості одночасних з'єднань.

      Хорошим способом контролювати всі ці фактори і перевірити, чи не насичений наш процесор чи мало вільної оперативної пам'яті, було б використання скрипта bash. Вам може здатися цікавим це повідомлення, яке я зробив кілька днів тому, і я залишаю вас у такому посиланні; Це глобальний моніторинг, але може бути цікавим для одного:

      http://bytelearning.blogspot.com.es/2015/07/controlando-la-salud-del-equipo-con-bash.html

      привіт

  4.   Серхіо С. - сказав він

    Дуже гарна нотатка, велике спасибі!

    1.    Драссилл - сказав він

      Дуже дякую! Сподіваюся, ви змогли цим скористатися.

  5.   клоун - сказав він

    Я не хочу бути придурком ...
    ... Але збільшуючи кількість з’єднань, ви не робите вразливішими до DDoS-атаки?

    1.    Драссилл - сказав він

      Це не тихе кретинове питання. Правда полягає в тому, що, збільшуючи кількість одночасних з'єднань, ми частково укріплюємо Apache проти DDOS-атак, оскільки ви повинні враховувати, що кількість максимальних одночасних з'єднань, встановлених на сервері, це кількість загальних максимальних з'єднань, а не тих, що надходять від одного користувача. Таким чином, хоча на початку ми могли підтримувати лише 150 одночасних з’єднань (незалежно від того, чи це зв’язки із законного джерела чи ні), тепер ми можемо розраховувати на стільки, скільки підтримує наш сервер, вимагаючи більшої кількості підключень одночасно, щоб бути без обслуговування. Очевидно, що збільшення максимальної кількості з'єднань не є способом захисту від такого типу атак, але навпаки, слід застосовувати політику брандмауера. Наприклад, якщо веб-служба, яку ви хочете розмістити, буде піддана Інтернету, мірою безпеки, яку можна було б застосувати, було б додавання цих рядків до нашого брандмауера:

      iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-up to 10 -m state –state NEW -j ACCEPT

      iptables -A INPUT -p tcp –dport 80 -m state –state ВСТАНОВЛЕНО, ПОВ'ЯЗАНО -j ПРИЙНЯТО

      iptables -A INPUT -p tcp –dport 80 -j DROP

      1.    клоун - сказав він

        Однією з характеристик DDoS-атак є те, що зловмисник може надсилати пакети з кількох різних напрямків, що запобігає надходженню потоку пакетів лише з одного напрямку.

    2.    Драссилл - сказав він

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

      У будь-якому випадку, набір питань полягає в тому, що чим більше одночасних з'єднань підтримує сервер, тим складніше буде збити його DDOS-атакою, що ускладнить збивання сторінки зловмисником.

      Привіт.

  6.   eliotime3000 - сказав він

    Добре. Наразі я продовжую роботу з NGINX на своєму сайті, щоб не катувати VPS, який у мене є.

  7.   Бруно Касьо - сказав він

    Гарний пост @Drassill!

    Я хотів внести щось, можливо, більше статистичне, ніж конфігурація.
    Хоча найпростіший і найшвидший спосіб обчислити параметр споживання - із середнім значенням, можливо, ми могли б бути більш суворими і використовувати “медіану” замість “середню”. Що б нас врятувало? Що номери зникають на випадок, якщо з’єднання зайняло багато пам’яті. Наприклад, припустимо, що такі клієнти споживають такі значення в одиниці пам’яті, яку вони хочуть (KB, MB, MiB тощо):

    10, 15, 150, 5, 7, 10, 11, 12

    Середнє значення дало б приблизно ~ 30

    І це тому, що у нас дуже великий кінець (150), і розрахунки шалені. Медіана складається з упорядкування цих даних, ділення кількості зразків на 2 (наш центр) і отримання числа цієї позиції. З цим ми мали б щось подібне

    5, 7, 10, 10, 11, 12, 15, 150

    Отже, наше середнє значення буде: 8/2 = 4, тобто ~ 10

    Тут ви бачите, що яким би шаленим не був екстрим, він завжди дасть нам більш реалістичне значення. Якщо додати клієнта, який споживає 200, наша медіана буде 11, тоді як середнє значення може сягати …….

    Це лише внесок, і це дуже дискусійно, тому що при з'єднаннях він не закручений.

    Обійміть людей linuxera 🙂

  8.   Карлос - сказав він

    Привіт, у мене виникла проблема на моєму виділеному сервері, і це полягає в тому, що кожного разу, коли підходить число приблизно 250 людей в Інтернеті, згідно з аналітикою Google в режимі реального часу, мій сервер, як він руйнується, і з’єднання стає повільним, поки не впаде підключення до веб-сайту і ніколи не завантажує більше тієї кількості користувачів в Інтернеті, але коли я бачу продуктивність виділеного сервера, який становить 8 Гб оперативної пам'яті, це показує 10% використання, процесор: 5% використання та жорсткий диск за: 1.99 % використання.
    Можеш допомогти мені? Я не можу знайти, що робити, чи є рішення цим кроком?

    1.    Драссилл - сказав він

      Хороший Карлос.

      Проблема, яку ви описуєте, дуже поширена, коли сервер не підготовлений належним чином. Ваш сервер, ймовірно, прийме набагато меншу кількість одночасних з'єднань, і коли він досягне 250 з'єднань, він вийде з ладу. Дотримуючись інструкції, ви зможете вирішити проблему, хоча якщо у вас є база даних на цьому сервері, вам також доведеться її оптимізувати.

      Привіт.

      1.    Карлос - сказав він

        Drassill, я зробив конфігурацію, про яку ти згадав, і вона була задовільною, вчора я охопив 280 користувачів в Інтернеті, і сервер не зависав, я дуже задоволений цим результатом, і я також хочу зробити іншу справу, яку ти мені скажеш, для оптимізації бази даних ¿ Як мені цього досягти?

    2.    Драссилл - сказав він

      Концепція бази даних досить відкрита; використання mysql - це не те саме, що postgres (наприклад). Очевидно, я не знаю всіх баз даних; Я пробував mysql та postgres, і збільшення одночасних з'єднань у них базувалося б на параметрі max з'єднання; оптимізація mysql буде здійснена в /etc/my.conf, а параметр max з'єднання повинен бути змінений (серед іншого) Натомість для postgres у моєму щоденнику є стаття, яка пояснює, як оптимізувати його, що може бути корисним для вас, або що ви можете використовувати його як посилання для вашої бази даних:

      http://bytelearning.blogspot.com.es/2016/02/postgresql-una-alternativa-mysql-en.html

      Привіт.

  9.   Еріксон Васкес - сказав він

    Привіт, коли я кидаю першу команду, вона показує мені значення 0. Що це може бути?

  10.   Даніель Охеда - сказав він

    Дякую за цей допис.

  11.   Роландо Агілера Салазар - сказав він

    Який хороший посібник, ця інформація є частиною того, що я шукаю... дякую!

    Але тепер, якщо я хочу, щоб після перевищення цих 250 відвідувачів відвідувач 251 перейшов на сторінку очікування або віртуальну чергу, чи можу я зробити це з тієї самої конфігурації?

    Вітаю та дякую!