اوبنتوبک اند

آموزش راه‌اندازی و سرو اپلیکیشن‌های Flask با uWSGI و Nginx در اوبونتو 24.04

مقدمه در این راهنما، شما یک اپلیکیشن پایتون با استفاده از میکروفریم‌ورک 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 عمومی سرور شما اشاره دارد.

همچنین، آشنایی اولیه با uWSGI (سرور اپلیکیشنی که در این راهنما راه‌اندازی می‌کنید) و مشخصات WSGI می‌تواند مفید باشد.


مرحله ۱ — نصب کامپوننت‌ها از مخازن اوبونتو

اولین قدم شما نصب تمام قطعات مورد نیاز از مخازن اوبونتو خواهد بود. پکیج‌هایی که باید نصب کنید شامل pip (مدیریت پکیج پایتون) برای مدیریت کامپوننت‌های پایتون شماست. شما همچنین به فایل‌های توسعه پایتون که برای ساخت uWSGI لازم هستند، نیاز خواهید داشت.

ابتدا ایندکس پکیج‌های محلی را به‌روزرسانی کنید:

bash
sudo apt update

سپس پکیج‌هایی را نصب کنید که به شما اجازه می‌دهند محیط پایتون خود را بسازید. این پکیج‌ها شامل python3-pip و چندین ابزار توسعه دیگر برای یک محیط برنامه‌نویسی قوی هستند:

bash
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

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


مرحله ۲ — ایجاد یک محیط مجازی پایتون

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

ابتدا پکیج python3-venv را نصب کنید:

bash
sudo apt install python3-venv

سپس، یک دایرکتوری اصلی برای پروژه Flask خود ایجاد کنید:

bash
mkdir ~/myproject

پس از ایجاد آن، وارد دایرکتوری شوید:

bash
cd ~/myproject

با تایپ دستور زیر، یک محیط مجازی برای ذخیره نیازمندی‌های پایتون پروژه Flask خود ایجاد کنید:

bash
python3 -m venv myprojectenv

این کار یک نسخه محلی از پایتون و pip را در دایرکتوری به نام myprojectenv درون دایرکتوری پروژه شما نصب می‌کند.

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

bash
source myprojectenv/bin/activate

پرامپت شما تغییر می‌کند تا نشان دهد اکنون در محیط مجازی در حال کار هستید. چیزی شبیه به این خواهد بود: (myprojectenv)user@host:~/myproject$.


مرحله ۳ — راه‌اندازی اپلیکیشن Flask

اکنون که در محیط مجازی خود هستید، می‌توانید Flask و uWSGI را نصب کرده و سپس طراحی اپلیکیشن خود را آغاز کنید.

ابتدا wheel را با نمونه محلی pip نصب کنید تا اطمینان حاصل کنید پکیج‌ها حتی در صورت نداشتن آرشیو wheel نیز نصب می‌شوند:

bash
pip install wheel -i https://pypi.parmincloud.ir/simple

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

سپس، Flask و uWSGI را نصب کنید:

bash
pip install uwsgi flask -i https://pypi.parmincloud.ir/simple

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

در این مثال، اپلیکیشن Flask خود را در یک فایل واحد به نام myproject.py ایجاد می‌کنید:

bash
nano ~/myproject/myproject.py

کد اپلیکیشن در این فایل قرار می‌گیرد. این کد Flask را ایمپورت کرده و یک آبجکت Flask نمونه‌سازی می‌کند:

~/myproject/myproject.py

python
from flask import Flask
app = Flask(__name__)
@app.route(“/”)
def hello():
return “<h1 style=’color:blue’>Hello There!</h1>”
if __name__ == “__main__”:
app.run(host=’0.0.0.0′)

این کد در واقع تعیین می‌کند که چه محتوایی به کسی که به دامنه ریشه (root domain) دسترسی پیدا می‌کند، نمایش داده شود. پس از اتمام، فایل را ذخیره کرده و ببندید.

اگر راهنمای راه‌اندازی اولیه سرور را دنبال کرده باشید، فایروال UFW شما فعال است. برای تست اپلیکیشن، باید اجازه دسترسی به پورت 5000 را بدهید:

bash
sudo ufw allow 5000

اکنون می‌توانید اپلیکیشن Flask خود را با تایپ دستور زیر تست کنید:

bash
python myproject.py

خروجی مشابه زیر را خواهید دید که شامل یک هشدار مفید است که یادآوری می‌کند از این تنظیمات سرور در محیط پروداکشن استفاده نکنید:

