بک اندپایتون

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

مقدمه در این راهنما، شما یک اپلیکیشن پایتون با استفاده از میکروفریم‌ورک Flask روی اوبونتو 24.04 ایجاد خواهید کرد. بخش عمده این مقاله به نحوه راه‌اندازی سرور اپلیکیشن Gunicorn، نحوه اجرای اپلیکیشن و پیکربندی Nginx به عنوان یک پروکسی معکوس (Reverse Proxy) در فرانت‌اند می‌پردازد.

پیش‌نیازها پیش از شروع این راهنما، باید موارد زیر را داشته باشید:

  • یک سرور با سیستم‌عامل اوبونتو 24.04 و یک کاربر غیر روت (non-root) با دسترسی sudo. برای این کار می‌توانید راهنمای راه‌اندازی اولیه سرور در پارمین کلود (Parmin Cloud) را دنبال کنید.
  • وب‌سرور Nginx روی سرور شما نصب باشد.
  • یک نام دامنه که به سرور شما اشاره (Point) شده باشد. می‌توانید با مراجعه به مستندات مربوط به دامنه‌ها و DNS در پارمین کلود، نحوه اتصال دامنه‌ها به سرورهای خود را یاد بگیرید. این آموزش فرض می‌کند که شما رکوردهای DNS زیر را ایجاد کرده‌اید:
    • یک رکورد A با نام your_domain که به آدرس IP عمومی سرور شما اشاره دارد.
    • یک رکورد A با نام www.your_domain که به آدرس IP عمومی سرور شما اشاره دارد.
  • آشنایی اولیه با مشخصات WSGI، که سرور Gunicorn از آن برای ارتباط با اپلیکیشن Flask شما استفاده می‌کند.

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

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

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

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
cd ~/myproject

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

bash
python3 -m venv myprojectenv

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

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

bash
source myprojectenv/bin/activate

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


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

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

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

bash
pip install wheel

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

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

bash
pip install gunicorn flask

ایجاد یک اپلیکیشن نمونه اکنون که 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) اپلیکیشن شما عمل کند. این فایل به سرور Gunicorn می‌گوید که چگونه با اپلیکیشن شما تعامل داشته باشد.

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

bash
nano ~/myproject/wsgi.py

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

~/myproject/wsgi.py

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

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


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

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

پیش از ادامه، باید تست کنیم که Gunicorn می‌تواند اپلیکیشن را به درستی سرو کند. این کار را با پاس دادن نام نقطه ورود خود انجام می‌دهیم. این نام از ترکیب نام ماژول (بدون پسوند .py) به علاوه نام قابل فراخوانی (Callable) در اپلیکیشن تشکیل می‌شود. در مورد ما، این نام wsgi:app است.

همچنین رابط و پورتی را برای Bind کردن مشخص می‌کنیم تا اپلیکیشن روی یک رابط در دسترس عموم شروع به کار کند:

bash
cd ~/myproject
gunicorn –bind 0.0.0.0:5000 wsgi:app

خروجی مشابه زیر را خواهید دید:

text
Output
[2020-05-20 14:13:00 +0000] [46419] [INFO] Starting gunicorn 20.0.4
[2020-05-20 14:13:00 +0000] [46419] [INFO] Listening at: http://0.0.0.0:5000 (46419)
[2020-05-20 14:13:00 +0000] [46419] [INFO] Using worker: sync
[2020-05-20 14:13:00 +0000] [46421] [INFO] Booting worker with pid: 46421

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

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

bash
deactivate

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

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

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

داخل فایل، با بخش [Unit] شروع کنید تا متادیتا و وابستگی‌ها را مشخص کنید. توضیحات سرویس را در اینجا قرار دهید و به سیستم init بگویید که این سرویس را تنها پس از رسیدن به هدف شبکه (Networking Target) شروع کند:

ini
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

سپس بخش [Service] را باز کنید. این بخش کاربر و گروهی را که می‌خواهید پردازش تحت آن اجرا شود مشخص می‌کند. مالکیت پردازش را به حساب کاربری معمولی خود بدهید و گروه را www-data تنظیم کنید تا Nginx بتواند به راحتی با پردازش‌های Gunicorn ارتباط برقرار کند. (به جای sammy نام کاربری خود را وارد کنید):

ini
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=sammy
Group=www-data

سپس، دایرکتوری کاری (Working Directory) را مشخص کرده و متغیر محیطی PATH را تنظیم کنید تا سیستم init بداند که فایل‌های اجرایی پردازش در محیط مجازی شما قرار دارند. دستور شروع سرویس را نیز مشخص کنید. این دستور کارهای زیر را انجام می‌دهد:

  • شروع ۳ پردازش Worker (که می‌توانید این عدد را بر اساس نیاز خود تنظیم کنید).
  • ایجاد و اتصال به یک فایل سوکت یونیکس (myproject.sock) در دایرکتوری پروژه شما. مقدار umask را روی 007 تنظیم می‌کنیم تا فایل سوکت دسترسی مالک و گروه را بدهد و دسترسی سایرین را محدود کند.
  • مشخص کردن نام فایل نقطه ورود WSGI به همراه قابل فراخوانی پایتون (wsgi:app).

(به جای sammy و مسیرهای پروژه، اطلاعات خود را وارد کنید):

ini
[Unit]
Description=Gunicorn 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/gunicorn –workers 3 –bind unix:myproject.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target

فایل سرویس systemd شما کامل شد. آن را ذخیره کرده و ببندید.

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

bash
sudo systemctl start myproject
sudo systemctl enable myproject

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

bash
sudo systemctl status myproject

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


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

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

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

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

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

nginx
server {
listen 80;
server_name your_domain www.your_domain;
}

سپس، یک بلاک location اضافه کنید که با هر درخواستی مطابقت داشته باشد. در این بلاک، فایل proxy_params را включ کنید تا برخی از پارامترهای عمومی پروکسی تنظیم شوند. سپس درخواست‌ها را با استفاده از دستور proxy_pass به سوکتی که تعریف کردیم ارسال کنید:

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

فایل را ذخیره کرده و ببندید. (مسیر سوکت را با نام کاربری خود تنظیم کنید).

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

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

سپس خطاهای نحوی (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 را توضیح می‌دهیم.

ابتدا پکیج Nginx مربوط به Certbot را نصب کنید:

bash
sudo apt install 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 بتوانند با آن ارتباط برقرار کنند، و سرور اپلیکیشن Gunicorn را پیکربندی کردید. پس از آن، یک فایل سرویس systemd برای راه‌اندازی خودکار سرور اپلیکیشن در زمان بوت ایجاد کردید. شما همچنین یک Server Block در Nginx ایجاد کردید که ترافیک کلاینت‌های وب را به سرور اپلیکیشن هدایت می‌کند و ترافیک سرور خود را با Let’s Encrypt ایمن‌سازی کردید. اکنون می‌توانید از این معماری برای سرو کردن اپلیکیشن‌های Flask که طراحی می‌کنید، استفاده کنید.

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

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

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

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

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