بلاگ ابرفردوسی > آموزش سرور ابری : آموزش آپلود پروژه پایتون روی سرور ابری (Nginx، Flask و…)

آموزش آپلود پروژه پایتون روی سرور ابری (Nginx، Flask و…)

آپلود پروژه پایتون روی سرور

بسیاری از توسعه‌دهندگان پس‌از اتمام کدنویسی در محیط لوکال، با این چالش مواجه می‌شوند که چگونه کدهای خود را به یک محیط عملیاتی پایدار منتقل کنند. فرایند آپلود پروژه پایتون روی سرور برخلاف اجرای محلی، نیازمند پیکربندی دقیق زیرساخت است تا برنامه بدون قطعی و با امنیت بالا به درخواست‌ها پاسخ دهد. برای حل سریع این مسئله، مسیر استاندارد استقرار شامل چهار گام اصلی است: انتقال فایل‌های پروژه به سرور، آماده‌سازی محیط مجازی و نصب وابستگی‌ها، اجرای اولیه پروژه و در نهایت دائمی‌سازی و پیکربندی وب‌سرور برای محیط عملیاتی (Production).

با توجه به اینکه آموزش‌های پراکنده معمولاً به اجرای موقت پروژه بسنده می‌کنند، در این مقاله از ابر فردوسی به‌صورت قدم‌به‌قدم، نحوه انتقال پروژه پایتون از ویندوز به سرور لینوکس (اوبونتو) را بررسی خواهیم کرد. در ادامه یاد می‌گیرید چطور با ابزارهای استانداردی مانند Gunicorn و Nginx، پروژه Flask یا Django خود را روی سرور مجازی یا ابری مستقر کنید و با ساخت سرویس systemd، از اجرای دائمی پروژه پایتون اطمینان حاصل کنید.

پیش‌نیازهای آپلود پایتون روی سرور

پیش‌نیازهای آپلود پایتون روی سرور

قبل‌از اینکه اولین خط دستور را در ترمینال سرور اجرا کنیم، باید مطمئن شویم که زیرساخت ما برای میزبانی پروژه Python آمادگی کامل دارد. بررسی این چک‌لیست، فرایند کار را سرعت می‌بخشد و مانع از برخورد با خطاهای پیکربندی در مراحل بعدی می‌شود. طبق مستندات رسمی مدیریت اسکریپت‌ها روی پلتفرم‌های مبتنی بر یونیکس (Unix) -بسته‌ به فریم‌ورک پروژه شما- لایه اولیه سرور باید به این ابزارها مجهز باشد:

  1. دسترسی SSH به سرور:

داشتن یک آی‌پی اختصاصی (ابری یا مجازی) همراه با نام کاربری (معمولاً root یا کاربری با دسترسی sudo) و کلید SSH یا رمز عبور برای اتصال ایمن به خط فرمان لینوکس

  1. نصب پایتون و ابزار pip:

توزیع‌های مدرن لینوکس معمولاً مجهز به پایتون ۳ هستند. بااین‌حال، باید وضعیت نصب پایتون روی سرور لینوکس و پکیج‌منیجر pip را متناسب با نسخه لوکال خود بررسی کنید. اگر هنوز در ابتدای راه هستید، مطالعه مقاله پایتون چیست دید فنی بهتری درباره معماری این زبان به شما می‌دهد.

  1. پروژه آماده و تست‌شده (Flask / Django):

برنامه‌ای که در سیستم شخصی شما بدون خطا اجرا می‌شود. فرقی هم نمی‌کند که به‌دنبال راه اندازی Django روی اوبونتو باشید یا اجرای پروژه Flask روی سرور؛ کدهای شما باید بدون وابستگی به مسیرهای محلی (Absolute Paths) آماده انتقال باشند.

  1. آشنایی اولیه با خط فرمان لینوکس:

بلد بودن چند دستور پایه مانند cd برای جابه‌جایی بین دایرکتوری‌ها، ls برای مشاهده فایل‌ها و یک ویرایشگر متنی مثل nano یا vim برای تغییرات سریع در کانفیگ‌ها

💡 ترفند کاربردی
همیشه قبل‌از شروع فرایند استقرار، در محیط لوکال خود با اجرای دستور pip freeze > requirements.txt یک نسخه کامل از تمام کتابخانه‌ها و وابستگی‌های پروژه تهیه کنید. این فایل دقیقاً شبیه به یک شناسنامه فنی برای پروژه است و تضمین می‌کند که سرور دقیقاً همان پکیج‌هایی را نصب می‌کند که کد شما برای اجرا به آن‌ها نیاز دارد.

انتخاب بستر مناسب برای دیپلوی

یکی از حیاتی‌ترین تصمیم‌ها قبل‌از آپلود پروژه پایتون روی سرور، انتخاب زیرساخت و بستر میزبانی مناسب است. بسیاری از توسعه‌دهندگان در این مرحله بین گزینه‌های مختلف مثل هاست اشتراکی، سرور مجازی (VPS) و سرور ابری مردد می‌مانند. واقعیت این است که پایتون و فریم‌ورک‌های محبوب آن (مانند جنگو و فلسک) برای اجرای استاندارد به دسترسی‌های سیستمی سطح بالا، پایداری بالا و مدیریت منابع پویا نیاز دارند؛ نیازی که هر بستری نمی‌تواند آن را به درستی برآورده کند.

