مقدمه
بهصورت پیشفرض، Jenkins دارای یک وبسرور داخلی (Winstone) است که روی پورت 8080 اجرا میشود. این روش برای راهاندازی اولیه مناسب است، اما برای استفاده در محیط عملیاتی (Production) توصیه نمیشود.
اگر Jenkins را مستقیماً روی پورت 8080 در اختیار کاربران قرار دهید:
- ارتباط کاربران رمزنگاری نمیشود.
- اطلاعات حساس مانند نام کاربری، رمز عبور و Tokenها بهصورت رمز نشده منتقل میشوند.
- امکان استفاده از قابلیتهای SSL، کش، Rate Limiting و سایر امکانات Nginx وجود نخواهد داشت.
بهترین روش، قرار دادن Nginx بهعنوان Reverse Proxy در مقابل Jenkins است تا تمام درخواستها ابتدا توسط Nginx دریافت شده و سپس به Jenkins ارسال شوند. در این حالت میتوانید از گواهی SSL رایگان Let’s Encrypt نیز استفاده کنید و امنیت سرویس را به شکل قابل توجهی افزایش دهید.
در این آموزش نحوه راهاندازی Jenkins پشت Nginx Reverse Proxy روی Ubuntu 24.04 LTS را بررسی میکنیم و ارتباط وب را با استفاده از SSL ایمن خواهیم کرد.
پیشنیازها
قبل از شروع، موارد زیر باید آماده باشند:
- یک سرور Ubuntu 24.04 LTS
- کاربر دارای دسترسی sudo
- نصب و راهاندازی Jenkins
- نصب Nginx
- یک دامنه که به IP سرور اشاره کند
- دریافت گواهی SSL از Let’s Encrypt با استفاده از Certbot
در این آموزش فرض میکنیم دامنه شما به صورت زیر است:
jenkins.example.com
در تمام بخشهای مقاله کافی است این دامنه را با دامنه واقعی خود جایگزین کنید.
مرحله اول: پیکربندی Nginx بهعنوان Reverse Proxy
در این بخش، Nginx را به گونهای پیکربندی میکنیم که تمامی درخواستهای کاربران را دریافت کرده و به Jenkins که روی پورت 8080 اجرا میشود ارسال کند.
اگر در آموزش قبلی موفق به دریافت گواهی SSL از Let’s Encrypt شده باشید، فایل تنظیمات دامنه شما در مسیر زیر قرار خواهد داشت:
/etc/nginx/sites-available/jenkins.example.com
فایل را با ویرایشگر باز کنید:
sudo nano /etc/nginx/sites-available/jenkins.example.com
اضافه کردن لاگهای اختصاصی Jenkins
داخل بلاک HTTPS تنظیمات زیر را اضافه کنید:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name jenkins.example.com;
access_log /var/log/nginx/jenkins.access.log;
error_log /var/log/nginx/jenkins.error.log;
...
}
با این کار لاگهای Jenkins از سایر سایتها جدا شده و عیبیابی بسیار سادهتر خواهد شد.
غیرفعال کردن try_files
اگر فایل تنظیمات از قالب پیشفرض Nginx ایجاد شده باشد، احتمالاً داخل بخش location / دستور زیر وجود دارد:
try_files $uri $uri/ =404;
آن را به صورت زیر کامنت کنید:
# try_files $uri $uri/ =404;
در غیر این صورت، Nginx قبل از ارسال درخواست به Jenkins تلاش میکند فایل را روی دیسک پیدا کند و در نهایت خطای 404 Not Found نمایش خواهد داد.
تنظیم Reverse Proxy
اکنون تنظیمات Reverse Proxy را داخل همان بخش location / قرار دهید:
location / {
include /etc/nginx/proxy_params;
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_read_timeout 90s;
proxy_connect_timeout 90s;
proxy_send_timeout 90s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect http://127.0.0.1:8080 https://jenkins.example.com;
}
در این تنظیمات:
proxy_passدرخواستها را به Jenkins ارسال میکند.proxy_paramsاطلاعاتی مانند IP کاربر و Host اصلی را حفظ میکند.proxy_read_timeoutزمان انتظار را افزایش میدهد تا Jobهای طولانی باعث قطع ارتباط نشوند.proxy_set_header Upgradeبرای WebSocketهای Jenkins ضروری است.proxy_redirectآدرسهای داخلی Jenkins را به دامنه اصلی شما تبدیل میکند.
نکته: به انتهای مقدار
proxy_passاسلش (/) اضافه نکنید. وجود اسلش انتهایی ممکن است باعث نمایش خطای معروف It appears that your reverse proxy setup is broken در Jenkins شود.
بررسی صحت تنظیمات
پس از ذخیره فایل، تنظیمات Nginx را بررسی کنید:
sudo nginx -t
اگر همه چیز درست باشد، خروجی مشابه زیر خواهد بود:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
در صورت مشاهده هرگونه خطا، ابتدا آن را برطرف کنید و سپس به مرحله بعد بروید.
مرحله دوم: پیکربندی Jenkins برای استفاده از Reverse Proxy
اکنون باید Jenkins را طوری تنظیم کنیم که فقط روی localhost گوش دهد و مستقیماً از اینترنت در دسترس نباشد. در این حالت تمام درخواستها فقط از طریق Nginx به Jenkins ارسال خواهند شد.
ویرایش فایل سرویس Jenkins
در Ubuntu 24.04 که Jenkins از طریق Repository رسمی نصب شده باشد، تنظیمات سرویس توسط systemd مدیریت میشود.
ابتدا فایل سرویس را باز کنید:
sudo systemctl edit jenkins
اگر فایل خالی باز شد، تنظیمات زیر را وارد کنید:
[Service]
Environment="JENKINS_LISTEN_ADDRESS=127.0.0.1"
Environment="JENKINS_PORT=8080"
در برخی نسخههای Jenkins نیز ممکن است لازم باشد فایل زیر را ویرایش کنید:
sudo nano /usr/lib/systemd/system/jenkins.service
یا:
sudo nano /etc/default/jenkins
اگر فایل /etc/default/jenkins وجود داشت، مقدار زیر را پیدا کنید:
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT"
و آن را به شکل زیر تغییر دهید:
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"
نکته: بسته به نسخه Jenkins و روش نصب، ممکن است فقط یکی از مسیرهای بالا وجود داشته باشد. در نسخههای جدید Ubuntu معمولاً Jenkins با systemd Service مدیریت میشود.
بارگذاری مجدد تنظیمات systemd
اگر فایل سرویس را تغییر دادهاید، ابتدا تنظیمات systemd را مجدداً بارگذاری کنید:
sudo systemctl daemon-reload
راهاندازی مجدد Jenkins
اکنون سرویس Jenkins را ریاستارت کنید:
sudo systemctl restart jenkins
بررسی وضعیت سرویس
برای اطمینان از اجرای صحیح Jenkins دستور زیر را اجرا کنید:
sudo systemctl status jenkins
در صورت اجرای صحیح، خروجی مشابه زیر خواهد بود:
● jenkins.service
Loaded: loaded (/usr/lib/systemd/system/jenkins.service)
Active: active (running)
اگر وضعیت سرویس failed بود، لاگها را بررسی کنید:
sudo journalctl -u jenkins -n 50 --no-pager
راهاندازی مجدد Nginx
پس از اعمال تنظیمات، سرویس Nginx را نیز ریاستارت کنید:
sudo systemctl restart nginx
سپس وضعیت آن را بررسی کنید:
sudo systemctl status nginx
در صورت موفقیت خروجی مشابه زیر خواهید دید:
● nginx.service
Loaded: loaded
Active: active (running)
بررسی پورت Jenkins
برای اطمینان از اینکه Jenkins فقط روی localhost در حال اجراست، دستور زیر را اجرا کنید:
sudo ss -tlnp | grep 8080
خروجی صحیح باید مشابه زیر باشد:
LISTEN 0 128 127.0.0.1:8080
اگر به جای 127.0.0.1 مقدار 0.0.0.0:8080 نمایش داده شود، یعنی Jenkins همچنان از بیرون شبکه نیز قابل دسترس است و تنظیمات بهدرستی اعمال نشدهاند.
مرحله سوم: تست Reverse Proxy و بررسی SSL
اکنون که Jenkins و Nginx را پیکربندی کردهاید، زمان آن رسیده که عملکرد Reverse Proxy و گواهی SSL را بررسی کنید.
بررسی دسترسی از طریق HTTPS
مرورگر خود را باز کرده و دامنه Jenkins را وارد کنید:
https://jenkins.example.com
اگر همه مراحل را بهدرستی انجام داده باشید:
- صفحه Jenkins بدون خطا باز میشود.
- قفل امنیتی (SSL) در کنار آدرس مرورگر نمایش داده میشود.
- ارتباط کاملاً رمزنگاری شده خواهد بود.
بررسی ریدایرکت HTTP به HTTPS
اکنون نسخه HTTP سایت را باز کنید:
http://jenkins.example.com
باید بهصورت خودکار به آدرس زیر منتقل شوید:
https://jenkins.example.com
برای بررسی از طریق ترمینال نیز میتوانید دستور زیر را اجرا کنید:
curl -I http://jenkins.example.com
نمونه خروجی:
HTTP/1.1 301 Moved Permanently
Location: https://jenkins.example.com
بررسی عملکرد Reverse Proxy
یکی از سادهترین روشها برای اطمینان از عملکرد Reverse Proxy این است که هدرهای پاسخ را بررسی کنید:
curl -I https://jenkins.example.com
در صورت موفقیت، خروجی مشابه زیر مشاهده خواهید کرد:
HTTP/2 200
server: nginx
این خروجی نشان میدهد که درخواست ابتدا توسط Nginx دریافت شده و سپس به Jenkins ارسال شده است.
رفع خطای Reverse Proxy
یکی از خطاهای رایج Jenkins پس از راهاندازی Reverse Proxy، پیام زیر است:
It appears that your reverse proxy setup is broken.
در صورت مشاهده این پیام، موارد زیر را بررسی کنید:
1. تنظیم proxy_pass
حتماً مقدار زیر را استفاده کنید:
proxy_pass http://127.0.0.1:8080;
وجود اسلش (/) در انتهای آدرس معمولاً باعث بروز این خطا میشود.
2. تنظیم proxy_redirect
مقدار آن باید دقیقاً مشابه دامنه شما باشد:
proxy_redirect http://127.0.0.1:8080 https://jenkins.example.com;
3. فعال بودن WebSocket
وجود این دو خط ضروری است:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
در غیر این صورت برخی قابلیتهای Jenkins مانند نمایش زنده Console Output ممکن است بهدرستی کار نکنند.
4. بررسی لاگهای Nginx
اگر هنوز مشکل وجود دارد، ابتدا لاگ خطا را بررسی کنید:
sudo tail -f /var/log/nginx/jenkins.error.log
همچنین لاگ دسترسی:
sudo tail -f /var/log/nginx/jenkins.access.log
5. بررسی لاگ Jenkins
برای مشاهده لاگهای Jenkins:
sudo journalctl -u jenkins -f
این لاگها معمولاً علت اصلی خطا را مشخص میکنند.
تغییر رمز عبور مدیر Jenkins
برای اطمینان از اینکه همه چیز بهدرستی کار میکند، وارد Jenkins شوید.
از منوی بالا روی نام کاربری خود کلیک کنید.
سپس مسیر زیر را باز کنید:
Manage Account → Configure
رمز عبور جدید خود را وارد کرده و تغییرات را ذخیره کنید.
اگر عملیات بدون خطا انجام شود، ارتباط امن بین مرورگر، Nginx و Jenkins برقرار است.
بررسی گواهی SSL
برای مشاهده جزئیات گواهی نصبشده میتوانید دستور زیر را اجرا کنید:
openssl s_client -connect jenkins.example.com:443
در خروجی باید اطلاعات گواهی Let’s Encrypt و زنجیره اعتبار (Certificate Chain) نمایش داده شود.
جمعبندی
اکنون Jenkins شما:
- از طریق HTTPS در دسترس است.
- تمامی ارتباطات با SSL رمزنگاری میشوند.
- کاربران دیگر به پورت 8080 دسترسی مستقیم ندارند.
- Nginx بهعنوان Reverse Proxy تمام درخواستها را مدیریت میکند.
- امنیت سرویس نسبت به حالت پیشفرض بهطور قابل توجهی افزایش یافته است.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران