כיצד להגדיל את החיבורים המקבילים ב- Apache

היום אני בא לדבר איתך פעם נוספת על אחד משירותי האינטרנט הנפוצים ביותר בעולם: שרת האינטרנט Apache2.

זה נושא שכבר דיברו עליו פעמים רבות, אבל עכשיו אני בא לספר לך על תכונה אחרת שיש לקחת בחשבון עם שירות זה: גבול החיבורים בו זמנית. לא משנה אם יש לנו בסיסית מאוד או חללית עם מעבד i7 ו -32 GB של זיכרון RAM ...

הגבול של חיבורים סימולטניים תמיד יהיה זהה אלא אם ננקוט בצעדים המתאימים, כלומר אם אנו רוצים שיהיו הרבה אנשים מחוברים בו זמנית, לא נצטרך רק חומרה טובה, אלא גם תצורה טובה.

במקרה זה אין צורך להתקין דבר, הכל מבוסס על מושגים פשוטים שיש לקחת בחשבון כדי להגדיר את האפצ'י; מושגים שחייבים להיות ברורים מאוד לפני שרוצים לבצע שינויים כלשהם.

apache2_logo

הדבר הראשון שיש לחשוב עליו הוא: איזה יכולת יש לצוות שלי? בכמה חיבורים סימולטניים הציוד שלי יכול לתמוך אם אני מכריח אותו כמה שיותר? כל זה תלוי בגורם יחיד; זיכרון RAM (זיכרון גישה אקראית).

ככל שה- RAM גדול יותר, כך מספר החיבורים גדול יותר, למרות שאין ערך קבוע (כלומר X לקוחות לכל X RAM), לכן קודם כל חשוב לעשות כמה חישובים קטנים בשרת האינטרנט שלנו, עם כדי לדעת את הגבולות שלנו.

הדבר הראשון שעליך לדעת הוא כמה RAM בממוצע צורך כל חיבור לאפאצ'י, מכיוון שכל חיבור שנוצר מניח צריכה מסוימת של זיכרון RAM במערכת ... ברור שלא כל החיבורים צורכים את אותו זיכרון RAM, איתו צריך לעשות מדיה ... כל זה ניתן להשיג באמצעות הפקודה הבאה:

ps -ylC apache2 --ort: rss | awk '{SUM + = $ 8; I + = 1} סיים {הדפס SUM / I / 1024} '

התוצאה המתקבלת תוצג במגה-בייט ועשויה להשתנות בהתאם למספר החיבורים הפעילים, לסוג העמודים שנכנסים אליהם וכו '... מסיבה זו רצוי לבצע את הבדיקה עם כרטיסיות שונות פתוחות; כל אחד מהם מציג תוכן שונה במידת האפשר. במקרה שלי, למשל, התוצאה הייתה 9.5458, שאם נעגל אותה למעלה תהיה 10 MB זיכרון RAM נצרך בממוצע לחיבור.

חשוב גם לדעת כמה RAM נצרך על ידי שאר התהליכים הפעילים במערכת, מכיוון ששירות האינטרנט אינו היחיד שפועל במערכת ההפעלה ויש צורך להשאיר זיכרון RAM פנוי על שרת כך שהוא יכול לבצע את שאר המשימות. ניתן להשיג זאת באמצעות הפקודה המוצגת להלן:

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

התוצאה המתקבלת תוצג גם במגה-בייט, והיא תראה לנו בדיוק את כמות ה- RAM הנצרך על ידי שאר התהליכים; במקרה שלי 800 MB. בעזרת מידע זה נוכל לבצע חישוב כללי של מספר החיבורים בו זמנית שיכולים להיות לנו; אני מחשב שהיינו משיגים באמצעות פעולה פשוטה מאוד.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

עם נוסחה זו ביד, בואו נדמיין שיש לנו מחשב עם 4 ג'יגה בייט זיכרון RAM, כלומר 4096 מגה בייט ושהמחשב שלנו הראה את התוצאות האמורות לעיל; החישוב יהיה:

(4096 - 800) / 10 = 329 חיבורים בו זמנית

הבעיה בחישוב זה היא שאחד הוא קיצוני מדי, מכיוון שהוא היה צורך את כל ה- RAM (מה שהופך את השרת לצרוך החלפה) וגם, במקרה של מסד נתונים, כגון MySQL או כל אחר, גם החיבורים אליו היו צורכים זיכרון RAM, כך שהמספר שהושג יכול להיות מוסמך כמספר אוטופי. לכן, על מנת לפנות את הזיכרון לתהליכים נוספים אפשריים ולבחון את האפשרות שמבוצעים חיבורים למסד נתונים, נצמצם את מספר החיבורים ל 250.

עכשיו שיש לנו את המספר המרבי של חיבורים בו זמנית, נצטרך להכין את אפאצ'י לקבל את המספר הזה, מה שמתבצע בקובץ התצורה של שיחה זו apache2.conf, שמתארח ב / etc / apache2.

הקובץ הנדון עוקב אחר מבנה המבוסס על מודולים, כל אחד ושמו המקביל, אך אנו מעוניינים רק באחד מהם, ששמו הוא  mpm_prefork_module. המודול המדובר מכיל את הנתונים הבאים כברירת מחדל:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 Max בקשות PerChild 0

למודול זה יש סדרה של פרמטרים חשובים מאוד, אם כי יש אחד מהם שיעניין אותנו במיוחד Maxclients. פרמטר זה מציין את המספר המרבי של חיבורים בו זמנית ויש לשנותו ל 250.

פרט אחד שיש לקחת בחשבון הוא שכאשר מוגדר בפרמטר האמור ערך אחר שאינו ברירת המחדל, יש צורך להוסיף עוד ערך בדיוק לפני זה. פרמטר זה נקרא ServerLimit וקובע את מגבלת החיבורים שהשרת יכול "להחזיק" גם כשהוא מחוץ למגבלה.

הפרמטר ServerLimit תמיד צריך להיות מעט גבוה יותר מה- MaxClients וכאן, מכיוון שיש מעט מקום לתמרון, מגבלה של 270. זה יגרום למודול להיראות כך:

StartServers 5 MinSpareServer 5 MaxSpareServers 10 ServerLimit 270 MaxClient 250 Max בקשות PerChild 0

כעת יהיה צורך רק להפעיל מחדש את שירות אפאצ'י באמצעות הפקודה: 

/etc/init.d/apache2 הפעלה מחדש

בכך כבר יכולנו ליהנות משרת האינטרנט המותאם שלנו.

ברכות.


תוכן המאמר עומד בעקרונותינו של אתיקה עריכתית. כדי לדווח על שגיאה לחץ כאן.

21 תגובות, השאר את שלך

השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.

  1.   זטטינו דיג'ו

    תודה על הפוסט!

    1.    דראסיל דיג'ו

      אני שמח שמצאת את זה מועיל.

      ברכות.

  2.   מיגל אנחל דיג'ו

    יש דרך לקבץ אפאצ'י ושני שרתים, האם אתה יכול להסביר איך זה עובד?

    1.    דראסיל דיג'ו

      למרות שקראתי תיאוריה כלשהי על כך, מעולם לא יישמתי אותה לתרגול. למרות זאת, אולי מאמר זה יכול לתת לך הנחיות בעניין זה, אם כי אני חוזר ואומר שלא הייתה לי ההזדמנות להוציא אותו לפועל:

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

    2.    אדוארדו ג'ליל דיג'ו

      שאלת זמן רב, אם לא פתרת; יש לי תוכנית איזון עם צד שלישי הפועל כמערכת קבצים, אתה מכוון את התיקיות שנמצאות ב- var / www / html / (במקרה שלי) למערכת הקבצים, כך שהם חולקים את אותו מידע, ואולי אתה דרוש ip וירטואלי שמגיב ומנתב ל- ips של apaches, בשביל זה אתה יכול לכבוש haproxy ואם אתה רוצה את זה בזמינות גבוהה אתה יכול לשלב keepalive במקרה שאחד נופל, השני ממשיך להגיב, או גם אם כבר יש לך דומיין ליישום, אתה יכול לאזן עם ביצוע של קילו אחורי לשני השרתים, למקרים ספציפיים כגון מצב רוח או יישומים מסוימים שמתחברים למסד נתונים ב- mysql, יהיה עליך ליצור משתמש לכל שרת אפליקציה שמצביע על אותו מסד נתונים .

  3.   שאמרו דיג'ו

    תודה רבה לך על ההודעה, אתה צודק לחלוטין, האיל הוא החישוב העיקרי, אם כי אני מתאר לעצמי שאנחנו מחשבים גם את מספר התהליכים המקסימלי שהמעבד שלנו יכול להתמודד איתו (כמובן, קודם תחשיב את הזיכרון הראשי) ואיך הדיסק יופץ קשה (דוגמת מחיצות / var = 1TR).

    1.    דראסיל דיג'ו

      אתה צודק; הכל חשוב, כמו בקרת טמפרטורה בין היתר. ברור שמעבד חזק יכול לבצע מספר רב יותר של משימות בו זמנית ביעילות רבה, אך מטרת הפוסט הזה הייתה להסביר את החשיבות של זיכרון RAM ביחס למספר החיבורים בו זמנית.

      דרך טובה לשלוט בכל הגורמים הללו ולראות אם המעבד שלנו אינו רווי או שיש לנו מעט זיכרון RAM פנוי, תהיה באמצעות סקריפט bash. אולי הפוסט הזה שעשיתי לפני כמה ימים עליו יהיה מעניין עבורכם, אותו אני משאיר לכם בקישור הבא; זה ניטור עולמי אבל זה יכול להיות מעניין עבור מישהו:

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

      לגבי

  4.   סרחיו ס דיג'ו

    הערה טובה מאוד, תודה רבה!

    1.    דראסיל דיג'ו

      תודה רבה! אני מקווה שהצלחת לנצל את זה.

  5.   לֵיצָן דיג'ו

    אני לא רוצה להיות מטומטם ...
    ... אך על ידי הגדלת מספר החיבורים אינך משאיר פגיע יותר להתקפת DDoS?

    1.    דראסיל דיג'ו

      זו לא שאלה של קריטינה שקטה. האמת היא שעל ידי הגדלת מספר החיבורים הסימולטניים אנו מחזקים חלקית את אפאצ'י כנגד התקפות DDOS, מכיוון שעליך לקחת בחשבון שמספר החיבורים הסימולטניים המקסימליים שהוקמו בשרת הוא מספר החיבורים המרביים הכולל, ולא אלה שמגיעים משתמש יחיד. לפיכך, בעוד שבהתחלה היינו יכולים לתמוך רק ב -150 חיבורים סימולטניים (בין אם מדובר בחיבורים ממקור לגיטימי ובין אם לא), כעת אנו יכולים לסמוך על מספר רב ככל שתומך השרת שלנו, ודורש מספר רב יותר של חיבורים בו זמנית להיות בלי שֵׁרוּת. ברור שהגדלת המספר המרבי של חיבורים אינה דרך להגן על עצמך מפני התקפות מסוג זה, אלא יהיה עליך ליישם מדיניות חומת אש. אם, למשל, שירות האינטרנט שאתה מעוניין להיחשף לאינטרנט, אמצעי אבטחה שיכול להיות מיושם יהיה תוספת של שורות אלה לחומת האש שלנו:

      iptables -A INPUT -p tcp –syn –port 80 -m connectlimit -connlimit-up to 10-state state - מדינה חדשה -j קבלה

      iptables -A INPUT -p tcp -port 80 -m state-state ESTABLISHED, RELATED -j ACCEPT

      iptables -A INPUT -p tcp -port 80 -j DROP

      1.    ליצן דיג'ו

        אחד המאפיינים של התקפות DDoS הוא שתוקף יכול להיראות שולח מנות מכמה כיוונים שונים, מה שמונע מהזרם של מנות להגיע רק מכיוון אחד.

    2.    דראסיל דיג'ו

      אתה צודק במובן זה שחומת אש כמו זו שהקמתי אינה יעילה במיוחד כנגד התקפת DDOS, מכיוון שהיא מגיעה ממקורות שונים. ובכל זאת, עדיף להגביל את מספר החיבורים ל- 10 עבור כל אחד ממקורות אלה במקום שלא יהיה מגבלה, מה שמאפשר לכל מקור ליצור מאות חיבורים או יותר.

      בכל מקרה, ערכת השאלה היא שככל שהשרת תומך בחיבורים סימולטניים יותר, כך יהיה קשה יותר להפיל אותו במתקפת DDOS, מה שיקשה על הוצאת הדף על ידי תוקף. .

      ברכות.

  6.   אליוטיים 3000 דיג'ו

    טוֹב. לעת עתה אני ממשיך עם NGINX באתר שלי כדי לא לענות את ה- VPS שיש לי.

  7.   ברונו קסיו דיג'ו

    פוסט טוב @ דראסיל!

    רציתי לתרום עם משהו אולי יותר סטטיסטי מאשר תצורה.
    למרות שהדרך הקלה והמהירה ביותר לחשב את פרמטר הצריכה היא עם הממוצע, אולי נוכל להיות קפדניים יותר ולהשתמש ב"חציון "במקום ב"ממוצע". מה יציל אותנו? שהמספרים יעלו למקרה שחיבור גוזל זיכרון רב. לדוגמה, נניח שהלקוחות הבאים צורכים את הערכים הבאים ביחידת הזיכרון שהם רוצים (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, בעוד שהממוצע עשוי להגיע ל …….

    זו רק תרומה, והיא מאוד ניתנת לדיון, כי עם הקשרים זה לא דפוק.

    לחבק אנשים לינוקסרה 🙂

  8.   קרלוס דיג'ו

    שלום, נתקלתי בבעיה בשרת הייעודי שלי, ובכל פעם שמספרם של כ -250 אנשים מקוונים מתקרב, על פי נתוני google analytics בזמן אמת, השרת שלי כאילו מתמוטט והחיבור הופך איטי עד שהוא מוריד את החיבור. לאתר ולעולם לא מעלה יותר ממספר המשתמשים הזה באופן מקוון, אבל כשאני רואה את הביצועים של השרת הייעודי שהוא RAM 8GB הוא מראה 10% מהשימוש, המעבד: 5% מהשימוש והדיסק הקשיח: 1.99% בשימוש.
    אתה יכול לעזור לי? אני לא מוצא מה לעשות, האם הצעדים האלה הם הפיתרון?

    1.    דראסיל דיג'ו

      קרלוס טוב.

      הבעיה שאתה מתאר נפוצה מאוד כאשר השרת אינו מוכן כראוי. השרת שלך כנראה יקבל מספר קטן בהרבה של חיבורים סימולטניים וכשהוא יגיע ל -250 חיבורים הוא יתרסק. על ידי ביצוע המדריך אתה אמור להיות מסוגל לפתור את הבעיה, אם כי אם יש לך מסד נתונים בשרת זה, יהיה עליך גם לייעל את מסד הנתונים הזה.

      ברכות.

      1.    קרלוס דיג'ו

        Drassill, ביצעתי את התצורה שציינת והיא הייתה מספקת, אתמול הגעתי ל 280 משתמשים ברשת והשרת לא נתלה, אני מאוד מרוצה מהתוצאה הזו, ואני גם רוצה לעשות את הדבר השני שאתה אומר לי כדי לייעל את מסד הנתונים, ¿כיצד אוכל להשיג זאת?

    2.    דראסיל דיג'ו

      תפיסת מסד הנתונים פתוחה למדי; השימוש ב- mysql אינו זהה ל- postgres (למשל). ברור שאני לא מכיר את כל מאגרי המידע; ניסיתי את mysql ו- postgres, והגידול של החיבורים הסימולטניים בהם יתבסס על הפרמטרים max חיבורים; אופטימיזציה של mysql תיעשה ב- /etc/my.conf ויהיה צורך לשנות את פרמטר החיבורים המקסימליים (בין היתר). במקום זאת, יש לי מאמר בבלוג שלי שמסביר כיצד לייעל אותו שעשוי להיות שימושי עבורך או שתוכל להשתמש בו כהפניה למסד הנתונים שלך:

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

      ברכות.

  9.   אריקסון ווסקז דיג'ו

    שלום, כשאני זורק את הפקודה הראשונה, זה מראה לי ערך 0. מה זה יכול להיות?

  10.   דניאל אוז'דה דיג'ו

    תודה על הפוסט הזה.