برای اینکه دید دقیق‌تری نسبت به لایه‌های مختلف میزبانی داشته باشید، تفاوت فنی این سه بستر را در جدول زیر خلاصه کرده‌ایم:

فاکتورهای کلیدیهاست اشتراکی پایتونسرور مجازی (VPS)سرور ابری
دسترسی به ترمینال (Root)بسیار محدود یا غیرمجازکامل (محدود به یک ماشین فیزیکی)کامل همراه با ابزارهای مدیریت پیشرفته لایه‌ای
مقیاس‌پذیری منابع (Scalability)غیرممکن یا همراه با ارتقای فرسایندهنیازمند خاموشی سرور و ارتقای دستیآنی، خودکار و بدون ثانیه‌ای قطعی در پروژه
ساختار پرداخت هزینه‌هاثابت و دوره‌ای (ماهانه/سالانه)ثابت (در ابر فردوسی ساعتی)پویای ساعتی و براساس میزان مصرف واقعی
پایداری و ساختار سخت‌افزاروابسته به حجم مصرف سایت‌های همسایهوابسته به سلامت یک سخت‌افزار واحدتوزیع‌شده روی کلاستری از چندین سرور فیزیکی

چرا سرور ابری برای پروژه پایتون بهتر است؟

اگر تجربه کار با هاست‌های اشتراکی را داشته باشید، احتمالاً می‌دانید که محدودیت در تغییر نسخه‌های پایتون، نبود امکان ساخت محیط‌های مجازی اختصاصی یا محدودیت کانفیگ وب‌سرور چقدر می‌تواند فرساینده باشد. از طرفی سرورهای مجازی سنتی همیشه ریسک وابستگی به یک سخت‌افزار فیزیکی واحد (Single Point of Failure) را به همراه دارند. به همین دلیل، نصب پروژه پایتون روی سرور ابری به دلایل زیر منطقی‌ترین رویکرد برای محیط‌های عملیاتی شما است:

  • کنترل مطلق روی معماری سیستم: شما دسترسی کامل Root دارید تا هر نسخه‌ای از وب‌سرورهای Nginx یا ابزارهای مدیریت فرایند عملیاتی مانند Gunicorn و سرویس‌های systemd لینوکس را بدون محدودیت کانفیگ کنید.
  • مقیاس‌پذیری بدون دغدغه (Elasticity): اگر در یک بازه زمانی (مثل کمپین‌های فروش یا ورودی بالای کاربران) ترافیک پروژه شما ناگهان ده برابر شود، بدون نیاز به کانفیگ مجدد یا جابه‌جایی سرور، می‌توانید منابع رم و پردازنده را در لحظه ارتقا دهید.
  • دسترسی و پایداری مداوم: توزیع داده‌ها در زیرساخت ابری تضمین می‌کند که حتی درصورت بروز نقص سخت‌افزاری در یک لایه از دیتاسنتر، معماری پروژه پایتونی شما روی لایه دیگری زنده و در دسترس باقی بماند.

حالا که تفاوت لایه‌های زیرساخت را بررسی کردیم و مشخص شد چرا معماری ابری بهترین بازدهی فنی را برای برنامه‌های امروزی دارد، مراحل اجرایی این آموزش را روی سرور ابری فردوسی پیش می‌بریم تا فرایند کار با ترمینال لینوکس را به شکل کاملاً واقعی، استاندارد و در یک محیط Production تجربه کنیم.

انتقال فایل‌های پروژه به سرور لینوکس

مقایسه روش‌های انتقال فایل به سرور

پس‌از انتخاب زیرساخت، نوبت به انتقال فایل به سرور لینوکس می‌رسد. شما باید کدهایی را که در سیستم خود (محیط لوکال) نوشته‌اید به دیسک سرور منتقل کنید. برای این کار سه روش اصلی وجود دارد که بسته به ابزارها و ساختار مدیریت پروژه خود می‌توانید یکی از آن‌ها را انتخاب کنید:

۱- روش Git Clone (راهکار استاندارد و حرفه‌ای):

بهترین و تمیزترین روش برای پروژه‌های پویا، آپلود کدها روی یک مخزن گیت (مثل آپلود کدها در GitHub یا GitLab) و سپس کلون کردن آن در سرور است. این روش فرایند توسعه و به‌روزرسانی‌های بعدی پروژه را بسیار ساده می‌کند.

۲- پروتکل SCP (سریع و بدون واسطه):

اگر تمایلی به استفاده از گیت ندارید یا پروژه کوچکی دارید، می‌توانید از فرمان سیف‌کپی لینوکس استفاده کنید که فایل‌ها را در بستر امن SSH منتقل می‌کند. برای این کار « آموزش انتقال فایل ازطریق SCP» را بخوانید.

