תהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי
-
@dovid כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
עריכה: מיקרוסופט ממליצה על nginx כשרת פרוקסי עבור asp.net.
ברשותך אולי תרחיב על זה, כי אני לא מכיר בהקשר הזה את הנושא של פרוקסי. אני רגיל שהאנגולר פונה ישר לדונטנט בלי מתווכים למיניהם, אז בשביל מה צריך להכניס פה מישהו נוסף?
-
@צדיק-תמים כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
@yyy כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
שאלה נוספת: מה עדיף לאנגולר Apache או Nginx?
אנגולר אחרי build זה בעצם קבצים סטטיים (בעיקר טקסט, אולי גם כמה תמונות),
אני ממליץ על Caddy בגלל הקונפיגורציה שלו שהיא קלה ופשוטה בצורה מדהימה + נותן HTTPS אוטומטי באופן מובנה,
הפרומיל ביצועים שאולי תקבל יותר בnginx הוא לא משהו שרלוונטי לסדרי גודל שלך, וגם לא בטוח שהוא בכלל קיים.אשמור את המלצתך להמשך. כעת אני מעוניין להתנסות בכלים היותר סנטנדרטיים ומצויים.
-
@yyy כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
ברשותך אולי תרחיב על זה, כי אני לא מכיר בהקשר הזה את הנושא של פרוקסי. אני רגיל שהאנגולר פונה ישר לדונטנט בלי מתווכים למיניהם, אז בשביל מה צריך להכניס פה מישהו נוסף?
אתה שאלת אם apach או nginx.
בהקשר הזה (של תוכנה שרצה בעצמה כמו asp.ney או nodejs) הם מכונים שניהם פרוקסי הפוך.
עזוב את המינוח, סה"כ עניתי על שאלתך. -
חזרתי לאחר הפסקת מה.
האנגולר עובד הדוטנט רץ. מותקן openSsl.
אני מקבל את השגיאה הבאה כשאני מנסה ליצור תקשורת https
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
זה קשור לכך שלא מוגדר לי Kestrel ב-AppSetting.json אלא רק iis express?
תודה! -
אוקי אז הנה תקציר.
התקנתי nginx + קונפיגורציה והאנגולר עולה בלי צד שרת כמובן.
לאחר התקשקשות עם תאימות לגרסאות מיושנות של דוטנט, הגעתי לתובנה שעדיף פשוט לעבוד על גרסה שהיא "out of the box" (יש תרגום מקובל לעברית?).
העברתי את הפרוייקט לדוטנט 7 והפרוייקט רץ. בשביל הטסט יצרתי שני קונטרולרים, אחד מחזיר מספר מדוטנט עצמו ואחד מחזיר מה-DB.
ב-DB עצמו עוד לא נגעתי ואני מנסה לראות קודם שהתקשורת עם הדוטנט עובדת טוב.מה שקורה שכשאני מנסה לגשת לקונטרולר באמצעות tls/ssl (במילים אחרות https) מקבל את השגיאה הנ"ל.
דוגמא//with http ubuntu@vps-c2df8674:~$ curl http://localhost:5000/api/Numbers/GetNumbersFromDotnet 1 2 3 4 5 from dotnet //with https ubuntu@vps-c2df8674:~$ curl https://localhost:5000/api/Numbers/GetNumbersFromDotnet curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number //wrong ubuntu@vps-c2df8674:~$ curl --tlsv1 https://localhost:5000/api/Numbers/GetNumbersFromDotnet curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
שאלה נוספת:
האם curl הוא הכלי המקובל לנסיונות שכאלו (אין UI כמובן)?תודה רבה.
-
@yyy כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
מה שקורה שכשאני מנסה לגשת לקונטרולר באמצעות tls/ssl (במילים אחרות https) מקבל את השגיאה הנ"ל.
לפי המבואר פה זו השגיאה שמקבלים כאשר מנסים לגשת עם פרוטוקול TLS לשרת שמדבר HTTP פשוט
כדאי שתעתיק לפה את קונפיגרצית ה-nginx שלך -
@yyy כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
שכשאני מנסה לגשת לקונטרולר באמצעות tls/ssl
למה שיעבוד? ssl זה לא משהו שמגיע "כי למה לא".
תחבר את הnginx לasp כפי המדריך של מיקרוסופט,
את שכבת הSSL תוסיף בהמשך, מה בוער?
(יש לי חשד שבאנגולר אתה פונה לlocalhost:5000. זה טעות נפוצה אצל מפתחי אנגולר שהם לא מודעים כלל ליום שאחרי הפיתוח.
זה כמובן לא יעבוד, הרי הlocalhost לא יילך איתך למחשבי הגולשים.
מה שצריך לעשות תמיד זה או לפנות באנגולר לאותו דומיין (ע"י כתובת יחסית שמתחילה בלוכסן) או לדומיין אחר גם בעת הפיתוח.
איך זה יעבוד? הרי בזמן הפיתוח אתה עובד מול localhost? בשביל זה מגדירים בהגדרות הserve פרוקסי שאומר שכל כתובת שמתחילה בapi או כל כלל אחר, אנא נתב אותה נכון לשעת הפיתוח לlocalhost:5000). -
@yossiz
לא ידעתי ש-nginx מטפל גם בשרת, הכוונתי אותו רק לאנגולר.
הנה:ubuntu@vps-c2df8674:~$ cat /etc/nginx/sites-enabled/default server { listen 80; server_name 62.88.198.72; root /var/www/html; index index.html; location / { try_files $uri $uri/ /index.html; } }
@yossiz כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
לשרת שמדבר HTTP פשוט
מי הוא זה ואיזה הוא? אני לא התקנתי כלום בהקשר זה ברמת השרת.
-
@dovid כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
למה שיעבוד? ssl זה לא משהו שמגיע "כי למה לא".
כי אני רואה שיש באובונטו איזה שרת בסיסי שיודע "לדבר" עם הדוטנט שלי, למרות שלא נקפתי אצבע בעניין. כמובן איני בא לחלוק אלא להבהיר מהיכן טעותי.
תחבר את הnginx לasp כפי המדריך של מיקרוסופט,
את שכבת הSSL תוסיף בהמשך, מה בוער?אם אני לא אתעסק עם ה-ssl מה העניין לחבר את ה-Nginx? כמו שהראתי יש לי תקשורת לא ssl-ית.
@yyy כתב בתהליך העלאת מערכת fullstack מה-localhost לעולם האמיתי:
(יש לי חשד שבאנגולר אתה פונה לlocalhost:5000. זה טעות נפוצה אצל מפתחי אנגולר שהם לא מודעים כלל ליום שאחרי הפיתוח.
זה כמובן לא יעבוד, הרי הlocalhost לא יילך איתך למחשבי הגולשים.
מה שצריך לעשות תמיד זה או לפנות באנגולר לאותו דומיין (ע"י כתובת יחסית שמתחילה בלוכסן) או לדומיין אחר גם בעת הפיתוח.
איך זה יעבוד? הרי בזמן הפיתוח אתה עובד מול localhost? בשביל זה מגדירים בהגדרות הserve פרוקסי שאומר שכל כתובת שמתחילה בapi או כל כלל אחר, אנא נתב אותה נכון לשעת הפיתוח לlocalhost:5000).אני עדיין לא מתעסק אפילו בחיבור האנגולר לדוטנט, אני רוצה לראות שכל המרכיבים הרלוונטיים (DB,דוטנט,אנגולר) עובדים תקין ואח"כ לקנפג את החיבורים ביניהם. בכ"א אקח לתשומת ליבי את ההערה שלך להמשך.
-
מתעד את נסיונותי להפעיל SSL תקין באמצעות Kestrel. (אולי יעזור למישהו בעתיד)
הוספתי ב-launchSetting.json את הרשומה הבאה:"sslProd": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": false, "launchUrl": "swagger", "applicationUrl": "https://localhost:443", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Production" } }
dotnet publish +winsp
ועדיין כשאני מנסה לפנות באמצעות פורט 443 יש שגיאה:ubuntu@vps-c2df8674:~$ curl -I http://localhost:443/api/Numbers/GetNumbersFromDotnet curl: (7) Failed to connect to localhost port 443: Connection refused
ניסיתי עוד כמה פתרונות כמו זה
וכן שינוי משתנה הסביבהASPNETCORE_ENVIRONMENT
ל-sslProd או production, ושום דבר לא עוזר. ה-ssl מסרב לתקשר. אני מתיאש לע"ע מהכיוון הזה ואנסה לחבר את ה-nginx בתור רוורס פרוקסי (למדתי מה זה), ואולי הוא ידע להעיר מהתרדמת את תקשורת ה-ssl. -
@yyy כל ההגדרות שתעשה עד מחר לא ייתנו לך בחיים SSL,
SSL מקבלים על ידי חברה חיצונית שהיא גורם מוסמך והתעודה העליונה שלהן מכובדת ע"י הקליינטים.
ואני לא מבין למה אתה כה מתעקש ללכת בדרכים משלך במקום לעשות בתום מה שמדריכים אותך.
מה דחוף עכשיו SSL? למה אתה לא מגדיר את הNGINX כמו במדריך הרשמי של מקרוסופט? -
אם מהתחלה הייתי מרגיש שאתה "הולך אחרי" היית אחרי כל הסיפור הזה תוך יום אחד.
מתחיל הנושא אני מרגיש שאני מדבר עם מישהו ששואל אבל חושש/חשדן/ממש כל תשובה ומה שנקרא מנסה "להבין לבד".
יש בזה משהו חיובי אבל תבין שאין פה באמת דיון בריא, כשכותרת הנושא היא מה התהליך ובפועל זה בעצם בואו תעזרו לי להסתדר לבד. -
@yyy SSL אומר שהתעודה מוצפנת בפרוטוקול מסוים עם מה שנקרא תעודות, שמעידות שהתשובה שהדפדפן מקבל אכן מגיעה מהשרת של הדומיין tchumim.com ולא נפתחה/עברה טיפול בדרך.
אלא שכל אחד יכול להנפיק תעודה בשם כל דומיין שירצה, ולכן כמו שכתב @dovid חברה חיצונית (CA) מאשרת שהתעודה שלך תקפה, והוא אחראי בין השאר לוודא לפני הנפקת התעודה שאכן הדומיין מצביע על השרת, כלומר שהשרת מורשה לייצג את הדומיין, וככה אני לא יכול לייצר תעודה עבור tchumim.com, לשבת באמצע התעבורה, לחטט בה ולהצפין מחדש עם התעודה שלי, כיוון שהתעודה שלי לא מאושרת על ידי CA.לאור כל הנ"ל, לא אמור להיות לך SSL לכתובת שהיא localhost כלומר פנימית בשרת, ולכן גם אין כזה דבר https://localhost (מלבד תעודה בהנפקה עצמית לצורך פיתוח שלא רלוונטית לכאן).
התעודה נצרכת לצורך ניתוב החוצה ורק כאשר יש דומיין, הדרך הנפוצה היא להאזין בפורט רגיל, 80 או 3000 וכו', ולהשתמש במה שנקרא reverse-proxy כגון nginx/caddy, שיש לו כאן 2 מטרות:- לנתב את כל הבקשות שמגיעות לשרת בפורט 443 לפורט הפנימי 3000 - של האפליקציה עצמה (רק במידה והאפליקציה לא מאזינה ישירות בפורט 443)
- לדאוג לחלק של הHTTPS, כלומר לקחת את התשובה של השרת דוטנט שלך שמגיעה בלי הצפנה כמובן בפורט פנימי, ולעטוף אותה בפרוטוקול ההצפנה והתעודות שיבטיחו לדפדפן של הגולש שהתוכן מקורי ושלם
ישנן דרכים נוספות, כמו להאזין ישירות בפורט 443 עם האפליקציה ולתת לה לנהל את עניין הSSL בעצמה (סעיף 2) - שזה אולי מה שניסית אבל לא מקובל ומיותר, או להשתמש בSSL של Cloudflare - שזה בעצם ממש reverse-proxy כמו האחרים, רק שהוא קורא בשרת של קלאודפלייר במקום בשרת שלך.
כדאי לקרוא https://www.digicert.com/what-is-an-ssl-certificate
-
@dovid
קיבלתי. מעכשיו אני זורם איתך.
אני כעת מבצע את מה שכתוב כאן.
כעת יש לי תקשורת באמצעות הדפדפן המוגדרת ע"י קובץ ה-/etc/nginx/sites-available/default
הזה:server { listen 80; server_name 62.88.198.72; location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
השאלה כעת היא
איך משלבים את ההגדרות של האנגולר דלעיל באותו קובץ(?)? -
אז תשנה בהתאם את הקובץ הdefault:
server { listen 80; server_name 62.88.198.72; location /api { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { root /var/www/html; try_files $uri $uri/ /index.html; index index.html; } }