כיצד להגדיר את Nginx עם תמיכה ב-HTTP/2 על Ubuntu 22.04

A previous version of this tutorial was written by Sergey Zhukaev.

הקדמה

Nginx הוא שרת אינטרנט פתרונות תוכנה פתוחה מהיר ואמין. זה השיג פופולריות בזכות רגל זיכרון נמוכה, קינון גבוה, קלות הגדרה ותמיכה במגוון רחב של פרוטוקולים.

HTTP/2 הוא גרסה חדשה יותר של פרוטוקול ההעברת היפרטקסט, שמשמש ברשת למסירת דפים מהשרת לדפדפן. HTTP/2 הוא העדכון המרכזי הראשון של HTTP לכמעט שנתיים: HTTP1.1 הושק לקהל הרחב ב-1999 כאשר דפי האינטרנט היו קטנים בגודל מאוד. האינטרנט השתנה מאז למעשה, ואנו עומדים כעת מול המגבלות של HTTP 1.1. הפרוטוקול מגביל את מהירות ההעברה הפוטנציאלית עבור רוב האתרים המודרניים מכיוון שהוא מוריד חלקים של דף בתור – החלק הקודם חייב להורד לחלוטין לפני שההורדה של החלק הבא מתחילה – ודף אינטרנט ממוצע מודרני מוריד עשרות משאבי CSS, ג'אווה סקריפט ותמונות יחידות.

HTTP/2 פותרת את הבעיה הזו מאחר והיא מביאה שינויים יסודיים כמה:

  • כל הבקשות מורדות במקביל, לא בתור
  • כותרות HTTP מדוחסות
  • דפים מועברים כקובץ בינארי, לא כקובץ טקסט, שהוא יעיל יותר
  • שרתים יכולים "לדחוף" נתונים גם בלי בקשה של המשתמש, מה שמשפר את המהירות עבור משתמשים עם לטנציה גבוהה

אף על פי ש-HTTP/2 אינו דורש הצפנה, מפתחי שני הדפדפנים הפופולריים ביותר, Google Chrome ו־Mozilla Firefox, ציינו כי מסיבות אבטחה הם יתמוך ב־HTTP/2 רק עבור חיבורי HTTPS. לכן, אם תחליט להגדיר שרתים עם תמיכה ב־HTTP/2, עליך גם לאבטח אותם בעזרת HTTPS.

מדריך זה יעזור לך להגדיר שרת Nginx מהיר ומאובטח עם תמיכה ב־HTTP/2.

דרישות רפרנצה

לפני שתתחיל, יהיה עליך להשג כמה דברים:

שלב 1 — הפעלת תמיכה ב-HTTP/2

אם עקבת אחרי הגדרת בלוק השרת במדריך להתקנת Nginx, יש לך בלוק שרת עבור הדומיין שלך בנתיב /etc/nginx/sites-available/your_domain עם ההנחייה server_name כבר מוגדרת בצורה המתאימה. השינוי הראשון שנבצע יהיה לשנות את בלוק השרת של הדומיין שלך כך שישתמש ב-HTTP/2.

פתח את קובץ התצורה עבור הדומיין שלך באמצעות nano או העורך שאתה מעדיף:

  1. sudo nano /etc/nginx/sites-enabled/your_domain

בקובץ, אתר את המשתנים listen הקשורים לפורט 443:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

הראשון הוא לחיבורים IPv6. השני הוא לכל החיבורים IPv4. נפעיל HTTP/2 לשניהם.

שנה כל ההוראה listen כך שתכלול http2:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

זה מודיע ל-Nginx להשתמש ב-HTTP/2 עם דפדפנים שתומכים בו.

שמור את קובץ התצורה וצא מהעורך הטקסט. אם אתה משתמש ב־nano, לחץ Ctrl+X, ואז, כאשר יתבקש, Y ואז Enter.

כל פעם שאתה עושה שינויים בקבצי התצורה של Nginx, עליך לבדוק את התצורה לשגיאות, באמצעות הדגל -t, שמפעיל את פקודת בדיקת התחביר המובנית של Nginx:

  1. sudo nginx -t

אם התחביר אינו מכיל שגיאות, תקבל פלט דומה לזה:

Output of sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

בשלב הבא, תגדיר את שרת ה-Nginx שלך כך שישתמש ברשימת צפיפות יותר מגבוהה של מצפנים כדי לשפר את אבטחת השרת שלך.

שלב 2 — הסרת אבטחות ישנות ולא בטוחות

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

השיטה שתשתמש בה כדי להגדיר את המצפנים תלויה באיך שהגדרת את אישורי ה-TLS/SSL שלך עבור Nginx.

אם השתמשת ב־Certbot כדי לקבל את התעודות שלך, הוא גם יצר את הקובץ /etc/letsencrypt/options-ssl-nginx.conf שמכיל סיפרות שאינן מאובטחות מספיק עבור HTTP/2. אך, לשנות את קובץ זה תמנע מ־Certbot ליישם עדכונים בעתיד, לכן נגיד ל־Nginx שלא להשתמש בקובץ זה ונציין את רשימת ה־ciphers שלנו בעצמנו.

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

sudo nano /etc/nginx/sites-enabled/your_domain

איתר את השורה שכוללת את קובץ ה־options-ssl-nginx.conf והוסף הערה להתחלת השורה על ידי הוספת תו # להתחלת השורה:

/etc/nginx/sites-enabled/your_domain

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

מתחת לשורה זו, הוסף את השורה הבאה כדי להגדיר את רשימת ה־ciphers המאושרות:

/etc/nginx/sites-enabled/your_domain

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

שמור את הקובץ וצא מהעורך.

אם השתמשת בתעודות שנחתמו עצמאית או בתעודה מצד גורם שלישי והגדרת אותה לפי הנדרש, פתח את הקובץ /etc/nginx/snippets/ssl-params.conf בעורך הטקסט שלך:

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

איתר את השורה הבאה:

/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

שנה אותה כך שתשתמש ברשימת ה־ciphers הבאה:

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

שמור את הקובץ וצא מהעורך שלך.

בדוק שוב את התצורה לשגיאות תחביר באמצעות הפקודה nginx -t:

  1. sudo nginx -t

אם אתה נתקל בשגיאות, טפל בהן ובדוק שוב.

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

  1. sudo systemctl reload nginx.service

עם השרת שהתחיל מחדש, בוא נוודא שהוא עובד.

שלב 3 — בדיקה ש-HTTP/2 מופעל

בואו נוודא שהשרת פועל ועובד עם HTTP/2.

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

  1. curl -I -L --http2 https://your_domain

תקבלו פלט דומה לזה:

HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes

בנוסף, תוכלו לוודא ש-HTTP/2 משמש ב-Google Chrome. פתחו Chrome ונווטו אל https://your_domain. פתחו את כלי הפיתוח של Chrome (הצג -> פיתוח -> כלי פיתוח) וטענו מחדש את הדף (הצג -> טען מחדש דף זה). נווטו אל כרטיס הרשת (רשת), לחצו ימינה על שורת הכותרות שמתחילה ב־שם, ובחרו באפשרות פרוטוקול מתוך תפריט ההקפיצה.

תקבלו עמודת פרוטוקול חדשה שמכילה את h2 (שמציינת HTTP/2), המצביעה על כך ש-HTTP/2 עובד.

בנקודה זו, אתם מוכנים לשרת תוכן דרך פרוטוקול HTTP/2. בואו נשפר את האבטחה והביצועים על ידי הפעלת HSTS.

שלב 4 — הפעלת אבטחת התעבורה הסטריקטית של ה-HTTP (HSTS)

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

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

sudo nano /etc/nginx/your_domain

הוסף את השורה הזו לאותו בלוק בקובץ שמכיל את הצפיפויות של SSL כדי להפעיל HSTS:

/etc/nginx/your_domain
server {
...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

הערך max-age מוגדר בשניות. הערך 15768000 שקול ל-6 חודשים.

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

/etc/nginx/your_domain
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

שמור את הקובץ, וצא מהעורך.

בדוק שוב את התצורה לשגיאות תחביר:

  1. sudo nginx -t

לבסוף, הפעל מחדש את שרת ה-Nginx כדי להחיל את השינויים.

  1. sudo systemctl reload nginx.service

סיכום

השרת שלך של Nginx משרת כעת עמודי HTTP/2. אם ברצונך לבדוק את חוזק חיבור ה-SSL שלך, אנא בקר ב־Qualys SSL Lab והפעל בדיקה נגד השרת שלך. אם הכל מוגדר כראוי, אתה צריך לקבל ציון A+ לאבטחה.

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-with-http-2-support-on-ubuntu-22-04