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 में नहीं। सेटिंग्स फ़ाइल देर-सबेर रिपॉज़िटरी में पहुँच ही जाएगी।