۳- ابزارهای FTP/SFTP (کمتر پیشنهاد می‌شود):

مثل استفاده از FileZilla و نرم‌افزارهای مشابه. این روش به‌دلیل نیاز به محیط گرافیکی و سرعت پایین‌تر در تعداد فایل‌های زیاد (مثل پوشه پکیج‌ها)، برای پروژه‌های پایتونی چندان توصیه نمی‌شود.

مثال عملی- آموزش استقرار پروژه پایتون روی لینوکس با دستور SCP

برای انتقال مستقیم پروژه از ویندوز یا مک به سرور اوبونتو، ترمینال سیستم خود را باز کنید و از ابزار بومی scp استفاده کنید. فرض کنید پوشه پروژه شما در مسیر لوکال قرار دارد و می‌خواهید آن را به پوشه /var/www/ سرور منتقل کنید.

دستور زیر را در ترمینال سیستم خود (نه سرور) اجرا کنید:

scp -r /path/to/local/my_project root@your_server_ip:/var/www/
  • نکته فنی: سوئیچ -r به ساختار دستور می‌فهماند که کل پوشه پروژه را همراه با تمام زیرپوشه‌ها و فایل‌های درون آن به‌صورت بازگشتی (Recursive) کپی کند.

آماده‌سازی محیط اجرای پروژه و نصب وابستگی‌ها

مراحل ۴ گانه آماده‌سازی محیط پایتون در سرور

پس‌از اینکه فایل‌ها با موفقیت منتقل شدند، نوبت به کانفیگ لایه سیستم‌عامل و پایتون می‌رسد. پایداری یک اپلیکیشن در فاز عملیاتی، کاملاً به جداسازی پکیج‌ها و تنظیم درست محیط وابسته است. برای راه اندازی پروژه python روی لینوکس مراحل زیر را قدم‌به‌قدم پیش می‌بریم:

۱- بروزرسانی مخازن سرور

ابتدا ازطریق SSH به سرور متصل شوید. قبل‌از نصب هرگونه ابزار، حتماً لیست پکیج‌های مخازن لینوکس را به‌روزرسانی کنید تا سیستم به آخرین نسخه‌ها دسترسی داشته باشد:

sudo apt update && sudo apt upgrade -y

۲- بررسی وضعیت و نصب Python و Pip

توزیع‌های مدرن لینوکس معمولاً مجهز به نسخه پایدار پایتون ۳ هستند. ابتدا با دستورهای زیر وضعیت سیستم را بررسی کنید:

python3 --version
pip3 --version

اگر ابزار مدیریت پکیج پایتون (pip) یا ماژول ساخت محیط مجازی روی سیستم نصب نبود، با اجرای فرمان زیر، عملیات نصب پایتون و سایر ابزارهای زیرساختی را کامل کنید:

sudo apt install python3-pip python3-venv -y

۳- ساخت محیط مجازی (virtualenv)

یکی از خطاهای رایج در آموزش دیپلوی پروژه پایتون روی لینوکس، نصب پکیج‌ها به‌صورت سراسری (Global) روی سرور است. این کار باعث تداخل وابستگی‌های سیستم‌عامل با پکیج‌های اپلیکیشن شما می‌شود. برای جلوگیری از این مشکل، وارد پوشه پروژه شوید و یک محیط ایزوله بسازید:

cd /var/www/آدرس پروژه
python3 -m venv venv

پس‌از ساخت، باید محیط مجازی را فعال کنید تا ترمینال از این پس پکیج‌ها را فقط درون همین محیط نصب و فراخوانی کند:

source venv/bin/activate

نشانه تایید: پس‌از اجرای این دستور، عبارت (venv) در ابتدای خط فرمان ترمینال شما ظاهر می‌شود.

نحوه اجرای محیط ایزوله venv

۴- نصب وابستگی‌ها

حالا که محیط مجازی فعال است، با استفاده از فایلی که در سیستم شخصی خود اگزکپت کرده بودید، تمام کتابخانه‌ها (مانند داکیومنت رسمی PIP) را به‌صورت یک‌جا و با نسخه‌های دقیق روی سرور نصب کنید:

pip install -r requirements.txt
⚠️ هشدار خیلی مهم
هرگز زمانی که محیط مجازی (virtualenv) شما فعال است، دستورات نصب پکیج پایتون را با پیشوند sudo اجرا نکنید. استفاده از sudo pip install باعث می‌شود پکیج‌ها از کانتینر ایزوله محیط مجازی خارج شوند و به‌صورت سراسری روی کل سرور لینوکس نصب شوند که پایداری سایر ابزارها را به خطر می‌اندازد.

اجرای پروژه پایتون روی سرور

حالا که فایل‌ها منتقل شده و محیط مجازی شما با موفقیت پیکربندی شده است، به نیت اصلی و مرحله هیجان‌انگیز کار یعنی اجرای پروژه پایتون روی سرور می‌رسیم. هدف ما در این مرحله این است که ابتدا مطمئن شویم تمام ماژول‌ها درست کار می‌کنند و هیچ خطای منطقی یا پکیج جاافتاده‌ای در کد وجود ندارد.

