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.
المتطلبات المسبقة
قبل البدء، ستحتاج إلى بعض الأشياء:
- خادم Ubuntu 22.04 مُعدًا باستخدام دليل إعداد الخادم الأولي لـ Ubuntu 22.04، بما في ذلك مستخدم بدون صلاحيات root وجدار ناري.
- تثبيت Nginx على خادمك، ويمكنك فعل ذلك باتباع كيفية تثبيت Nginx على Ubuntu 22.04.
- A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
- A TLS/SSL certificate configured for your server. You have two options:
- يمكنك الحصول على شهادة مجانية من Let’s Encrypt عبر اتباع كيفية تأمين Nginx باستخدام Let’s Encrypt على Ubuntu 22.04.
- يمكنك أيضًا إنشاء وتكوين شهادة ذاتية التوقيع عن طريق اتباع كيفية إنشاء شهادة SSL ذاتية التوقيع لـ Nginx في Ubuntu 22.04.
- تم تكوين Nginx لإعادة توجيه حركة المرور من المنفذ
80
إلى المنفذ443
، والذي يجب أن يكون مشمولًا في المتطلبات السابقة. - تم تكوين Nginx لاستخدام مفتاح Ephemeral Diffie-Hellman (DHE) بحجم 2048 بت أو أعلى، والذي يجب أيضًا أن يكون مشمولًا في المتطلبات السابقة.
الخطوة 1 — تمكين دعم HTTP/2
إذا قمت باتباع خطوة إعداد كتلة الخادم في دورة تثبيت Nginx، يجب أن تكون لديك كتلة خادم لنطاقك في /etc/nginx/sites-available/اسم_نطاقك
مع التوجيه server_name
مضبوط بالفعل بشكل مناسب. التغيير الأول الذي سنقوم به سيكون تعديل كتلة الخادم الخاصة بنطاقك لاستخدام HTTP/2.
افتح ملف التكوين الخاص بنطاقك باستخدام nano
أو المحرر الذي تفضله:
في الملف، ابحث عن المتغيرات listen
المرتبطة بالمنفذ 443
:
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
الأول لاتصالات IPv6. الثاني لجميع اتصالات IPv4. سنقوم بتمكين HTTP/2 للاثنين.
قم بتعديل كل توجيه listen
لتتضمن http2
:
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
هذا يخبر Nginx بأن يستخدم HTTP/2 مع المتصفحات المدعومة.
احفظ ملف التكوين واخرج من محرر النصوص. إذا كنت تستخدم nano
، اضغط Ctrl+X
ثم، عندما يُطلب، Y
ثم اضغط Enter.
عندما تقوم بإجراء تغييرات على ملفات تكوين Nginx، يجب عليك التحقق من التكوين للأخطاء، باستخدام العلم -t
، الذي يُشغّل أمر فحص الصيغة المضمن في Nginx:
إذا كانت الصيغة خالية من الأخطاء، ستتلقى إخراجًا مثل الآتي:
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
وقم بتعليقه عن طريق إضافة حرف #
إلى بداية السطر:
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
أسفل هذا السطر، أضف هذا السطر لتحديد التشفيرات المسموح بها:
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
احفظ الملف واخرج من المحرر.
إذا كنت قد استخدمت شهادات ذاتية التوقيع أو استخدمت شهادة من جهة خارجية وقمت بتكوينها وفقًا للمتطلبات المسبقة، فافتح الملف /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;
...
قم بتعديله لاستخدام القائمة التالية من التشفيرات:
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
احفظ الملف واخرج من المحرر.
ثم، تحقق مرة أخرى من صحة تكوين الخطأ باستخدام الأمر nginx -t
:
إذا واجهت أي أخطاء، فتعامل معها وقم بالاختبار مرة أخرى.
بمجرد أن يمر تكوينك بفحص الصحة، أعد تشغيل Nginx باستخدام الأمر systemctl
:
بعد إعادة تشغيل الخادم، دعنا نتحقق من أنه يعمل.
الخطوة 3 — التحقق من تمكين HTTP/2
لنتأكد من أن الخادم يعمل ويعمل ببروتوكول HTTP/2.
استخدم أمر curl
لإرسال طلب إلى موقعك وعرض الرؤوس:
سوف تتلقى مخرجات مثل التالي:
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:
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
في نهاية السطر، مثل هذا:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
احفظ الملف، واخرج من المحرر.
تحقق مرة أخرى من التكوين للتأكد من عدم وجود أخطاء في الصيغة:
أعد تشغيل خادم Nginx أخيرًا لتطبيق التغييرات.
الختام
يخدم خادم Nginx الخاص بك الآن صفحات HTTP/2. إذا كنت ترغب في اختبار قوة اتصال SSL الخاص بك، يرجى زيارة Qualys SSL Lab وتشغيل اختبار على خادمك. إذا تم تكوين كل شيء بشكل صحيح، يجب أن تحصل على علامة A+ للأمان.
لمعرفة المزيد حول كيفية تحليل Nginx وتنفيذ قواعد كتلة الخادم، جرب قراءة فهم خوارزميات اختيار كتلة الخادم والموقع في Nginx.