پرش به محتوا

انتشار برنامه‌ی Python (Django یا Flask) با Gunicorn

محیط مجازی Python بسازید، برنامه را با Gunicorn به‌صورت سرویس اجرا کنید و فایل‌های استاتیک را مستقیم از Nginx سرو کنید.

Ubuntu 24.04 LTSسطح: متوسطبرای: Ubuntu 24.04 LTS، Ubuntu 26.04 LTS، Ubuntu 22.04 LTSبه‌روزرسانی: ۱۶ آبان ۱۴۰۵

از نسخه‌های جدید Ubuntu، نصب بسته با pip در Python سیستم مسدود است (PEP 668). روش درست، محیط مجازی (venv) برای هر برنامه است.

۱. پیش‌نیازها

bash
sudo apt update
sudo apt install -y python3-venv python3-dev build-essential

۲. کاربر، کد و venv

bash
sudo useradd -r -m -d /srv/portal -s /usr/sbin/nologin portal
sudo -u portal git clone https://git.example.ir/team/portal.git /srv/portal/app
sudo -u portal python3 -m venv /srv/portal/venv
sudo -u portal /srv/portal/venv/bin/pip install -r /srv/portal/app/requirements.txt gunicorn

۳. آزمایش دستی

برای Django (نام پروژه portal):

bash
cd /srv/portal/app
sudo -u portal /srv/portal/venv/bin/gunicorn portal.wsgi:application --bind 127.0.0.1:8000

برای Flask، به‌جای portal.wsgi:application بنویسید app:app.

۴. سرویس systemd

ini
# /etc/systemd/system/portal.service
[Unit]
Description=Portal (Gunicorn)
After=network-online.target

[Service]
User=portal
WorkingDirectory=/srv/portal/app
EnvironmentFile=/etc/portal.env
ExecStart=/srv/portal/venv/bin/gunicorn portal.wsgi:application --workers 3 --bind 127.0.0.1:8000 --access-logfile -
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=yes

[Install]
WantedBy=multi-user.target

تعداد workerها معمولاً 2 × هسته + 1 است.

bash
sudo systemctl daemon-reload
sudo systemctl enable --now portal
journalctl -u portal -n 30 --no-pager

۵. Nginx و فایل‌های استاتیک

bash
sudo -u portal /srv/portal/venv/bin/python manage.py collectstatic --noinput
nginx
server {
    listen 80;
    server_name portal.example.ir;

    location /static/ {
        alias /srv/portal/app/staticfiles/;
        expires 7d;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Nginx باید اجازه‌ی خواندن پوشه‌ی استاتیک را داشته باشد: sudo chmod o+x /srv/portal /srv/portal/app