بسته به اینکه فرانت‌اِند و معماری ساختار برنامه خود را با چه فریم‌ورکی توسعه داده‌اید، نحوه صدا زدن لایه اولیه مفسر پایتون متفاوت خواهد بود:

  • راه اندازی Flask روی سرور (نسخه تست): اگر از فریم‌ورک فلسک استفاده می‌کنید و یک فایل راه‌انداز مثل app.py دارید، پس‌از اطمینان از فعال بودن محیط مجازی، دستور زیر را وارد کنید:
python app.py
  • راه اندازی Django روی اوبونتو (نسخه تست): برای پروژه‌های مبتنی بر Django، باید از فایل مدیریت سنتی آن کمک بگیرید. برای اینکه پروژه روی آی‌پی سرور هم موقتاً قابل رویت باشد، پورت را مشخص می‌کنیم:
python manage.py runserver 0.0.0.0:8000
⚠️ هشدار خیلی مهم
ابزارهای runserver در جنگو و سرور داخلی فلسک، صرفاً برای محیط توسعه طراحی شده‌اند. داکیومنت‌های رسمی این دو فریم‌ورک به وضوح هشدار می‌دهند که این متدها تک‌رشته‌ای (Single-threaded) هستند، امنیت پایینی دارند، دربرابر ترافیک هم‌زمان کرش می‌کنند و به‌محض بستن ترمینال SSH، فرایند اجرا کاملاً متوقف می‌شود؛ بنابراین هرگز از این دستورات برای بالا نگه داشتن یک سایت واقعی استفاده نکنید.

اجرای حرفه‌ای و عملیاتی با Gunicorn و Nginx

برای اینکه آپلود پروژه پایتون روی سرور به یک خروجی استاندارد، تجاری و آماده زیر بار ترافیک (Production Ready) تبدیل شود، باید از ترکیب طلایی وب‌سرور و سرور WSGI استفاده کنیم. راهکار استاندارد در دنیای لینوکس، دیپلوی پروژه پایتون با Nginx و Gunicorn است.

در این معماری هوشمند:

۱. انجین‌ایکس (Nginx) به‌عنوان خط مقدم (Reverse Proxy) درخواست‌های وب (پورت 80 و 443) را از کاربران تحویل می‌گیرد.

۲. درخواست‌ها را به‌صورت امن به گانیکورن (Gunicorn) که مفسر لایه پایتون است پاس می‌دهد.

۳. این تفکیک وظایف مزایای فوق‌العاده‌ای دارد:

  • امنیت بالا: کدهای اصلی پایتون مستقیماً در معرض اینترنت قرار نمی‌گیرند.
  • پایداری بی‌نقص: اگر یک درخواست به هر دلیلی کرش کند، سایر رشته‌ها فرایند پاسخ‌دهی را ادامه می‌دهند.
  • عملکرد بهینه: مدیریت فایل‌های استاتیک (تصاویر و CSSها) به انجین‌ایکس سپرده می‌شود که در این کار استاد است.

۱- نصب Gunicorn

ابتدا مطمئن شوید که محیط مجازی شما فعال است ((venv) در ابتدای ترمینال باشد). سپس ابزار Gunicorn را مستقیماً درون محیط ایزوله پروژه نصب کنید:

pip install gunicorn

۲- اجرای پروژه با Gunicorn

برای تست پایداری، می‌خواهیم اپلیکیشن را به‌جای سرور پیش‌فرض پایتون، با گانیکورن صدا بزنیم.

برای اجرای پروژه Flask روی سرور:

فرض می‌کنیم نام فایل اصلی شما app.py و متغیر نمونه فلسک درون آن app است:

gunicorn --workers 3 app:app

برای پروژه جنگو:

وارد پوشه اصلی حاوی فایل manage.py شده و ماژول wsgi پروژه را صدا بزنید:

gunicorn --workers 3 myproject.wsgi
💡 ترفند کاربردی
فرمول استاندارد برای تعیین تعداد واکرها (Workers)، ضرب تعداد هسته‌های پردازنده سرور در عدد ۲ و جمع آن با عدد ۱ است (Core * 2 + 1).

۳- تنظیم Nginx به‌عنوان Reverse Proxy

حالا که گانیکورن روی پورت داخلی سرور (معمولاً 8000) گوش‌به‌زنگ است، باید سراغ تنظیم Nginx برای پایتون برویم تا درخواست‌های ورودی کاربران را به این پورت هدایت کند. ابتدا وب‌سرور انجین‌ایکس را روی لینوکس نصب کنید:

sudo apt install nginx -y

سپس یک فایل پیکربندی جدید برای پروژه خود در مسیر وب‌سرور بسازید:

sudo nano /etc/nginx/sites-available/my_project

بلوک کانفیگ زیر را درون فایل قرار دهید (آی‌پی سرور یا دامنه خود را جایگزین my_domain کنید):

Nginx
server {
    listen 80;
    server_name my_domain;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static/ {
        alias /var/www/my_project/static/;
    }
}

