
مقدمه در این راهنما، شما یک اپلیکیشن پایتون با استفاده از میکروفریمورک Flask روی اوبونتو 24.04 ایجاد خواهید کرد. بخش عمده این مقاله به نحوه راهاندازی سرور اپلیکیشن uWSGI، نحوه اجرای اپلیکیشن و پیکربندی Nginx به عنوان یک پروکسی معکوس (Reverse Proxy) در فرانتاند میپردازد.
پیشنیازها پیش از شروع این راهنما، باید موارد زیر را داشته باشید:
- یک سرور با سیستمعامل اوبونتو 24.04 و یک کاربر غیر روت (non-root) با دسترسی sudo. برای این کار میتوانید راهنمای راهاندازی اولیه سرور در پارمین کلود را دنبال کنید.
- وبسرور Nginx روی سرور شما نصب باشد.
- یک نام دامنه که به سرور شما指向 (Point) شده باشد. میتوانید با مراجعه به مستندات مربوط به دامنهها و DNS در پارمین کلود (Parmin Cloud)، نحوه اتصال دامنهها به سرورهای خود را یاد بگیرید. این آموزش فرض میکند که شما رکوردهای DNS زیر را ایجاد کردهاید:
- یک رکورد A با نام
your_domainکه به آدرس IP عمومی سرور شما اشاره دارد. - یک رکورد A با نام
www.your_domainکه به آدرس IP عمومی سرور شما اشاره دارد.
- یک رکورد A با نام
همچنین، آشنایی اولیه با uWSGI (سرور اپلیکیشنی که در این راهنما راهاندازی میکنید) و مشخصات WSGI میتواند مفید باشد.
مرحله ۱ — نصب کامپوننتها از مخازن اوبونتو
اولین قدم شما نصب تمام قطعات مورد نیاز از مخازن اوبونتو خواهد بود. پکیجهایی که باید نصب کنید شامل pip (مدیریت پکیج پایتون) برای مدیریت کامپوننتهای پایتون شماست. شما همچنین به فایلهای توسعه پایتون که برای ساخت uWSGI لازم هستند، نیاز خواهید داشت.
ابتدا ایندکس پکیجهای محلی را بهروزرسانی کنید:
سپس پکیجهایی را نصب کنید که به شما اجازه میدهند محیط پایتون خود را بسازید. این پکیجها شامل python3-pip و چندین ابزار توسعه دیگر برای یک محیط برنامهنویسی قوی هستند:
با نصب این پکیجها، شما آماده هستید تا یک محیط مجازی (Virtual Environment) برای پروژه خود ایجاد کنید.
مرحله ۲ — ایجاد یک محیط مجازی پایتون
محیط مجازی پایتون، یک دایرکتوری پروژه مستقل است که نسخههای خاصی از پایتون و ماژولهای پایتون مورد نیاز برای پروژه مورد نظر را در خود نگه میدارد. این کار برای ایزوله کردن یک اپلیکیشن از سایر اپلیکیشنهای روی همان سیستم مفید است. در این مرحله، شما محیط مجازی پایتونی را راهاندازی میکنید که اپلیکیشن Flask شما از آن اجرا خواهد شد.
ابتدا پکیج python3-venv را نصب کنید:
سپس، یک دایرکتوری اصلی برای پروژه Flask خود ایجاد کنید:
پس از ایجاد آن، وارد دایرکتوری شوید:
با تایپ دستور زیر، یک محیط مجازی برای ذخیره نیازمندیهای پایتون پروژه Flask خود ایجاد کنید:
این کار یک نسخه محلی از پایتون و pip را در دایرکتوری به نام myprojectenv درون دایرکتوری پروژه شما نصب میکند.
پیش از نصب اپلیکیشنها در محیط مجازی، باید آن را فعال کنید. این کار را با تایپ دستور زیر انجام دهید:
پرامپت شما تغییر میکند تا نشان دهد اکنون در محیط مجازی در حال کار هستید. چیزی شبیه به این خواهد بود: (myprojectenv)user@host:~/myproject$.
مرحله ۳ — راهاندازی اپلیکیشن Flask
اکنون که در محیط مجازی خود هستید، میتوانید Flask و uWSGI را نصب کرده و سپس طراحی اپلیکیشن خود را آغاز کنید.
ابتدا wheel را با نمونه محلی pip نصب کنید تا اطمینان حاصل کنید پکیجها حتی در صورت نداشتن آرشیو wheel نیز نصب میشوند:
نکته: مهم نیست از کدام نسخه پایتون استفاده میکنید، وقتی محیط مجازی فعال است، باید از دستور pip (نه pip3) استفاده کنید.
سپس، Flask و uWSGI را نصب کنید:
ایجاد یک اپلیکیشن نمونه اکنون که Flask را در اختیار دارید، میتوانید یک اپلیکیشن نمونه ایجاد کنید. Flask یک میکروفریمورک است و ابزارهای زیادی که فریمورکهای کاملتر دارند را شامل نمیشود.
در این مثال، اپلیکیشن Flask خود را در یک فایل واحد به نام myproject.py ایجاد میکنید:
کد اپلیکیشن در این فایل قرار میگیرد. این کد Flask را ایمپورت کرده و یک آبجکت Flask نمونهسازی میکند:
~/myproject/myproject.py
این کد در واقع تعیین میکند که چه محتوایی به کسی که به دامنه ریشه (root domain) دسترسی پیدا میکند، نمایش داده شود. پس از اتمام، فایل را ذخیره کرده و ببندید.
اگر راهنمای راهاندازی اولیه سرور را دنبال کرده باشید، فایروال UFW شما فعال است. برای تست اپلیکیشن، باید اجازه دسترسی به پورت 5000 را بدهید:
اکنون میتوانید اپلیکیشن Flask خود را با تایپ دستور زیر تست کنید:
خروجی مشابه زیر را خواهید دید که شامل یک هشدار مفید است که یادآوری میکند از این تنظیمات سرور در محیط پروداکشن استفاده نکنید:
آدرس IP سرور خود را به همراه :5000 در مرورگر وب خود وارد کنید. شما پیام Hello There! را خواهید دید. پس از اتمام، کلید CTRL + C را در پنجره ترمینال خود بزنید تا سرور توسعه Flask متوقف شود.
ایجاد نقطه ورود WSGI در مرحله بعد، فایلی ایجاد کنید که به عنوان نقطه ورود (Entry Point) اپلیکیشن شما عمل کند. این فایل به سرور uWSGI میگوید که چگونه با اپلیکیشن شما تعامل داشته باشد.
فایل را wsgi.py نامگذاری کنید:
در این فایل، نمونه Flask را از اپلیکیشن خود ایمپورت کرده و سپس آن را اجرا کنید:
~/myproject/wsgi.py
فایل را ذخیره کرده و ببندید.
مرحله ۴ — پیکربندی uWSGI
اپلیکیشن شما اکنون با یک نقطه ورود ایجاد شده است. اکنون میتوانید به پیکربندی uWSGI بپردازید.
تست اینکه آیا uWSGI میتواند اپلیکیشن را سرو کند به عنوان اولین قدم، تست کنید تا مطمئن شوید uWSGI میتواند با پاس دادن نام نقطه ورود شما، اپلیکیشن را به درستی سرو کند. نام نقطه ورود در این آموزش wsgi:app است. همچنین پروتکل را روی HTTP تنظیم کنید و از پورت 5000 استفاده کنید:
آدرس IP سرور خود را با :5000 در مرورگر وب خود دوباره وارد کنید. باید خروجی اپلیکیشن خود را دوباره ببینید. پس از تایید عملکرد صحیح، CTRL + C را در ترمینال خود فشار دهید.
اکنون کار شما با محیط مجازی تمام شده است، بنابراین میتوانید آن را غیرفعال کنید:
ایجاد فایل پیکربندی uWSGI شما تست کردید که uWSGI قادر به سرو کردن اپلیکیشن شما است، اما در نهایت برای استفاده طولانیمدت به چیزی پایدارتر نیاز دارید. میتوانید یک فایل پیکربندی uWSGI با گزینههای مربوطه ایجاد کنید.
فایل را در دایرکتوری پروژه خود قرار دهید و آن را myproject.ini بنامید:
داخل فایل، آن را با هدر [uwsgi] شروع کنید تا uWSGI بداند تنظیمات را اعمال کند. سپس ماژول را مشخص کنید:
~/myproject/myproject.ini
در این فایل، به uWSGI میگوییم که در حالت master راهاندازی شود و ۵ پردازش worker ایجاد کند. از آنجایی که Nginx اتصالات کلاینت را مدیریت میکند و درخواستها را به uWSGI ارسال میکند و این دو روی یک کامپیوتر هستند، استفاده از یک سوکت یونیکس (Unix Socket) سریعتر و امنتر است. سوکت را myproject.sock مینامیم. همچنین مجوزهای سوکت را روی 660 تنظیم میکنیم تا گروه Nginx بتواند آن را بخواند. گزینه vacuum = true سوکت را هنگام توقف پردازش پاکسازی میکند.
پس از اتمام، فایل را ذخیره کرده و ببندید.
مرحله ۵ — ایجاد فایل سرویس systemd
Systemd مجموعهای از ابزارهاست که یک مدل init سریع و انعطافپذیر برای مدیریت سرویسهای سیستم ارائه میدهد. ایجاد یک فایل سرویس systemd به سیستم init اوبونتو اجازه میدهد تا uWSGI را به طور خودکار راهاندازی کرده و اپلیکیشن Flask را هر زمان که سرور بوت میشود، سرو کند.
یک فایل سرویس با پسوند .service در دایرکتوری /etc/systemd/system ایجاد کنید:
داخل فایل، با بخش [Unit] شروع کنید تا متادیتا و وابستگیها را مشخص کنید:
/etc/systemd/system/myproject.service
نکته: به جای sammy نام کاربری خود را وارد کنید و مسیرها را با توجه به سیستم خود اصلاح کنید.
این فایل مشخص میکند که سرویس باید با کاربر sammy و گروه www-data (برای ارتباط Nginx) اجرا شود. دایرکتوری کاری و مسیر متغیرهای محیطی روی پروژه شما تنظیم شده است. در نهایت، دستور اجرای uWSGI با فایل ini مشخص شده است.
فایل را ذخیره کرده و ببندید. اکنون میتوانید سرویس uWSGI خود را استارت کنید:
سپس آن را فعال کنید تا در زمان بوت استارت شود:
وضعیت آن را بررسی کنید:
خروجی باید نشان دهد که سرویس active (running) است.
مرحله ۶ — پیکربندی Nginx برای پروکسی درخواستها
سرور اپلیکیشن uWSGI شما اکنون در حال اجرا است و منتظر درخواستها روی فایل سوکت است. در این مرحله، Nginx را پیکربندی میکنید تا درخواستهای وب را با استفاده از پروتکل uwsgi به آن سوکت ارسال کند.
ابتدا یک فایل پیکربندی Server Block جدید در دایرکتوری sites-available ایجاد کنید:
یک Server Block باز کنید و به Nginx بگویید که به پورت 80 گوش دهد و از این بلاک برای درخواستهای دامنه شما استفاده کند:
/etc/nginx/sites-available/myproject
این پیکربندی شامل فایل uwsgi_params است و درخواستها را به سوکتی که در مرحله قبل تعریف کردید، ارسال میکند. (باز هم مسیر سوکت را با نام کاربری خود تنظیم کنید). فایل را ذخیره کرده و ببندید.
برای فعال کردن این پیکربندی، یک لینک نمادین (Symbolic Link) به دایرکتوری sites-enabled ایجاد کنید:
اگر فایل default در sites-enabled وجود دارد، لینک آن را حذف کنید تا با پیکربندی شما تداخل نکند:
سپس خطاهای نحوی (Syntax) را تست کنید:
اگر مشکلی نبود، Nginx را ریاستارت کنید:
در نهایت، فایروال را تنظیم کنید. دیگر نیازی به پورت 5000 ندارید، بنابراین آن قانون را حذف کرده و دسترسی به Nginx را باز کنید:
اکنون میتوانید به نام دامنه سرور خود در مرورگر وب بروید. باید خروجی اپلیکیشن خود را ببینید.
مرحله ۷ — ایمنسازی اپلیکیشن
برای اطمینان از امنیت ترافیک سرور خود، یک گواهی SSL برای دامنه خود دریافت کنید. در این آموزش نحوه دریافت گواهی رایگان از Let’s Encrypt را توضیح میدهیم.
ابتدا Certbot و پلاگین Nginx آن را نصب کنید:
برای استفاده از این پلاگین، دستور زیر را تایپ کنید:
این دستور Certbot را با پلاگین --nginx اجرا میکند و با استفاده از -d نامهایی که میخواهید گواهی برای آنها معتبر باشد را مشخص میکند. اگر این اولین بار است که Certbot را اجرا میکنید، از شما خواسته میشود یک آدرس ایمیل وارد کرده و با شرایط خدمات موافقت کنید.
سپس Certbot از شما میپرسد که چگونه میخواهید تنظیمات HTTPS خود را پیکربندی کنید. گزینه ۲ (Redirect) را برای هدایت تمام درخواستها به HTTPS انتخاب کنید. Nginx مجدداً بارگذاری میشود تا تنظیمات جدید را اعمال کند.
پس از موفقیتآمیز بودن فرآیند، میتوانید برای تایید پیکربندی، یک بار دیگر با استفاده از https:// به دامنه خود بروید. باید خروجی اپلیکیشن خود را همراه با نشانگر امنیتی مرورگر خود ببینید که نشان میدهد سایت ایمن شده است.
نتیجهگیری در این راهنما، شما یک اپلیکیشن پایه Flask را در یک محیط مجازی پایتون ایجاد و ایمنسازی کردید. سپس یک نقطه ورود WSGI ایجاد کردید تا سرورهای اپلیکیشن سازگار با WSGI بتوانند با آن ارتباط برقرار کنند، و سرور اپلیکیشن uWSGI را پیکربندی کردید. پس از آن، یک فایل سرویس systemd برای راهاندازی خودکار سرور اپلیکیشن در زمان بوت ایجاد کردید. شما همچنین یک Server Block در Nginx ایجاد کردید که ترافیک کلاینتهای وب را به سرور اپلیکیشن هدایت میکند و ترافیک سرور خود را با Let’s Encrypt ایمنسازی کردید. اکنون میتوانید از این معماری برای سرو کردن اپلیکیشنهای Flask که طراحی میکنید، استفاده کنید.
از همراهی شما با پارمین کلود سپاسگزاریم.




