שאלה למה אני צריך Nginx ומשהו כמו Gunicorn?


אני מחפש תשובה פשוטה מדי לשאלה הבאה. אני מנסה לבנות הבנה בסיסית של איך Nginx עובד לצד משהו כמו Gunicorn.

האם אני צריך שניהם Nginx ומשהו כמו Gunicorn לפרוס Apps Django על Nginx?

אם כן, מה בעצם מטפל בבקשות ה- HTTP?

Ps. אני לא רוצה להשתמש Apache ו mod_wsgi!


182
2017-11-15 21:16




Apache ו mod_wsgi היא הדרך הפשוטה ביותר ליישם את הגשר בין יישום django שלך בקשות HTTP כי הוא גם מסוגל מאוד בסביבת הייצור. עבור מפתחים רבים, משמעות הדבר היא ש- Apache עדיף על nginx אם הם עשו זאת, אבל כמו 'betamax עדיף על VHS', אבוי, הכללים של Dogma - MagicLAMP


תשובות:


פשוטה מדי: אתה צריך משהו שמבצע Python אבל Python הוא לא הטוב ביותר בטיפול בכל סוגי הבקשות.

[כתב ויתור: אני מפתח Gunicorn]

פחות פשוטה: לא משנה איזה שרת אפליקציות אתה משתמש (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy) כל סוג של פריסה לא טריוויאלי יהיה משהו במעלה כי יטפל בבקשות כי App Django שלך לא צריך להיות טיפול. דוגמאות טריוויאליות לבקשות כאלו הן הצגת נכסים סטטיים (תמונות / css / js).

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

מבחינה היסטורית, כל אלה שכבות יהיה מתארח על מכונות נפרדות (והיה סביר להניח להיות מספר מכונות בשתי שכבות הראשונות, כלומר: 5 שרתי אינטרנט לשלוח בקשות לשני שרתי יישומים אשר בתורו שאילתה מסד נתונים אחד).

בעידן המודרני יש לנו עכשיו יישומים של כל הצורות והגדלים. לא כל פרויקט סוף שבוע או אתר עסקים קטנים באמת צריך את כוח סוס של מכונות מרובות יפעל די בשמחה על תיבה אחת. זה הוליד ערכים חדשים לתוך מערך של פתרונות אירוח. פתרונות מסוימים יתחתנו עם שרת האפליקציה לשרת האינטרנט (Apache httpd + mod_wsgi, Nginx + mod_uwsgi וכו '). וזה בכלל לא נדיר לארח את מסד הנתונים על אותה מכונה כמו אחד אלה שילובים שרת אינטרנט / App.

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

ההפרדה מאפשרת גם Gunicorn להיות כתוב בפייתון טהור אשר ממזער את עלות הפיתוח תוך לא משפיע באופן משמעותי על הביצועים. זה גם מאפשר למשתמשים את היכולת להשתמש proxies אחרים (בהנחה שהם חיץ כראוי).

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

אז בסגירה, כן. אתה צריך גם Nginx ו Gunicorn (או משהו דומה) עבור הפריסה Django הנכון. אם אתה מסתכל במיוחד כדי לארח את Django עם Nginx, אז הייתי לחקור Gunicorn, mod_uwsgi, ואולי CherryPy כמועמדים הצד של Django דברים.


268
2017-11-15 21:49



תודה שהקדשת מזמנך לכתוב תשובה מפורטת שכזו! כל קריאה מומלצת על "אדריכלות 3 שכבת" זו? - a.m.
תשובה מצוינת, אבל אני לא מבין את הבעיה עם לקוחות איטיים. - Mads Skjern
@MadsSkjern אני מנחש כאן, אבל אם אתה מניח שכל הלקוחות הם מהירים, אז אתה יכול להשתמש בבריכה קבועה של תהליכי עובד, ולא צריך קוד עבור המקרה שבו רבים או כולם חסומים מחכה ללקוח. - Jonathan Hartley
@m. en.wikipedia.org/wiki/Multitier_architecture - Jonathan Hartley
האפליקציה django שלי משמש רק json שום תוכן סטטי אני יכול פשוט ללכת עם gunicorn ולא nginx - Sar009


אהבתי את ההסבר הזה בפשטותו:

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

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

The outside world <-> Nginx <-> The socket <-> Gunicorn

https://gist.github.com/Atem18/4696071


20
2017-12-13 07:52



זה לא צריך להיות ארובות, רק למקרה שאחרים תוהים. - akshay


אני מחפש תשובה פשוטה מדי ...

האם אני צריך שניהם Nginx ומשהו כמו Gunicorn לפרוס Apps Django על Nginx?

אם כן, מה בעצם מטפל בבקשות ה- HTTP?

תשובה פשוטה מדי:

כן.

שניהם Nginx ו Gunicorn.

מאז אתה פורס על Nginx, כמובן שאתה צריך Nginx.

מאז אתה פריסת ג 'יאנגו, המהווה מסגרת אינטרנט, אתה צריך משהו גישור השיחה בין שרת האינטרנט (Nginx) ואת מסגרת האינטרנט (Django). בעולם Python, דבר כזה נקרא שרת WSGI (אבל חושב שזה כמו כלי ביניים), דוגמאות של אשר כולל Gunicorn ו uWSGI. בעת טיפול בבקשה, Nginx proxies את הבקשה Gunicorn או uWSGI, אשר בתורו קורא קוד Django ומחזירה את התגובה.

מסמך זה ואת התשובה של פול יעזור לך ללמוד את זה טוב יותר.


0
2017-10-26 21:42