برای فعال‌سازی این کانفیگ، یک لینک نمادین (Symlink) به پوشه فعال انجین‌ایکس بسازید، صحت ساختار کد را تست و درنهایت وب‌سرور را ری‌استارت کنید:

sudo ln -s /etc/nginx/sites-available/my_project /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

نکته تجربی:

اگر پس‌از اعمال تنظیمات انجین‌ایکس با خطای معروف 502 Bad Gateway مواجه شدید، به این معنی است که وب‌سرور نمی‌تواند پورت داخلی گانیکورن را لمس کند. سریع‌ترین راه حل، بررسی وضعیت روشن بودن فرایند گانیکورن در پس‌زمینه سرور یا سوییچ کردن به راهکار پایدارترِ لینک سوکت یونیکس (.sock) به‌جای پورت 127.0.0.1:8000 در فایل کانفیگ است.

اجرای برنامه پایتون به صورت دائمی روی سرور

تا اینجای کار، فرایند آپلود پروژه پایتون روی سرور را جلو برده‌ایم و حتی توانسته‌ایم اپلیکیشن را با وب‌سرور Nginx و مفسر Gunicorn هماهنگ کنیم. اما هنوز یک باگ بزرگ وجود دارد؛ اگر همین حالا ترمینال SSH را ببندید یا سرور به هر دلیلی (مثل به‌روزرسانی یا قطعی موقت) ری‌استارت شود، پروسس گانیکورن کاملاً متوقف می‌شود و کاربران با صفحه خطای وب‌سرور مواجه خواهند شد.

برای حل این مسئله و تنظیم اجرای دائمی پروژه پایتون، باید مدیریت فرایند اپلیکیشن را به ابزار بومی لینوکس یعنی systemd بسپاریم. سیستم‌دی به‌عنوان یک ناظر همیشگی در پس‌زمینه سیستم‌عامل عمل می‌کند؛ به این معنی که هم‌زمان با روشن شدن سرور، پروژه شما را خودکار استارت می‌زند و اگر کد کرش کند، بلافاصله آن را احیا (Restart) می‌کند.

گام اول- ساخت سرویس systemd برای Python

چرخه ۴ مرحله‌ای مدیریت سرویس پایتون با Systemd

برای معرفی فرایند اجرای پروژه به لینوکس، ابتدا باید یک فایل پیکربندی با پسوند service در دایرکتوری سرویس‌های سیستم بسازید:

sudo nano /etc/systemd/system/my_project.service

حالا ساختار استاندارد زیر را درون این فایل متنی کپی کنید (مسیرها و نام کاربری را دقیقاً براساس دایرکتوری پروژه خودتان شخصی‌سازی کنید):

Ini, TOML
[Unit]
Description=Gunicorn instance to serve My Python Project
After=network.target

[Service]
User=root
WorkingDirectory=/var/www/my_project
Environment="PATH=/var/www/my_project/venv/bin"
ExecStart=/var/www/my_project/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 app:app

[Install]
WantedBy=multi-user.target

کاهش ابهام نرم‌افزاری (کدهای بالا دقیقاً چه کاری انجام می‌دهند؟):

  • User: مشخص می‌کند سرویس با دسترسی کدام کاربر سرور اجرا شود (برای امنیت بیشتر در پروژه‌های بزرگ، بهتر است یک کاربر محدود غیر از root بسازید).
  • WorkingDirectory: دایرکتوری اصلی پروژه شما در لینوکس که کدهای پایتون در آن جا خوش کرده‌اند.
  • Environment: آدرس پوشه bin در محیط مجازی (venv). این خط به سیستم می‌فهماند که برای اجرای پکیج‌ها باید به‌سراغ کانتینر ایزوله پروژه برود نه پایتون سراسری سرور.
  • ExecStart: فرمان نهایی و مطلقی که مشخص می‌کند گانیکورن چطور و روی چه پورتی اسکریپت شما را مفسری کند.

گام دوم- بارگذاری، استارت و فعال‌سازی سرویس

پس‌از ذخیره و بستن فایل سرویس، باید به لینوکس اطلاع دهیم که یک تغییر لایه‌ای در ساختار فرایندها رخ داده است. این فرایند عملیاتی را با اجرای ۳ دستور ساده زیر در ترمینال نهایی کنید:

۱. ابتدا مدیر سرویس‌های لینوکس را مجدداً اسکن کنید تا فایل جدید را بشناسد:

sudo systemctl daemon-reload

۲. سرویس اختصاصی پروژه پایتونی خود را استارت بزنید:

sudo systemctl start my_project

۳. در نهایت، سرویس را enable کنید تا به لینوکس بفهمانید حتی پس‌از خاموش و روشن شدن سخت‌افزار، این برنامه باید خودکار بالا بیاید:

sudo systemctl enable my_project

حالا برای اینکه مطمئن شوید وضعیت خروجی کاملاً سبز (Active) است و کدهای شما چراغ‌خاموش درحال پاسخ به درخواست‌ها هستند، وضعیت پایداری آن را چک کنید:

