התקנת שרת Linux באינטרנט


כל הקוד שהוצג בוידאו מוסבר וזמין במאמר שבקישור:
https://www.tocode.co.il/blog/2018-07-server-setup-2

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

https://www.tocode.co.il/workshops/41

1. מה נשים על השרת שלנו

ההחלטה הראשונה לפני שמתקינים שרת היא מה לשים עליו. אנחנו נבחר לשים Web Application שנכתוב באמצעות תשתית Ruby On Rails.

אפליקציית ווב היא משהו שחייב להיות באוויר כל הזמן ולכן המקום הטבעי שלה הוא על שרת ברשת.

2. ארכיטקטורה ותוכנית עבודה

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

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

אנחנו נעבוד על שרת Linux בהפצת Ubuntu וגירסת 18.04. זוהי גירסת LTS כך שעבודה איתה היום מבטיחה תמיכה ועדכונים ל-5 שנים כלומר הגירסא תמשיך להיות מתוחזקת עד 2023. את השרת נתקין בחוות השרתים של Digital Ocean שנותנים שרת במחיר מצחיק של 5$ לחודש.

על השרת נתקין סביבת הרצה מקומית של Ruby ודרכה נתקין את Rails שהיא תשתית לכתיבת Web Applications.

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

בשלב השני נתקין ונבנה בסיס נתונים מסוג Postgresql ונחבר את אפליקציית הריילס שלנו לבסיס הנתונים ונחבר את האפליקציה שלנו לבסיס הנתונים.

ובשלב השלישי נתקין שרת nginx ונחבר את המערכת כך שתטען טוב דרך הדומיין.

מוכנים? בואו נצא לדרך.

3. התקנת מערכת ההפעלה

אנחנו מתחילים את הטיול במסך הניהול של Digital Ocean בכתובת:

https://cloud.digitalocean.com/droplets

אם אין לכם חשבון שם תצטרכו ליצור אחד. אם יש תצטרכו להתחבר.

עכשיו לחצו על הכפתור Create Droplet, בחרו Ubuntu ועדכנו את הגירסא ל 18.04 ובחרו את התוכנית הזולה ביותר של 5$ לחודש. אתם יכולים לבחור לשים את השרת שלכם בכל מקום בעולם ואנחנו נלך על אמסטרדם. בחרו שם שאתם אוהבים ולחצו על כפתור Create.

אחרי היצירה תועברו אוטומטית למסך רשימת הדרופלטים (ככה Digital Ocean קוראים לשרתים). לחצו על השרת שלכם ובמסך הבא תראו את כתובת ה IP של המכונה.

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

https://www.tocode.co.il/bundles/unix1

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

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

על מק ולינוקס לקוח ה ssh כבר מובנה במערכת.

אם לא הצלחתם להתקין אפשר גם לעבוד דרך Console מבוסס ווב- לוחצים על הקישור Console בדף ניהול השרת ונפתח כלי שורת פקודה מבוסס ווב. הבעיה היחידה איתו שאי אפשר "להדביק" דברים לחלון ולכן קצת יותר קשה לעבוד.

המשימה הראשונה שלנו על השרת החדש היא ליצור משתמש. נשתמש בפקודה:

$ adduser ynon

אפשר לבחור כל שם במקום ynon. הקלידו את השורה, לחצו Enter ולאחר מכן תצטרכו לבחור סיסמא.

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

$ adduser ynon admin

עכשיו נתנתק מהמכונה ונתחבר חזרה בתור המשתמש שיצרנו. משורת הפקודה נקליד:

$ sudo -s

כדי להפוך למנהל מערכת ולאחר מכן נקליד:

$ exit

כדי לחזור להיות המשתמש הרגיל שלנו.

4. התקנה מקומית של Ruby ו Bundler

בחרתי להדגים הפעלה של Web Application הכתוב ב Ruby. האמת ששפת התכנות או הפלטפורמה לא ממש משנה ולמרות שלכל פלטפורמה יש דרך אחרת להתקין אותה לכולן יש מדריכים טובים אונליין אז אם נראה אחד תוכלו ליישם את אותם רעיונות גם על סביבה אחרת.

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

עבור התקנת רובי נלך לפי המדריך הזה מהאתר של Digital Ocean:

https://www.digitalocean.com/community/tutorials/how-to-install-ruby-and-set-up-a-local-programming-environment-on-ubuntu-16-04

אני מריץ את כל הפקודות בתור המשתמש המקומי שלי למרות שיש פקודות שמתחילות במילה sudo והן באופן אוטומטי כן ירוצו בתור מנהל מערכת.

לאחר סיום כל הפקודות מהמדריך נרצה להתקין ספריית ruby בשם bundler שתעזור לנו להתקין ספריות נוספות ואת היישום שלנו:

$ gem install bundler

5. חיבור השרת לדומיין

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

כך לדוגמא קניתי את הדומיין tocode.party באתר namecheap.com. בממשק הניהול של namecheap בחרתי לנהל את האתר דרך cloudns ואז כל ההגדרות מרוכזות במקום אחד ובממשק אחד.

כדי לחבר אתר לדומיין עלינו לייצר עבורו רשומה שנקראת A Record ובה לכתוב את כתובת ה IP של השרת. בממשק של cloudns לוחצים על Add new record, בוחרים בסוג הרשומה A. את השדה Host משאירים ריק ובשדה Points to רושמים את כתובת ה IP.

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

6. העברת קבצים והעלאת המערכת ממחשב הפיתוח לשרת

נמשיך להתקנת Web Application פשוט שכבר הכנתי מבעוד מועד. הקוד נמצא אונליין בגיטהאב ואפשר להוריד אותו כקובץ זיפ מהקישור:

https://github.com/ynonp/demo-webapp/archive/master.zip

כדי להעביר קבצים בין המחשב שלי לשרת אני משתמש בתוכנה בשם Cyberduck שהיא לקוח FTP. אנחנו מעבירים את הקבצים בפרוטוקול sftp שנותן ממשק גרפי ונוח במקום המסך השחור איתו עבדנו עד עכשיו.

הורידו את תוכנית cyberduck מדף הבית שלהם בכתובת:

https://cyberduck.io

לאחר הפעלה לחצו על כפתור Open Connection ושם כתבו בשדה Server את כתובת המתחם שלכם (או כתובת ה IP), ב username את שם המשתמש שבחרתם וב password את הסיסמא.לחצו Connect ותראו רשימה של קבצים שהיא כרגע ריקה.

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

בהנחה שקראתם לתיקיה helloworld על השרת כתבו את הפקודות:

$ cd helloworld
$ bundle install

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

7. הפעלת המערכת והתחברות כדי לראות שהכל עובד

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

rails s -b 0.0.0.0

וכדי להתחבר אליה מספיק לפתוח דפדפן ולהזין את כתובת ה IP של השרת שלכם (או שם המתחם) ולאחריה נקודותיים והמספר 3000. בדוגמא שלי קניתי את tocode.party ולכן הכתובת היא: http://tocode.party:3000.

לאחר מכן לחצו Ctrl+C במסך השחור כדי לסגור את המערכת ותראו שאי אפשר יותר לגלוש לאתר.

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

RAILS_ENV=production rails s

העבודה במצב ייצור משנה את התנהגות המערכת: למשל הודעות השגיאה שיוצגו למשתמש יהיו הרבה פחות מפורטות. ננסה להיכנס שוב לאתר ונראה כזו הודעת שגיאה שלא אומרת כלום. מבט מהיר בלוג יספר לנו ששכחנו להפעיל פקודת אופטימיזציה שריילס דורש ולכן נלחץ Ctrl+C כדי לסגור את השרת, נפעיל את הפקודה:

./bin/rake assets:precompile

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

8. פיתוח סקריפטים של systemd להפעלה וכיבוי ה Web Application שלנו

ברור שהפעלה מחדש של המערכת היא לא הגיונית למערכת שאמורה להיות כל הזמן באוויר ואכן ליוניקס יש מנגנון ניהול Services שמאפשר להפעיל ולכבות שירותי רשת באופן אוטומטי.

המנגנון נקרא systemd והוא פועל באמצעות קבצי הגדרות (נקראים unit files) כאשר כל יישום שיש לנו על השרת יקבל קובץ הגדרות כזה. בקובץ נוכל לציין שאנחנו רוצים שהיישום תמיד יהיה למעלה ואם במקרה הוא מתרסק אז שהמערכת תעלה אותו בחזרה.

כל ה unit files של השרת נמצאים בספריה /lib/systemd/system. הפקודה הבאה תציג רשימה של כולם:

$ ls /lib/systemd/system

