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