sudo systemctl status my_project
💡 ترفند کاربردی
اگر سرویس پایتونی شما استارت نشد یا وضعیت آن روی حالت failed رفت، اصلاً کلافه نشوید! فوت کوزه‌گری عیب‌یابی در لینوکس، استفاده از ابزار لاگ‌گیری سیستم‌دی است. کافی‌ست دستور sudo journalctl -u my_project.service -n 50 –no-pager را اجرا کنید تا ۵۰ خط آخر لاگ‌های واقعی لایه مفسر را به شما نشان دهد؛ این لاگ‌ها دقیقاً مثل ترمینال سیستم شخصی‌تان، آدرس دقیق خطای پایتونی یا پکیج جاافتاده را لو می‌دهند.

نکات حیاتی برای استقرار و دیپلوی بهینه

رساندن پروژه به مرحله اجرا پایان کار نیست. برای اینکه فرایند آپلود پروژه پایتون روی سرور یک خروجی پایدار، امن و بدون عیب‌ونقص داشته باشد، باید چند تنظیم امنیتی و نظارتی لایه‌ای را هم روی سیستم‌عامل اعمال کنید. نادیده‌گرفتن این موارد، درست مثل رها کردن درِ یک خانه نوساز به‌صورت چهارطاق است! پس قبل‌از بستن نهایی ترمینال، این ۴ فاکتور طلایی را بررسی کنید:

۱- مدیریت پورت‌ها با دیوار آتشین (Firewall)

لینوکس اوبونتو به‌صورت پیش‌فرض تمام ترافیک‌های ورودی را باز می‌گذارد مگر اینکه فایروال را کانفیگ کنید. شما باید تمام پورت‌های ورودی سرور را مسدود کنید و فقط به سه شاه‌راه اصلی اجازه عبور دهید: پورت ۸۰ (HTTP)، پورت ۴۴۳ (HTTPS) و پورت اختصاصی SSH شما.

با دستورات زیر در ابزار UFW این لایه حفاظتی را فعال کنید:

sudo ufw allow 'Nginx Full'
sudo ufw allow 22
sudo ufw enable

۲- فعال‌سازی پروتکل امن HTTPS و عیب‌یابی آن در ایران

اجرای پروژه روی بستر ناامن HTTP یک سیگنال منفی بزرگ برای تجربه کاربری و سئوی سایت است. در اسناد بین‌المللی معمولاً کلاینت رسمی بنیاد Let’s Encrypt یعنی ابزار Certbot را برای دریافت گواهی SSL رایگان پیشنهاد می‌کنند. اما اگر فرایند دیپلوی پروژه پایتون را روی دیتاسنترهای داخلی پیش برده باشید، احتمالاً می‌دانید که اجرای دستورات استاندارد سرت‌بات در ایران معمولاً به‌دلیل اختلالات ترافیک بین‌الملل، فیلترینگ SNI یا عدم امکان اتصال سرورهای Let’s Encrypt به آی‌پی ایران با خطاهای فرساینده Timeout یا Network is unreachable شکست می‌خورد.

برای حل این چالش شبکه و تضمین پایداری ارتباط، دو راهکار کاملاً عملیاتی پیش رو دارید:

راهکار اول؛ استفاده از چالش دی‌ان‌اس (DNS-01 Challenge):

در این متد، سرور Let’s Encrypt برای تأیید مالکیت، نیازی به لمس مستقیم آی‌پی سرور ایرانی شما ندارد؛ بلکه صحت یک رکورد متنی (TXT Record) را روی لایه مدیریت DNS دامنه شما بررسی می‌کند. این روش بهترین راهکار برای سرورهای پشت اینترنت ملی است:

sudo certbot certonly --manual --preferred-challenges dns -d domain.com

راهکار دوم؛ هندل کردن SSL در لبه شبکه (Edge Termination):

اگر برای اجرای پروژه پایتون روی سرور از زیرساخت‌های ابری یا خدمات CDN استفاده می‌کنید، اصلاً نیازی به نصب سرت‌بات روی سیستم‌عامل لینوکس نیست. ترافیک وب در لبه شبکه (Edge) توسط لایه ابری رمزنگاری شده و درخواست‌ها به‌صورت سالم و سبک به پورت داخلی گانیکورن شما پاس داده می‌شوند.

ترفند ویژه شبکه ایران

اگر اصرار دارید از همان متد پیش‌فرض –nginx استفاده کنید اما سرور داخلی امکان برقراری ارتباط با لایه API لِتس‌انکریپت را ندارد، ترافیک ابزار را موقتاً با تنظیم متغیرهای محیطی از یک لایه پروکسی عبور دهید. حتماً دستور سرت‌بات را با سوئیچ -E اجرا کنید تا لینوکس متغیرهای پروکسی را به کاربر root نیز منتقل کند:

export HTTP_PROXY="http://your-proxy-ip:port"
export HTTPS_PROXY="http://your-proxy-ip:port"
sudo -E certbot --nginx -d yourdomain.com

۳- مانیتورینگ مداوم لاگ‌های سیستم

