از نسخههای جدید Ubuntu، نصب بسته با pip در Python سیستم مسدود است (PEP 668). روش درست، محیط مجازی (venv) برای هر برنامه است.
۱. پیشنیازها
sudo apt update
sudo apt install -y python3-venv python3-dev build-essential۲. کاربر، کد و venv
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):
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
# /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 است.
sudo systemctl daemon-reload
sudo systemctl enable --now portal
journalctl -u portal -n 30 --no-pager۵. Nginx و فایلهای استاتیک
sudo -u portal /srv/portal/venv/bin/python manage.py collectstatic --noinputserver {
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