text
Output
* Serving Flask app “myproject” (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

آدرس IP سرور خود را به همراه :5000 در مرورگر وب خود وارد کنید. شما پیام Hello There! را خواهید دید. پس از اتمام، کلید CTRL + C را در پنجره ترمینال خود بزنید تا سرور توسعه Flask متوقف شود.

ایجاد نقطه ورود WSGI در مرحله بعد، فایلی ایجاد کنید که به عنوان نقطه ورود (Entry Point) اپلیکیشن شما عمل کند. این فایل به سرور uWSGI می‌گوید که چگونه با اپلیکیشن شما تعامل داشته باشد.

فایل را wsgi.py نام‌گذاری کنید:

bash
nano ~/myproject/wsgi.py

در این فایل، نمونه Flask را از اپلیکیشن خود ایمپورت کرده و سپس آن را اجرا کنید:

~/myproject/wsgi.py

python
from myproject import app
if __name__ == “__main__”:
app.run()

فایل را ذخیره کرده و ببندید.


مرحله ۴ — پیکربندی uWSGI

اپلیکیشن شما اکنون با یک نقطه ورود ایجاد شده است. اکنون می‌توانید به پیکربندی uWSGI بپردازید.

تست اینکه آیا uWSGI می‌تواند اپلیکیشن را سرو کند به عنوان اولین قدم، تست کنید تا مطمئن شوید uWSGI می‌تواند با پاس دادن نام نقطه ورود شما، اپلیکیشن را به درستی سرو کند. نام نقطه ورود در این آموزش wsgi:app است. همچنین پروتکل را روی HTTP تنظیم کنید و از پورت 5000 استفاده کنید:

bash
uwsgi –socket 0.0.0.0:5000 –protocol=http -w wsgi:app

آدرس IP سرور خود را با :5000 در مرورگر وب خود دوباره وارد کنید. باید خروجی اپلیکیشن خود را دوباره ببینید. پس از تایید عملکرد صحیح، CTRL + C را در ترمینال خود فشار دهید.

اکنون کار شما با محیط مجازی تمام شده است، بنابراین می‌توانید آن را غیرفعال کنید:

bash
deactivate

ایجاد فایل پیکربندی uWSGI شما تست کردید که uWSGI قادر به سرو کردن اپلیکیشن شما است، اما در نهایت برای استفاده طولانی‌مدت به چیزی پایدارتر نیاز دارید. می‌توانید یک فایل پیکربندی uWSGI با گزینه‌های مربوطه ایجاد کنید.

فایل را در دایرکتوری پروژه خود قرار دهید و آن را myproject.ini بنامید:

bash
nano ~/myproject/myproject.ini

داخل فایل، آن را با هدر [uwsgi] شروع کنید تا uWSGI بداند تنظیمات را اعمال کند. سپس ماژول را مشخص کنید:

~/myproject/myproject.ini

ini
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = myproject.sock
chmod-socket = 660
vacuum = true
die-on-term = true

در این فایل، به uWSGI می‌گوییم که در حالت master راه‌اندازی شود و ۵ پردازش worker ایجاد کند. از آنجایی که Nginx اتصالات کلاینت را مدیریت می‌کند و درخواست‌ها را به uWSGI ارسال می‌کند و این دو روی یک کامپیوتر هستند، استفاده از یک سوکت یونیکس (Unix Socket) سریع‌تر و امن‌تر است. سوکت را myproject.sock می‌نامیم. همچنین مجوزهای سوکت را روی 660 تنظیم می‌کنیم تا گروه Nginx بتواند آن را بخواند. گزینه vacuum = true سوکت را هنگام توقف پردازش پاکسازی می‌کند.

پس از اتمام، فایل را ذخیره کرده و ببندید.


مرحله ۵ — ایجاد فایل سرویس systemd

Systemd مجموعه‌ای از ابزارهاست که یک مدل init سریع و انعطاف‌پذیر برای مدیریت سرویس‌های سیستم ارائه می‌دهد. ایجاد یک فایل سرویس systemd به سیستم init اوبونتو اجازه می‌دهد تا uWSGI را به طور خودکار راه‌اندازی کرده و اپلیکیشن Flask را هر زمان که سرور بوت می‌شود، سرو کند.

یک فایل سرویس با پسوند .service در دایرکتوری /etc/systemd/system ایجاد کنید:

bash
sudo nano /etc/systemd/system/myproject.service

داخل فایل، با بخش [Unit] شروع کنید تا متادیتا و وابستگی‌ها را مشخص کنید:

/etc/systemd/system/myproject.service

ini
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment=”PATH=/home/sammy/myproject/myprojectenv/bin”
ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi –ini myproject.ini
[Install]
WantedBy=multi-user.target

نکته: به جای sammy نام کاربری خود را وارد کنید و مسیرها را با توجه به سیستم خود اصلاح کنید.

این فایل مشخص می‌کند که سرویس باید با کاربر sammy و گروه www-data (برای ارتباط Nginx) اجرا شود. دایرکتوری کاری و مسیر متغیرهای محیطی روی پروژه شما تنظیم شده است. در نهایت، دستور اجرای uWSGI با فایل ini مشخص شده است.

فایل را ذخیره کرده و ببندید. اکنون می‌توانید سرویس uWSGI خود را استارت کنید:

bash
sudo systemctl start myproject

سپس آن را فعال کنید تا در زمان بوت استارت شود:

bash
sudo systemctl enable myproject

وضعیت آن را بررسی کنید:

bash
sudo systemctl status myproject

خروجی باید نشان دهد که سرویس active (running) است.


مرحله ۶ — پیکربندی Nginx برای پروکسی درخواست‌ها

سرور اپلیکیشن uWSGI شما اکنون در حال اجرا است و منتظر درخواست‌ها روی فایل سوکت است. در این مرحله، Nginx را پیکربندی می‌کنید تا درخواست‌های وب را با استفاده از پروتکل uwsgi به آن سوکت ارسال کند.

ابتدا یک فایل پیکربندی Server Block جدید در دایرکتوری sites-available ایجاد کنید:

bash
sudo nano /etc/nginx/sites-available/myproject

یک Server Block باز کنید و به Nginx بگویید که به پورت 80 گوش دهد و از این بلاک برای درخواست‌های دامنه شما استفاده کند:

/etc/nginx/sites-available/myproject

nginx
server {
listen 80;
server_name your_domain www.your_domain;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
}
}

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