وقتی پروژه زیر بار ترافیک می‌رود، ممکن است رفتارهای پیش‌بینی‌نشده‌ای از خود نشان دهد. برای ردیابی این موارد، فرایند مانیتورینگ لاگ‌ها را به یک عادت روزانه تبدیل کنید. دو فایل اصلی که مثل جعبه سیاه هواپیما رفتار اپلیکیشن شما را ثبت می‌کنند در مسیرهای زیر هستند:

  • لاگ‌های وب‌سرور: /var/log/nginx/error.log
  • لاگ‌های لایه پایتون: با فرمان sudo journalctl -u my_project.service -f به صورت زنده (Real-time) لاگ‌ها را اسکن کنید.

۴- بازنگری در امنیت SSH سرور لینوکس

بزرگ‌ترین گلوگاه امنیتی، پورت پیش‌فرض ۲۲ لینوکس است که بات‌های هکر به‌صورت شبانه‌روزی روی آن حملات Brute-force اجرا می‌کنند. برای بالا بردن امنیت سرور:

۱. حتماً ورود با رمز عبور را غیرفعال کرده و فقط اتصال ازطریق SSH Key را مجاز کنید.

۲. با ویرایش فایل /etc/ssh/sshd_config پورت ۲۲ را به یک پورت تصادفی و ناشناس (مثل ۴۹۲۲) تغییر دهید.

جمع‌بندی

مسیر طولانی اما شیرینی را طی کردیم. از کدهای سیستم شخصی‌تان شروع کردیم، لایه‌های سیستم‌عامل لینوکس را کنار زدیم، محیط‌های مجازی را ایزوله کردیم و در نهایت با هماهنگ کردن Nginx و Gunicorn در بستر ناظر سیستم‌دی، یک پروژه خام پایتونی را به یک وب‌سایت عملیاتی واقعی تبدیل کردیم. فرایند آپلود پروژه پایتون روی سرور شاید در اولین تجربه‌ها کمی وحشتناک به‌نظر برسد، اما با تکرار این اصول استاندارد، متوجه می‌شوید که لینوکس بهترین و باثبات‌ترین بستر برای خلق ارزش با کدهای شما است.

حالا شما برای ما بنویسید؛ پروژه پایتونی شما با کدام فریم‌ورک توسعه داده شده است؟ فلسک، جنگو یا فست‌ای‌پی‌آی؟ در کدام‌یک از مراحل این راهنما با خطای ترمینالی مواجه شدید؟ چالش‌ها و تجربه‌های خودتان را در بخش نظرات با ما به اشتراک بگذارید تا در سریع‌ترین زمان ممکن باهم حل‌شان کنیم.

منابع:
realpython | docs.python | aws.amazon | linuxize | packaging.python |‌ docs.gunicorn |‌ nginx | flask.palletsprojects | docs.djangoproject | digitalocean

سرور ابری

سؤالات متداول

چگونه پروژه پایتون را روی سرور آپلود کنیم؟

فرایند استاندارد آپلود پروژه پایتون روی سرور شامل ۴ گام اصلی است: ابتدا فایل‌های پروژه را با Git یا SCP به لینوکس منتقل می‌کنید، سپس با ابزار venv یک محیط مجازی ایزوله ساخته و پکیج‌ها را نصب می‌کنید. در گام بعد پروژه را با یک سرور WSGI مانند Gunicorn بالا می‌آورید و در نهایت Nginx را به‌عنوان Reverse Proxy روبروی آن تنظیم می‌کنید تا درخواست‌های کاربران را به پایتون هدایت کند.

بهترین روش برای دیپلوی پروژه پایتون روی لینوکس چیست؟

استانداردترین راهکار در محیط‌های Production، استفاده از ترکیب طلایی Nginx + Gunicorn + systemd است. انجین‌ایکس ترافیک ورودی وب و فایل‌های استاتیک را مدیریت می‌کند، گانیکورن کدهای پایتون را مفسری می‌کند و سیستم‌دی (systemd) پایداری و اجرای دائمی پروسس را در پس‌زمینه سرور لینوکس تضمین می‌کند. برای پروژه‌های بزرگ‌تر و معماری میکروپلتفرم، کانتینرسازی با داکر (Docker) بهترین گزینه است.

پروژه پایتون را با چه روشی به سرور منتقل کنیم: SCP، Git یا FTP؟

پروتکل FTP به‌دلیل سرعت پایین و امنیت کم اصلاً پیشنهاد نمی‌شود. اگر پروژه شما کوچک است یا نمی‌خواهید کدها را عمومی کنید، دستور scp در ترمینال سریع‌ترین روش انتقال فایل به سرور لینوکس است. اما برای پروژه‌های تجاری و تیمی، مخازن گیت (Git Clone) به‌دلیل سهولت در به‌روزرسانی‌های بعدی، روش اصولی و حرفه‌ای محسوب می‌شود.

چرا باید برای میزبانی پروژه Python از virtualenv یا venv استفاده کنیم؟

