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-1 | 1 | 2 |
| VDS-2 | 2 | 3 |
| VDS-3 | 4 | 5 |
| VDS-4 | 6 | 9 |
اگر ایپلیکیشن نیٹ ورک اور ڈیٹا بیس پر انتظار میں زیادہ وقت گزارتی ہے، تو پروسیسز کی تعداد بڑھانے کے بجائے --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 اور مشترکہ گروپ سیٹ کریں |
ModuleNotFoundError | venv کے بجائے سسٹم Python سے چلایا جا رہا ہے |
Django میں DisallowedHost | ڈومین ALLOWED_HOSTS میں شامل نہیں |
| ورکرز ٹائم آؤٹ سے ختم ہو رہے ہیں | طویل ریکویسٹ — --timeout بڑھائیں، بھاری کام کو قطار میں منتقل کریں |
| ریلیز کے بعد سب کچھ رک گیا | آپ systemctl restart myapp کرنا بھول گئے — میموری میں موجود کوڈ خود اپ ڈیٹ نہیں ہوتا |
راز
600اجازتوں والیEnvironmentFileمیں رکھیں،settings.pyمیں نہیں۔ سیٹنگز فائل دیر یا سویر ریپوزٹری میں پہنچ ہی جائے گی۔