ניצור קובץ חדש עבור המערכת שלנו. אני מניח כאן ששם המשתמש הוא ynon ושהספריה בה המערכת הותקנה היא /home/ynon/helloworld. אם ההגדרות אצלכם שונות תצטרכו להחליף את השמות בהתאמה. שם הקובץ יהיה helloworld וניצור אותו באמצעות הפקודה:

$ sudo -s
$ pico /lib/systemd/system/helloworld.service

לאחר מכן בתוך הקובץ נקליד את הטקסט הבא:

[Unit]
Description=Demo Web Process

[Service]
User=ynon
WorkingDirectory=/home/ynon/helloworld
Restart=on-failure
Environment=RAILS_ENV=production
ExecStart=/home/ynon/.rvm/gems/ruby-2.5.1/wrappers/rails s

[Install]
WantedBy=multi-user.target

נפעיל את הפקודות:

$ systemctl daemon-reload
$ systemctl enable helloworld

והתוכנית שלנו נרשמה בתור Service. עכשיו כדי לשלוט בה נוכל להשתמש ב-3 הפקודות הבאות:

# show program status
$ systemctl status helloworld

# start the application
$ systemctl start helloworld

# stop the application
$ systemctl stop helloworld

9. התקנה והגדרת שרת ווב nginx

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

שני השרתים הנפוצים הם nginx ו apache. אנג'ין איקס הוא המודרני בין השניים ולכן נתקין אותו. הקלידו את הפקודות:

$ sudo -s
$ apt-get install nginx

בואו נראה אם זה עבד. נקליד:

$ systemctl status nginx

ואצלי על המכונה קיבלתי את הפלט הבא שאומר שההתקנה עבדה והשרת למעלה:

root@ubuntu-s-1vcpu-1gb-ams3-01:~# systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
   Active: active (running) since Tue 2018-07-24 11:41:53 UTC; 1min 4s ago
     Docs: man:nginx(8)
  Process: 13868 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (cod
  Process: 13858 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process
 Main PID: 13871 (nginx)
    Tasks: 2 (limit: 1153)
   CGroup: /system.slice/nginx.service
           ├─13871 nginx: master process /usr/sbin/nginx -g daemon on; master_pr
           └─13874 nginx: worker process

Jul 24 11:41:53 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: Starting A high performan
Jul 24 11:41:53 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: nginx.service: Failed to 
Jul 24 11:41:53 ubuntu-s-1vcpu-1gb-ams3-01 systemd[1]: Started A high performanc

אפשר לגשת לשרת הווב החדש שלנו באמצעות הקלדת כתובת הדומיין בשורת הכתובת של הדפדפן. התוצאה היא עמוד עם הכותרת Welcome to nginx.

עכשיו צריך לעדכן את ההגדרות כך שגלישה תביא אותנו לאפליקציה שבנינו.

הפקודה:

$ pico /etc/nginx/sites-available/default

פותחת לעריכה את קובץ ההגדרות של שרת nginx. בקובץ זה נוסיף את הבלוק הבא:

        
        location /hello/ {
                root /home/ynon/helloworld/public;
                proxy_pass http://127.0.0.1:3000/;
                proxy_redirect off;
                proxy_set_header X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;
        }

ריענון ההגדרות עם:

$ systemctl reload nginx

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

10. התקנה והגדרת בסיס נתונים Postgresql

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

$ apt-get install postgresql

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

$ su - postgres

ועכשיו אפשר להתחבר לבסיס הנתונים עם:

$ psql

נקליד בשורת הפקודה \q כדי לצאת מבסיס הנתונים ונמשיך ביצירת המשתמש החדש. הפקודה הבאה מתחילה תהליך של יצירת משתמש בבסיס הנתונים:

$  createuser --interactive

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

$ createdb ynon

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

alter user username with encrypted password 'password';

11. סיכום ורעיונות להמשך

ראינו איך להתקין שרת חדש על Digital Ocean, איך לחבר אותו לדומיין ואיך לשים עליו את היישום שלנו לסביבת Production.

ראינו גם איך לבנות למערכת שלנו בסיס נתונים ואיך להשתמש ב nginx כדי להתקין מספר יישומים על אותו שרת.

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

אחרי זה יהיה מעניין ללמוד על דוקר ולראות איך קונטייניירים עובדים בהשוואה להתקנת שרת מלא. על זה בטוח יהיה וובינר נוסף בהמשך.