برای فعال کردن این پیکربندی، یک لینک نمادین (Symbolic Link) به دایرکتوری sites-enabled ایجاد کنید:

bash
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

اگر فایل default در sites-enabled وجود دارد، لینک آن را حذف کنید تا با پیکربندی شما تداخل نکند:

bash
sudo unlink /etc/nginx/sites-enabled/default

سپس خطاهای نحوی (Syntax) را تست کنید:

bash
sudo nginx -t

اگر مشکلی نبود، Nginx را ری‌استارت کنید:

bash
sudo systemctl restart nginx

در نهایت، فایروال را تنظیم کنید. دیگر نیازی به پورت 5000 ندارید، بنابراین آن قانون را حذف کرده و دسترسی به Nginx را باز کنید:

bash
sudo ufw delete allow 5000
sudo ufw allow ‘Nginx Full’

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


مرحله ۷ — ایمن‌سازی اپلیکیشن

برای اطمینان از امنیت ترافیک سرور خود، یک گواهی SSL برای دامنه خود دریافت کنید. در این آموزش نحوه دریافت گواهی رایگان از Let’s Encrypt را توضیح می‌دهیم.

ابتدا Certbot و پلاگین Nginx آن را نصب کنید:

bash
sudo apt install certbot python3-certbot-nginx

برای استفاده از این پلاگین، دستور زیر را تایپ کنید:

bash
sudo certbot –nginx -d your_domain -d www.your_domain

این دستور Certbot را با پلاگین --nginx اجرا می‌کند و با استفاده از -d نام‌هایی که می‌خواهید گواهی برای آن‌ها معتبر باشد را مشخص می‌کند. اگر این اولین بار است که Certbot را اجرا می‌کنید، از شما خواسته می‌شود یک آدرس ایمیل وارد کرده و با شرایط خدمات موافقت کنید.

سپس Certbot از شما می‌پرسد که چگونه می‌خواهید تنظیمات HTTPS خود را پیکربندی کنید. گزینه ۲ (Redirect) را برای هدایت تمام درخواست‌ها به HTTPS انتخاب کنید. Nginx مجدداً بارگذاری می‌شود تا تنظیمات جدید را اعمال کند.

پس از موفقیت‌آمیز بودن فرآیند، می‌توانید برای تایید پیکربندی، یک بار دیگر با استفاده از https:// به دامنه خود بروید. باید خروجی اپلیکیشن خود را همراه با نشانگر امنیتی مرورگر خود ببینید که نشان می‌دهد سایت ایمن شده است.


نتیجه‌گیری در این راهنما، شما یک اپلیکیشن پایه Flask را در یک محیط مجازی پایتون ایجاد و ایمن‌سازی کردید. سپس یک نقطه ورود WSGI ایجاد کردید تا سرورهای اپلیکیشن سازگار با WSGI بتوانند با آن ارتباط برقرار کنند، و سرور اپلیکیشن uWSGI را پیکربندی کردید. پس از آن، یک فایل سرویس systemd برای راه‌اندازی خودکار سرور اپلیکیشن در زمان بوت ایجاد کردید. شما همچنین یک Server Block در Nginx ایجاد کردید که ترافیک کلاینت‌های وب را به سرور اپلیکیشن هدایت می‌کند و ترافیک سرور خود را با Let’s Encrypt ایمن‌سازی کردید. اکنون می‌توانید از این معماری برای سرو کردن اپلیکیشن‌های Flask که طراحی می‌کنید، استفاده کنید.

از همراهی شما با پارمین کلود سپاسگزاریم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا