דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. Load balance עם NGINX + PM2

Load balance עם NGINX + PM2

מתוזמן נעוץ נעול הועבר תכנות
21 פוסטים 6 כותבים 362 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • מנצפךמ מנותק
    מנצפךמ מנותק
    מנצפך
    כתב ב נערך לאחרונה על ידי מנצפך
    #1

    מה הדרך הנכונה לעשות loadbalance עם PM2 ו NGINX?

    אני יודע שב pm2 יש דבר שנקרא cluster mode
    שזה בעצם מריץ את אותו תהליך (של nodejs) כמה פעמים (על כל CPU) ע"י שימוש ביכולת cluster של nodejs
    ואיך שאני מבין (עוד לא בדקתי מספיק), כל התהליכים יכולים להאזין לאותו פורט.

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

    זה נותן גם יכולת חשובה ב PM2 שנקראת reload, שהתהליך NodeJS עושה restart מבלי להפיל אף resuest באמצע.

    לחילופין, ניתן להריץ ב Pm2 כמה פעמים את אותו התהליך, על פורטים נפרדים. ולהגדיר ב nginx את ה - load balance (יש שם כמה אפשרויות לזה).

    בהנחה שאני צודק בהנחותי, באיזה דרך מומלץ להשתמש?
    אשמח להמלצות ולתיקונים.

    nigunN תגובה 1 תגובה אחרונה
    1
    • nigunN מנותק
      nigunN מנותק
      nigun
      השיב למנצפך ב נערך לאחרונה על ידי nigun
      #2

      @מנצפך
      רק כדי לעשות סדר ולראות אם הבנתי נכון.
      אתה רוצה לבנות nginx עם %100 זמניות.
      אז לכן אתה רוצה ליצור לצורך העניין 4 תהליכים מקבילים של nginx
      שיאזינו לאותו פורט (איך זה יכול להיות?) או בפורטים שונים ולהעביר את התעבורה עם עוד nginx שיעביר את התעבורה לשרתים האחוריים.
      וכך אם אתה צריך לבצע שינוי בnginx אתה יכול לשלוח SIGINT במקום kill ובהנחה שnginx מבצע graceful stop כשהוא מקבל SIGINT, אתה תקבל 100% זמינות.
      אבל רק שים לב שתצטרך לעשות את הreload לתהליך השני רק אחרי הוא נגמר בראשון, כי לכאורה nginx מפסיק לקבל בקשות אחרי SIGINT, וגם לשים לב למשתנה kill_timeout בPM2 , כי אם הוא מוגדר על המתנה קצרה הוא ישלח kill אחרי כמה שניות שSIGINT לא מגיב ואם יש לך בקשה ארוכה הוא יפול.

      מייל: nigun@duck.com

      מנצפךמ dovidD 2 תגובות תגובה אחרונה
      1
      • מנצפךמ מנותק
        מנצפךמ מנותק
        מנצפך
        השיב לnigun ב נערך לאחרונה על ידי מנצפך
        #3

        @nigun
        לא הובנתי נכון.

        ה nginx רץ בתהליך אחד כרגיל.
        הנושא הוא רק להריץ את התהליך Nodejs של השרת שלי כמה פעמים.
        או להשתמש ב cluster mode (שבעצם pm2 אמור לדעת להפעיל אותו לבד, אם הגדרתי)

        שרת, אין כוונתי למכונה, אלא לתהליך.

        תגובה 1 תגובה אחרונה
        2
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          השיב לnigun ב נערך לאחרונה על ידי dovid
          #4

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

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          nigunN מנצפךמ 2 תגובות תגובה אחרונה
          2
          • nigunN מנותק
            nigunN מנותק
            nigun
            השיב לdovid ב נערך לאחרונה על ידי
            #5

            @dovid אמר בLoad balance עם NGINX + PM2:

            בתנאי שאתה סוגר את התהליך בkill עדין, אני לא בטוח בזה.

            kill עדין? מה זה?

            מייל: nigun@duck.com

            תגובה 1 תגובה אחרונה
            0
            • מנצפךמ מנותק
              מנצפךמ מנותק
              מנצפך
              השיב לdovid ב נערך לאחרונה על ידי
              #6

              @dovid אתה מתכוון ריסטרט לnginx עצמו? (כגון בשינוי הגדרות) או לתהליך ש nginx מנתב אליו?

              תגובה 1 תגובה אחרונה
              0
              • Men770M מנותק
                Men770M מנותק
                Men770
                כתב ב נערך לאחרונה על ידי
                #7

                טעינת ההגדרות מחדש נעשית כך:

                sudo systemctl nginx reload
                

                או בWindows:

                ./nginx reload
                

                יחי המלך!

                יחי אדוננו מורנו ורבינו מלך המשיח לעולם ועד!

                מנצפךמ תגובה 1 תגובה אחרונה
                1
                • מנצפךמ מנותק
                  מנצפךמ מנותק
                  מנצפך
                  השיב לMen770 ב נערך לאחרונה על ידי
                  #8

                  @men770
                  השאלה לא היתה איך טוענים מחדש, אלא לאיזה טעינה הוא התכוון.

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

                   nginx -s reload
                  
                  dovidD 2 תגובות תגובה אחרונה
                  3
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    השיב למנצפך ב נערך לאחרונה על ידי
                    #9

                    @מנצפך אני מתכוון לתהליך של נוד.

                    @nigun בkill יש כמה סוגים, יש בקשת סגירה בה נדמה לי הserver מטפל ומחכה לסגירת החיבורים ואז מודיע על סגירתו ואז הנוד משחרר את עצמו ונסגר, ויש את kill 9 שלא נותן ליישום בכלל זמן להתארגן, אני לא יודע פרטים מדוייקים.

                    @Men770 המילים יחי המלך הם לגיטמיים בחתימה ולא בהודעה עצמה, והם אכן כבר מופיעים בחתימה. מה הרעיון לכפול? אנא הימנע מכך.

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    nigunN תגובה 1 תגובה אחרונה
                    4
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      השיב למנצפך ב נערך לאחרונה על ידי
                      #10

                      @מנצפך הreload ש@Men770 עושה בדיוק את אותה פעולה, זה אותה פקודה בדרך מודרנית יותר (זה לא restart כמו שנראה במבט ראשון).

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      1
                      • nigunN מנותק
                        nigunN מנותק
                        nigun
                        השיב לdovid ב נערך לאחרונה על ידי nigun
                        #11

                        @dovid אמר בLoad balance עם NGINX + PM2:

                        @nigun בkill יש כמה סוגים, יש בקשת סגירה בה נדמה לי הserver מטפל ומחכה לסגירת החיבורים ואז מודיע על סגירתו ואז הנוד משחרר את עצמו ונסגר, ויש את kill 9 שלא נותן ליישום בכלל זמן להתארגן, אני לא יודע פרטים מדוייקים.

                        חיפשתי על זה קצת
                        יש הבדל בין פקודת kill שנועד לשלוח את כל סוגי הסיגנאלים לתהליך
                        לבין SIGKILL שזה הסיגנאל למערכת הפעלה להרוג את התהליך מבחוץ, ואם רוצים לשלוח את SIGKILL עם שורת הפקודה צריך לשלוח kill -9.
                        לחלופין אם רוצים לשלוח SIGINT צריך לשלוח kill -2 וכן הלאה, אפשר לראות כאן עוד אפשרויות.
                        מקור

                        מייל: nigun@duck.com

                        מנצפךמ תגובה 1 תגובה אחרונה
                        3
                        • מנצפךמ מנותק
                          מנצפךמ מנותק
                          מנצפך
                          השיב לnigun ב נערך לאחרונה על ידי
                          #12

                          לגבי Clusster ב PM2
                          אני לא מבין מה הדרך שהוא גורם לכל המופעים להאזין לכל הפורטים?
                          יש למישהו הסבר?
                          (עדיין לא הצלחתי להוכיח שבאמת כולם מאזינים וה Reload עובד כראוי)

                          א תגובה 1 תגובה אחרונה
                          0
                          • א מנותק
                            א מנותק
                            אהרן
                            השיב למנצפך ב נערך לאחרונה על ידי
                            #13

                            @מנצפך אמר בLoad balance עם NGINX + PM2:

                            אני לא מבין מה הדרך שהוא גורם לכל המופעים להאזין לכל הפורטים?

                            מה חסר לך בהסבר הזה?

                            @dovid אמר בLoad balance עם NGINX + PM2:

                            כולם תהליכי משנה שלו והם מקבלים לעבודה בקשות שהמסטר קיבל

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

                            מנצפךמ תגובה 1 תגובה אחרונה
                            0
                            • מנצפךמ מנותק
                              מנצפךמ מנותק
                              מנצפך
                              השיב לאהרן ב נערך לאחרונה על ידי
                              #14

                              @אהרן
                              אבל התהליך צריך להאזין לאיזשהו פורט.
                              אני פשוט לא מכיר את התמיכה של nodejs ב cluster
                              אבל לא חשבתי שזה מאפשר לכולם לרוץ על אותו פורט.

                              אעשה עוד בדיקות

                              א תגובה 1 תגובה אחרונה
                              1
                              • א מנותק
                                א מנותק
                                אהרן
                                השיב למנצפך ב נערך לאחרונה על ידי
                                #15

                                למה אתה חושב ש:
                                @מנצפך אמר בLoad balance עם NGINX + PM2:

                                אבל התהליך צריך להאזין לאיזשהו פורט.

                                מחייב
                                @מנצפך אמר בLoad balance עם NGINX + PM2:

                                זה מאפשר לכולם לרוץ על אותו פורט.

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

                                מנצפךמ תגובה 1 תגובה אחרונה
                                0
                                • מנצפךמ מנותק
                                  מנצפךמ מנותק
                                  מנצפך
                                  השיב לאהרן ב נערך לאחרונה על ידי
                                  #16

                                  בהמשך ל cluster- מי עושה את הloadbalance כשאני משתמש ב cluster של NodeJS?

                                  כלומר, האם יש לי שליטה על החלוקה בין תהליכי המשנה?
                                  כי הרצון שלי הוא שלא יהיה עומס של RAM ו CPU על אף תהליך.

                                  yossizY תגובה 1 תגובה אחרונה
                                  0
                                  • yossizY מנותק
                                    yossizY מנותק
                                    yossiz
                                    השיב למנצפך ב נערך לאחרונה על ידי
                                    #17

                                    @מנצפך אמר בLoad balance עם NGINX + PM2:

                                    עומס של RAM

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

                                    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                    dovidD תגובה 1 תגובה אחרונה
                                    2
                                    • dovidD מנותק
                                      dovidD מנותק
                                      dovid ניהול
                                      השיב לyossiz ב נערך לאחרונה על ידי dovid
                                      #18

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

                                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                      מנצפךמ תגובה 1 תגובה אחרונה
                                      3
                                      • מנצפךמ מנותק
                                        מנצפךמ מנותק
                                        מנצפך
                                        השיב לdovid ב נערך לאחרונה על ידי
                                        #19

                                        לסיכום:
                                        בשביל PM2 צריך לעשות כך:
                                        אין צורך לשנות את הקוד . יש רק להריץ את התהליך ב cluster mode.
                                        בשביל לבצע reload ללא חשש של נפילה של בקשות חשובות באמצע (כגון ביצוע עיסקאות, או עדכונים במסד נתונים), יש להאזין ל SIGINT, ברגע שאני מקבל SIGINT, אני סוגר את השרת (את התהליך הנוכחי) לקבלת בקשות חדשות, (ע"י מתודת close), וממילא NodeJs יעביר את הבקשות לשרת השני.
                                        חשוב להגדיר ל PM2 את הזמן לביצוע kill לאחר ה SIGINT, כי הזמן הדפולטיבי ייתכן שלא יספיק. (לכאורה אין בעיה לעשות KILL גם לאחר עשרות שניות).
                                        במידה ואכן מבצעים עדכונים ל DB או שמבצעים שאילתות חשובות החוצה (כנ"ל), אולי כדאי להגדיר Flag גלובלי, שמראה מתי מחכים לתשובה, ולבצע timer כל עוד שהוא למעלה, ברגע שהוא למטה, אפשר לסגור את התהליך ב process.exit

                                        אשמח לחוו"ד

                                        מנצפךמ תגובה 1 תגובה אחרונה
                                        3
                                        • מנצפךמ מנותק
                                          מנצפךמ מנותק
                                          מנצפך
                                          השיב למנצפך ב נערך לאחרונה על ידי
                                          #20

                                          בשביל לסגור את השרת מבלי לאבד בקשות קיימות, יש להשתמש פשוט ב:

                                            server.close(err => {
                                                  console.log('Closed. ', err);
                                                  process.exit(0);
                                              })
                                          
                                          

                                          זה מחזיר callbcak ברגע שכל הבקשות הסתיימו והוחזרו. ובקשות חדשות לא מתקבלות ברגע שעושים close

                                          מנצפךמ תגובה 1 תגובה אחרונה
                                          2

                                          • 1
                                          • 2
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום