كيفية إعداد Nginx مع دعم HTTP/2 على Ubuntu 22.04

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

مقدمة

إنجينكس هو خادم ويب مفتوح المصدر سريع وموثوق به. اكتسب شهرته بسبب بصمته الذاكرية المنخفضة وقابليته للتوسع بشكل كبير وسهولة تكوينه ودعمه لمجموعة متنوعة واسعة من البروتوكولات.

HTTP/2 هو إصدار أحدث من بروتوكول نقل النص الفائق، الذي يستخدم على الويب لتسليم الصفحات من الخادم إلى المتصفح. HTTP/2 هو أول تحديث رئيسي لبروتوكول HTTP منذ ما يقرب من عقدين من الزمان: تم تقديم HTTP1.1 للجمهور في عام 1999 عندما كانت صفحات الويب أصغر بكثير في الحجم. لقد تغير الإنترنت بشكل كبير منذ ذلك الحين، ونحن نواجه الآن حدود HTTP 1.1. يحد البروتوكول من سرعات النقل المحتملة لمعظم مواقع الويب الحديثة لأنه يقوم بتنزيل أجزاء من صفحة في طابور – يجب أن تكتمل تنزيل الجزء السابق تمامًا قبل بدء تنزيل الجزء التالي – وصفحة الويب الحديثة المتوسطة تنزل العشرات من الملفات الفردية لجافا سكريبت والنماذج والصور.

يحل HTTP/2 هذه المشكلة لأنه يقدم بعض التغييرات الأساسية:

  • يتم تنزيل جميع الطلبات بتوازي، ليس في طابور
  • تضغط رؤوس HTTP
  • يتم نقل الصفحات كملف ثنائي، ليس كملف نصي، مما يجعلها أكثر كفاءة
  • يمكن للخوادم “دفع” البيانات حتى بدون طلب المستخدم، مما يحسن السرعة للمستخدمين ذوي البطء في الاستجابة

حتى وإن لم يتطلب HTTP/2 التشفير، فقد أعلن مطورو أشهر متصفحين، جوجل كروم وموزيلا فايرفوكس، أنهم سيدعمون HTTP/2 فقط لاتصالات HTTPS بسبب الأمان. وبالتالي، إذا قررت إعداد خوادم بدعم HTTP/2، يجب أن تؤمنها أيضًا بـ HTTPS.

هذا البرنامج التعليمي سيساعدك في إعداد خادم Nginx سريع وآمن بدعم HTTP/2.

المتطلبات المسبقة

قبل البدء، ستحتاج إلى بعض الأشياء:

الخطوة 1 — تمكين دعم HTTP/2

إذا قمت باتباع خطوة إعداد كتلة الخادم في دورة تثبيت Nginx، يجب أن تكون لديك كتلة خادم لنطاقك في /etc/nginx/sites-available/اسم_نطاقك مع التوجيه 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 ببساطة بعدم استخدام هذا الملف وسنحدد قائمتنا الخاصة بالتشفيرات.

افتح ملف تكوين كتلة الخادم لنطاقك:

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

أسفل هذا السطر، أضف هذا السطر لتحديد التشفيرات المسموح بها:

/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;
...

قم بتعديله لاستخدام القائمة التالية من التشفيرات:

/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://اسم_نطاقك. افتح أدوات المطور في Chrome (عرض -> المطور -> أدوات المطور) وأعد تحميل الصفحة (عرض -> إعادة تحميل هذه الصفحة). انتقل إلى علامة التبويب الشبكة, انقر بزر الماوس الأيمن على صف العنوان في الجدول الذي يبدأ بـ الاسم, وحدد الخيار البروتوكول من قائمة العرض.

سيكون لديك عمود البروتوكول الجديد الذي يحتوي على h2 (والذي يعني HTTP/2), مما يشير إلى أن HTTP/2 يعمل.

في هذه المرحلة، أنت جاهز لتقديم المحتوى من خلال بروتوكول HTTP/2. دعنا نحسن الأمان والأداء عن طريق تمكين HSTS.

الخطوة ٤ — تمكين الأمان النقلي الصارم لبروتوكول 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 تعادل ٦ أشهر.

بشكل افتراضي، لا يتم إضافة هذا الرأس إلى طلبات النطاقات الفرعية. إذا كانت لديك نطاقات فرعية وترغب في تطبيق 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