Skip to content
VDS · ویب سائٹس اور ویب سرورز

Python ایپلیکیشن: gunicorn اور systemd

VDS پر Django، Flask، یا FastAPI چلانا: ورچوئل ماحول، ساکٹ کے ساتھ gunicorn، systemd سروس، اور اپنے ٹیئر کے مطابق ورکرز کی تعداد منتخب کرنا۔

اپ ڈیٹ 23 اگست، 2026

پہلے سے موجود ڈیولپمنٹ سرور (manage.py runserver، flask run) پروڈکشن لوڈ کے لیے نہیں بنایا گیا۔ VPS پر آپ gunicorn یا uvicorn انسٹال کرتے ہیں، اور ایک ویب سرور انہیں باہر سے پیش کرتا ہے۔

انوائرنمنٹ

پروجیکٹ کے پیکجز کبھی بھی سسٹم Python میں انسٹال نہ کریں — سسٹم اپ ڈیٹ ایپلیکیشن کو توڑ دے گا۔

apt install -y python3 python3-venv python3-pip
useradd -r -m -d /srv/app -s /usr/sbin/nologin appuser

sudo -u appuser python3 -m venv /srv/app/venv
sudo -u appuser /srv/app/venv/bin/pip install -r /srv/app/requirements.txt
sudo -u appuser /srv/app/venv/bin/pip install gunicorn

FastAPI کے لیے اضافی طور پر uvicorn[standard] انسٹال کریں — gunicorn اسے ورکر کلاس کے طور پر چلاتا ہے۔

سروس

/etc/systemd/system/myapp.service:

[Unit]
Description=Python app
After=network-online.target postgresql.service

[Service]
User=appuser
WorkingDirectory=/srv/app
EnvironmentFile=/srv/app/.env
ExecStart=/srv/app/venv/bin/gunicorn \
  --workers 3 \
  --bind unix:/run/myapp/gunicorn.sock \
  --access-logfile - \
  myproject.wsgi:application
RuntimeDirectory=myapp
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

FastAPI کے لیے لانچ لائن کو --worker-class uvicorn.workers.UvicornWorker app.main:app سے بدل دیں۔

systemctl daemon-reload
systemctl enable --now myapp
journalctl -u myapp -f

RuntimeDirectory=myapp ہر بار اسٹارٹ پر مطلوبہ اجازتوں کے ساتھ /run/myapp بناتا ہے — ورنہ ساکٹ رکھنے کی جگہ ہی نہیں ہوگی۔

کتنے ورکرز

عام فارمولا 2 × cores + 1 ہے، لیکن یہ میموری کی حد سے ٹکرا جاتا ہے: ہر Django ورکر 80–200 MB استعمال کرتا ہے۔

ٹیئرکورزورکرز
VDS-112
VDS-223
VDS-345
VDS-469

اگر ایپلیکیشن نیٹ ورک اور ڈیٹا بیس پر انتظار میں زیادہ وقت گزارتی ہے، تو پروسیسز کی تعداد بڑھانے کے بجائے --threads 2 شامل کریں۔

ویب سرور

location / {
    proxy_pass http://unix:/run/myapp/gunicorn.sock;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

location /static/ { alias /srv/app/static/; }

Django کی اسٹیٹک فائلیں جمع کرنے کے بعد (collectstatic) انہیں براہ راست Nginx سے پیش کریں۔ انہیں Python کے ذریعے گزارنا غیر ضروری لوڈ بڑھاتا ہے۔

عام غلطیاں

علامتوجہ
502 اور connect() to unix:... failed (13)Nginx کے پاس ساکٹ کی اجازت نہیں — --umask 007 اور مشترکہ گروپ سیٹ کریں
ModuleNotFoundErrorvenv کے بجائے سسٹم Python سے چلایا جا رہا ہے
Django میں DisallowedHostڈومین ALLOWED_HOSTS میں شامل نہیں
ورکرز ٹائم آؤٹ سے ختم ہو رہے ہیںطویل ریکویسٹ — --timeout بڑھائیں، بھاری کام کو قطار میں منتقل کریں
ریلیز کے بعد سب کچھ رک گیاآپ systemctl restart myapp کرنا بھول گئے — میموری میں موجود کوڈ خود اپ ڈیٹ نہیں ہوتا

راز 600 اجازتوں والی EnvironmentFile میں رکھیں، settings.py میں نہیں۔ سیٹنگز فائل دیر یا سویر ریپوزٹری میں پہنچ ہی جائے گی۔