একটি Python অ্যাপ্লিকেশন: gunicorn এবং systemd
VDS-এ Django, Flask, বা FastAPI চালানো: ভার্চুয়াল এনভায়রনমেন্ট, সকেটসহ gunicorn, systemd সার্ভিস, এবং আপনার টিয়ারের জন্য ওয়ার্কার সংখ্যা নির্বাচন।
আপডেট: ২৩ আগস্ট, ২০২৬
বিল্ট-ইন ডেভেলপমেন্ট সার্ভার (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 এটিকে একটি worker class হিসেবে চালায়।
সার্ভিস
/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 তৈরি করে — অন্যথায় সকেট রাখার কোনো জায়গা থাকে না।
কতজন worker
সাধারণ সূত্রটি হলো 2 × cores + 1, তবে এটি মেমোরির সীমার সঙ্গে ধাক্কা খায়: প্রতিটি Django worker 80–200 MB ব্যবহার করে।
| টিয়ার | কোর | Worker |
|---|---|---|
| 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-র স্ট্যাটিক ফাইলগুলো সংগ্রহ করার পর Nginx দিয়ে সরাসরি পরিবেশন করুন: collectstatic। Python-এর মধ্য দিয়ে সেগুলো পাঠানো অপ্রয়োজনীয় লোড যোগ করে।
সাধারণ ত্রুটি
| লক্ষণ | কারণ |
|---|---|
502 এবং connect() to unix:... failed (13) | Nginx-এর সকেটের জন্য অনুমতি নেই — --umask 007 এবং একটি শেয়ার্ড গ্রুপ সেট করুন |
ModuleNotFoundError | venv থেকে নয়, সিস্টেম Python দিয়ে চালানো হচ্ছে |
Django-তে DisallowedHost | ডোমেইনটি ALLOWED_HOSTS-এ যোগ করা হয়নি |
| টাইমআউটে worker-রা নিহত হচ্ছে | একটি দীর্ঘ রিকোয়েস্ট — --timeout বাড়ান, ভারী কাজ একটি কিউতে সরান |
| রিলিজের পর সবকিছু থেমে গেছে | আপনি systemctl restart myapp করতে ভুলে গেছেন — মেমোরির কোড নিজে থেকে আপডেট হয় না |
সিক্রেটগুলো
settings.py-তে নয়, বরং600অনুমতিসহ একটিEnvironmentFile-এ রাখুন। একটি সেটিংস ফাইল শীঘ্রই বা দেরিতে রিপোজিটরিতে থেকে যাবে।