كيفية تكوين إنجينكس مع SSL كوكيل عكسي لـ جينكينز

المقدمة

بشكل افتراضي، يأتي Jenkins مع خادم ويب مدمج به، الذي يستمع على المنفذ 8080. يعتبر هذا ملائمًا إذا كنت تدير نسخة خاصة من Jenkins، أو إذا كنت بحاجة فقط للحصول على شيء بسرعة ولا تهتم بالأمان. بمجرد أن تكون لديك بيانات إنتاج حقيقية تتجه إلى مضيفك، فمن الجيد استخدام خادم ويب آمن مثل Nginx لمعالجة حركة المرور.

سيقوم هذا المنشور بشرح كيفية تغليف موقعك بشهادة SSL باستخدام خادم الويب Nginx كبروكسي معكوس لنسخة Jenkins الخاصة بك. يفترض هذا البرنامج التعليمي بعض الإلمام بأوامر لينكس، وتثبيت Jenkins العامل، وتثبيت Ubuntu 20.04.

يمكنك تثبيت Jenkins في وقت لاحق في هذا البرنامج التعليمي، إذا لم يكن مثبتًا بعد.

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

يفترض هذا الدليل أنك تستخدم Ubuntu 20.04. قبل البدء، يجب أن يكون لديك حساب مستخدم غير root مع امتيازات sudo على نظامك. يمكنك تعلم كيفية القيام بذلك عن طريق اتباع دليل إعداد الخادم الأولي لـ Ubuntu 20.04. ستحتاج أيضًا إلى تثبيت خادم Nginx واستضافة نطاقك عليه. يمكنك تعلم كيفية القيام بذلك باستخدام كيفية تثبيت Nginx على Ubuntu 20.04.

بالإضافة إلى ذلك، يعتبر تأمين مثيل Jenkins الخاص بك بواسطة SSL أمرًا مهمًا للغاية. إذا كان مرئيًا على الإنترنت، يمكنك تأمينه باستخدام Let’s Encrypt. يمكنك تعلم كيفية القيام بذلك باستخدام كيفية تأمين Nginx باستخدام Let’s Encrypt على Ubuntu 22.04.
كما هو مذكور سابقًا، يفترض هذا الدليل أن Jenkins قد تم تثبيته بالفعل. سيعرض لك هذا الدليل كيفية تثبيت Jenkins إذا لزم الأمر. ستحتاج على الأرجح إلى التبديل إلى مستخدم root لهذا المقال.

الخطوة 1 — تكوين Nginx

لقد أصبح Nginx خادم الويب المفضل لسرعته ومرونته في السنوات الأخيرة، مما يجعله خيارًا مثاليًا لتطبيقنا.

تحرير التكوين

سيكون عليك بعد ذلك تحرير ملف تكوين Nginx الافتراضي. يستخدم المثال التالي nano.

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

وهنا ما قد يبدو عليه التكوين النهائي؛ حيث يتم تقسيم الأقسام وشرحها بإيجاز أدناه. يمكنك تحديث أو استبدال ملف التكوين الحالي، على الرغم من أنك قد ترغب في عمل نسخة احتياطية أولاً.

server {23
    listen 80;
    return 301 https://$host$request_uri;
}

server {

    listen 443;
    server_name jenkins.domain.com;

    access_log            /var/log/nginx/jenkins.access.log;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;

      proxy_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
    }
    
    ...
}

سيتعين عليك تحديث الأسطر server_name و proxy_redirect بالنطاق الخاص بك. هناك بعض السحر الإضافي في Nginx أيضًا يخبر الطلبات بأن تُقرأ بواسطة Nginx وتُعاد كتابتها على جانب الاستجابة لضمان عمل الخادم البروكسي العكسي.

احفظ وأغلق الملف. إذا استخدمت nano، يمكنك القيام بذلك عن طريق الضغط على Ctrl + X ثم Y وأخيرًا Enter.

القسم الأول يخبر خادم Nginx بالاستماع إلى أي طلبات تأتي على منفذ 80 (HTTP الافتراضي) وإعادة توجيهها إلى HTTPS.

...
server {
   listen 80;
   return 301 https://$host$request_uri;
}
...

بعد ذلك، يحدث التوجيه البروكسي. ببساطة، يأخذ أي طلبات واردة ويقوم بتوجيهها إلى نسخة جنكينز المرتبطة/التي تستمع على منفذ 8080 على الواجهة الشبكية المحلية.

...
location / {

    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;

    proxy_pass          http://localhost:8080;
    proxy_read_timeout  90;

    proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
...

ملاحظة: إذا كنت ترغب في معرفة المزيد عن التوجيه البروكسي في Nginx، فإن هذا البرنامج التعليمي يحتوي على بعض المعلومات الجيدة حول إعدادات التوجيه البروكسي في Nginx.

A few quick things to point out here. If you don’t have a domain name that resolves to your Jenkins server, then the proxy_redirect statement above won’t function correctly without modification, so keep that in mind. Also, if you misconfigure the proxy_pass (by adding a trailing slash for example), you will get something similar to the following in your Jenkins Configuration page.

إذا رأيت هذا الخطأ، قم بالتحقق مرتين من إعدادات proxy_pass و proxy_redirect في تكوين Nginx!

الخطوة ٢ — تكوين جينكينز

لكي يعمل جينكينز مع Nginx، نحتاج إلى تحديث تكوين جينكينز للاستماع فقط على عنوان الـ localhost بدلاً من جميع العناوين (0.0.0.0)، لضمان معالجة حركة المرور بشكل صحيح. هذه خطوة أمنية مهمة لأنه إذا كان جينكينز لا يزال يستمع على جميع العناوين، فسيكون لا يزال ممكن الوصول إليه عبر منفذه الأصلي (8080). سنقوم بتعديل ملف التكوين /etc/default/jenkins لجعل هذه التعديلات.

  1. sudo nano /etc/default/jenkins

ابحث عن السطر JENKINS\_ARGS وقم بتحديثه ليبدو كما يلي:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"

لاحظ أن الإعداد –httpListenAddress=127.0.0.1 يجب إما إضافته أو تعديله.

ثم قم بإعادة تشغيل جينكينز ونجينكس.

  1. sudo service jenkins restart
  2. sudo service nginx restart

يجب أن تكون قادرًا الآن على زيارة نطاقك باستخدام HTTPS، وسيتم تقديم موقع جينكينز بشكل آمن.

اختياري — تحديث عناوين OAuth

إذا كنت تستخدم GitHub أو أداة توثيق OAuth أخرى للمصادقة، فمن المحتمل أن تكون معطلة في هذه النقطة. على سبيل المثال، عند محاولة زيارة الرابط، ستحصل على رسالة “فشل في فتح الصفحة” مع رابط مشابه لـ http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string.

لحل هذا، ستحتاج إلى تحديث بعض الإعدادات داخل جنكنز، بما في ذلك إعدادات أداة التوثيق OAuth الخاصة بك. قم أولاً بتحديث عنوان URL الخاص بجنكنز في واجهة المستخدم الرسومية لجنكنز؛ يمكن العثور عليه في القائمة Jenkins -> إدارة جنكنز -> تكوين النظام -> موقع جنكنز.

قم بتحديث عنوان URL الخاص بجنكنز لاستخدام HTTPS – https://jenkins.domain.com/

بعد ذلك، قم بتحديث إعدادات OAuth الخاصة بك مع موفر الخدمة الخارجي. يتم العثور على هذا المثال على GitHub. في GitHub، يمكن العثور عليها تحت الإعدادات -> التطبيقات -> تطبيقات المطورين، على موقع GitHub.

يجب أن يكون هناك إدخال لجنكنز. قم بتحديث عنوان URL للصفحة الرئيسية وعنوان URL لرد الموافقة ليعكس الإعدادات HTTPS. قد يبدو مشابهًا للتالي:

الاستنتاج

الشيء الوحيد المتبقي هو التحقق من أن كل شيء عمل بشكل صحيح. كما ذكر أعلاه، يجب أن تكون الآن قادرًا على التصفح إلى عنوان URL الجديد الذي تم تكوينه – jenkins.domain.com – سواء عبر HTTP أو HTTPS. يجب أن يتم إعادة توجيهك إلى الموقع الآمن، ويجب أن ترى بعض معلومات الموقع، بما في ذلك إعدادات SSL الجديدة الخاصة بك. كما لوحظ سابقًا، إذا لم تكن تستخدم أسماء مضيفين عبر DNS، فقد لا يعمل إعادة التوجيه كما هو مرغوب فيه. في هذه الحالة، ستحتاج إلى تعديل قسم proxy_pass في ملف تكوين Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-with-ssl-as-a-reverse-proxy-for-jenkins