نصب پکیج‌ها به‌صورت سراسری (Global) روی لینوکس، پایداری سیستم‌عامل را به خطر می‌اندازد و ممکن است نسخه کتابخانه‌های پروژه جدید شما با پروژه‌های قدیمی یا ابزارهای خودِ لینوکس تداخل پیدا کند. استفاده از venv یک کانتینر کاملاً ایزوله برای اپلیکیشن ایجاد می‌کند تا وابستگی‌ها فقط درون همان پوشه فراخوانی شوند.

Gunicorn چیست و چرا برای دیپلوی پایتون استفاده می‌شود؟

وب‌سرورهایی مثل Nginx مستقیماً قادر به فهم و مفسر کدهای پایتون نیستند. ابزار Gunicorn یک سرور اختصاصی استاندارد (WSGI) است که به‌عنوان واسط عمل می‌کند؛ این ابزار کدهای فریم‌ورک شما را اجرا می‌کند و خروجی آن را به انجین‌ایکس تحویل می‌دهد. گانیکورن با مدیریت هم‌زمان چندین پروسس (Workers)، پایداری پروژه را زیر بار ترافیک بالا می‌برد.

Nginx را چطور برای پروژه پایتون تنظیم کنیم؟

باید یک فایل کانفیگ اختصاصی در مسیر /etc/nginx/sites-available/ بسازید و با تعریف یک بلوک server، پورت ورودی اینترنت (پورت 80 یا 443) را به پورت یا سوکت داخلی گانیکورن (مثلاً 127.0.0.1:8000) هدایت (proxy_pass) کنید. همچنین توصیه می‌شود پوشه فایل‌های استاتیک پروژه را مستقیماً در انجین‌ایکس آدرس‌دهی کنید تا سرعت لود تصاویر و استایل‌ها چندین برابر شود.

چگونه پروژه پایتون را دائمی اجرا کنیم؟

برای این کار، هرگز نباید به دستوراتی مثل python app.py یا ابزارهای موقتی بسنده کنید. راهکار پروداکشن، ساخت یک فایل سرویس اختصاصی در دایرکتوری systemd لینوکس است. بااین‌کار، پروسس پروژه به یک دیمن (Daemon) سیستمی تبدیل می‌شود و با ری‌استارت شدن سرور یا کرش کردن کد، خودکار احیا و استارت می‌شود.

آیا می‌شود پروژه پایتون را با Docker روی سرور اجرا کرد؟

بله؛ کانتینرسازی با داکر یکی از مدرن‌ترین روش‌ها برای استقرارهای میکروسرویس است. شما تمام نیازمندی‌ها، نسخه پایتون و سیستم‌عامل را در یک Dockerfile بسته‌بندی می‌کنید. این روش تضمین می‌کند که پروژه بدون وابستگی به کانفیگ‌های لایه‌ای سرور میزبان، در هر محیطی دقیقاً مشابه لوکال اجرا شود و فرایند نصب پروژه پایتون روی سرور را بسیار چابک می‌کند.

آیا اجرای پروژه پایتون روی سرور ابری بهتر از هاست معمولی است؟

بدون شک بله. هاست‌های اشتراکی پایتون دسترسی ترمینال (Root) را به شما نمی‌دهند، امکان تنظیم وب‌سرور دلخواه را سلب می‌کنند و پایداری کدهای شما به حجم مصرف سایت‌های همسایه وابسته است. در مقابل، نصب روی سرور ابری کنترل مطلق سیستم‌عامل را در اختیارتان می‌گذارد و اجازه می‌دهد منابع سخت‌افزاری رم و پردازنده را در لحظه و متناسب با رشد ترافیک، بدون قطعی ارتقا دهید.

یاسین اسدی

اگه می‌خوای زندگیت تغیر کنه کتاب نخون؛ نوشته‌های منو بخون!
پست های مرتبط

آموزش اتصال هارد به سرور لینوکس

پر شدن ناگهانی فضای ذخیره‌سازی، یکی از دغدغه‌های همیشگی در مدیریت زیرساخت است و در چنین شرایطی، اضافه کردن یک دیسک جدید سریع‌ترین راهکار محسوب می‌شود. بااین‌حال، بسیاری از ادمین‌ها هنگام اجرای این فرایند با چالش‌هایی مثل…

۱۷ مرداد ۱۴۰۵

خطای 504 کلودفلر؛ آموزش کامل رفع ارور 504 Gateway Timeout

مواجه شدن با خطای 504 کلودفلر (Cloudflare 504 Error) به این معنی است که شبکه توزیع محتوا (CDN) زمان زیادی را منتظر پاسخ سرور شما مانده و در نهایت منصرف شده است. این وضعیت که با نام…

۱۷ مرداد ۱۴۰۵

خطای 502 nginx: راهنمای کامل و سریع رفع ارور Bad Gateway

وقتی هنگام مدیریت یا بازدید از یک سایت با خطای 502 nginx مواجه می‌شوید، یعنی ارتباط بین وب‌سرور شما و سرورهای بالادستی (Upstream) قطع شده است. این ارور که به‌صورت 502 Bad Gateway نمایش داده می‌شود، یکی…

۷ مرداد ۱۴۰۵
0 0 رای ها
به مقاله امتیاز بدید
0 نظرات