فائل اپ لوڈ کے دوران ڈوکر 502 کی خرابیوں کا ازالہ کرنا
FastAPI، Docker Compose، اور فائل اپ لوڈز کے ساتھ کام کرتے وقت، آپ کو کبھی کبھار غلطیوں کا سامنا کرنا پڑ سکتا ہے، خاص طور پر بڑی فائل اپ لوڈز کے ساتھ۔ ڈویلپرز کی طرف سے رپورٹ کردہ ایک عام مسئلہ ہے a 502 خراب گیٹ وے خرابی، خاص طور پر جب بڑی فائلیں اپ لوڈ کرنے کی کوشش کر رہے ہوں، جیسے کہ 120MB .7z آرکائیو۔
اس قسم کی خرابی متعدد وجوہات کی وجہ سے ہوسکتی ہے، بشمول سرور کا ٹائم آؤٹ، ڈوکر میں کنفیگریشن کی حد، یا یہاں تک کہ ریورس پراکسی مسائل جیسے کہ Nginx کے ساتھ پیش آئے۔ اپ لوڈ کے ان مستقل مسائل کو حل کرنے کے لیے بنیادی وجہ کو سمجھنا کلید ہے۔
اگر آپ اپ لوڈز کے لیے FastAPI کا Swagger UI استعمال کر رہے ہیں، تو آپ کو عمل کے دوران ایپلیکیشن ریفریش یا کریش ہونے کی کوشش کر رہی ہے، خاص طور پر چھوٹی فائل اپ لوڈز کے ساتھ۔ یہ علامات متضاد رویے کا باعث بن سکتی ہیں اور مزید ڈیبگنگ کی ضرورت ہوتی ہے۔
اس گائیڈ میں، ہم اس بات پر غور کریں گے کہ ان خرابیوں کی وجہ کیا ہو سکتی ہے، بشمول فائل سائز کی حد، ریورس پراکسی غلط کنفیگریشنز، یا آپ کے بیک اینڈ کے دیگر مسائل ڈوکر کمپوز ماحول ہم FastAPI ایپلی کیشنز میں فائل اپ لوڈز سے نمٹنے کے دوران بار بار ہونے والی غلطیوں کو روکنے کے لیے ممکنہ حل بھی تلاش کریں گے۔
حکم | استعمال کی مثال |
---|---|
background_tasks.add_task() | یہ FastAPI کمانڈ ایک بیک گراؤنڈ ٹاسک کو شیڈول کرتا ہے جو کلائنٹ کو جواب بھیجے جانے کے بعد متضاد طور پر چلتا ہے۔ ٹائم آؤٹ یا تاخیر کے بغیر فائل نکالنے جیسے طویل عرصے سے چلنے والے کاموں کو سنبھالنے کے لیے یہ ضروری ہے۔ |
shutil.copyfileobj() | اس Python کمانڈ کا استعمال ایک فائل آبجیکٹ کے مواد کو مؤثر طریقے سے دوسری فائل میں کاپی کرنے کے لیے کیا جاتا ہے۔ فائل اپ لوڈ کے تناظر میں، یہ سرور کو آنے والی HTTP درخواست سے بڑی فائلوں کو ذخیرہ کرنے کی اجازت دیتا ہے۔ |
client_max_body_size | یہ Nginx ہدایت کلائنٹ کی درخواست کے جسم کے زیادہ سے زیادہ اجازت شدہ سائز کا تعین کرتی ہے۔ 120MB فائلوں جیسے بڑے اپ لوڈز کو ہینڈل کرتے وقت یہ بہت اہم ہے، کیونکہ اس حد سے تجاوز کرنے سے 413 غلطی ہو گی۔ اسے ایڈجسٹ کرنا 502 غلطیوں جیسے مسائل کو روکتا ہے۔ |
proxy_read_timeout | ایک اور Nginx ہدایت جو پراکسیڈ سرور سے جواب پڑھنے کا ٹائم آؤٹ سیٹ کرتی ہے۔ اس قدر کو بڑھانے سے 502 خراب گیٹ وے کی خرابیوں کو روکا جا سکتا ہے جب بڑی یا طویل عرصے سے چلنے والی فائل اپ لوڈز کو سنبھالتے ہیں۔ |
uuid.uuid4() | یہ Python فنکشن ایک بے ترتیب UUID (عالمی طور پر منفرد شناخت کنندہ) تیار کرتا ہے۔ فائل ہینڈلنگ میں، یہ یقینی بناتا ہے کہ اپ لوڈ کی گئی فائلوں کا منفرد نام رکھا جائے، موجودہ فائلوں کو اوور رائٹ کرنے سے گریز کیا جائے۔ |
uvicorn --timeout-keep-alive | یہ Uvicorn کمانڈ بڑی فائل اپ لوڈ کے دوران کنکشن کو زیادہ دیر تک زندہ رکھنے کے لیے ٹائم آؤٹ کی مدت میں توسیع کرتی ہے۔ یہ طویل آپریشن کے دوران ٹائم آؤٹ کو روکنے میں مدد کرتا ہے۔ |
async def | یہ Python کلیدی لفظ FastAPI میں ایک غیر مطابقت پذیر فنکشن کی وضاحت کرتا ہے۔ غیر مطابقت پذیر فنکشنز کا استعمال غیر مسدود I/O آپریشنز کی اجازت دیتا ہے، جو فائل اپ لوڈز جیسے کاموں کو مؤثر طریقے سے سنبھالنے کے لیے اہم ہے۔ |
HTTPException | یہ FastAPI کمانڈ ایک مخصوص اسٹیٹس کوڈ کے ساتھ HTTP کی خرابی پیدا کرتی ہے۔ اس کا استعمال حسب ضرورت خرابی کے پیغامات واپس کرنے کے لیے کیا جاتا ہے، جیسے کہ جب فائل کی غلط قسمیں اپ لوڈ ہوتی ہیں یا جب سرور پروسیسنگ ناکام ہوجاتی ہے۔ |
ڈوکر کمپوز کے ساتھ فاسٹ اے پی آئی میں 502 ایرر کے حل کو سمجھنا
پہلے فراہم کردہ اسکرپٹس کا مقصد بڑی فائلوں کو اپ لوڈ کرنے کے مسئلے سے نمٹنا ہے، خاص طور پر ایک 120MB .7z آرکائیو، فاسٹ اے پی آئی اور ڈوکر کمپوز کے ذریعے۔ بنیادی عناصر میں سے ایک کا استعمال ہے۔ پس منظر کے کام فاسٹ اے پی آئی میں۔ کا فائدہ اٹھا کر background_tasks.add_task() کمانڈ، فائل نکالنے کے عمل کو متضاد طور پر سنبھالا جاتا ہے، مطلب یہ کہ یہ بنیادی درخواست کے چکر کو مسدود نہیں کرتا ہے۔ یہ بڑی فائلوں پر کارروائی کرتے وقت ٹائم آؤٹ کی غلطیوں کو روکنے کے لیے ضروری ہے۔ اس خصوصیت کے بغیر، FastAPI مرکزی دھاگے میں موجود ہر چیز کو سنبھالنے کی کوشش کرے گا، اگر سرور کو جواب دینے میں بہت زیادہ وقت لگتا ہے تو ممکنہ طور پر 502 خراب گیٹ وے کی خرابی کا سبب بن سکتا ہے۔
ایک اور اہم خصوصیت کا استعمال ہے۔ shutil.copyfileobj() طریقہ، جو ڈسک پر اپ لوڈ کردہ فائل کو مؤثر طریقے سے لکھتا ہے۔ یہ فنکشن بڑی فائلوں کے لیے ڈیزائن کیا گیا ہے کیونکہ یہ فائل اسٹریم سے ٹکڑوں میں پڑھتا ہے، میموری اوورلوڈ کو روکتا ہے۔ Python میں UUID فنکشن اس بات کو یقینی بناتا ہے کہ ہر فائل کو اوور رائٹنگ کو روکنے کے لیے ایک منفرد نام ملے، جو ایسے ماحول میں اہم ہے جہاں ایک سے زیادہ صارفین فائلیں بیک وقت اپ لوڈ کر سکتے ہیں۔ اگر فائل کا نام منفرد نہیں ہے، تو آپ کو اپ لوڈ کے عمل کے دوران فائل میں بدعنوانی یا تنازعات کا سامنا کرنا پڑ سکتا ہے۔
ڈوکر کمپوز فائل کو فاسٹ اے پی آئی سرور کا استعمال کرتے ہوئے ٹائم آؤٹ کو بڑھانے کے لیے ترتیب دیا گیا ہے۔ uvicorn --timeout-رکھے-زندہ اختیار یہ کمانڈ اس بات کو یقینی بناتی ہے کہ سرور کلائنٹ کے ساتھ زیادہ دیر تک تعلق برقرار رکھ سکتا ہے، یہاں تک کہ جب بڑی فائلوں کو اپ لوڈ کرنے میں کافی وقت لگے۔ اسے 300 سیکنڈ (یا 5 منٹ) پر سیٹ کرکے، یہ ڈوکر کو کنکشن کو وقت سے پہلے بند کرنے سے روکتا ہے، جس کے نتیجے میں اکثر 502 غلطی ہوتی ہے۔ یہ طویل عرصے تک چلنے والے عمل کے دوران استحکام کو برقرار رکھنے میں بھی مدد کرتا ہے۔
آخر میں، Nginx ترتیب ترتیب دے کر بڑی فائل اپ لوڈ کی اجازت دینے میں اہم کردار ادا کرتی ہے۔ کلائنٹ_زیادہ سے زیادہ_باڈی_سائز 200MB کی ہدایت۔ یہ تبدیلی یقینی بناتی ہے کہ Nginx 1MB کی طے شدہ حد سے بڑی فائلوں کو قبول کر سکتا ہے۔ کے ساتھ جوڑا proxy_read_timeout ہدایت، جو سرور کو بیک اینڈ سرور کے جواب کے لیے زیادہ انتظار کرنے کی اجازت دیتی ہے، یہ ترتیبات ان غلطیوں سے بچنے میں مدد کرتی ہیں جو فائل کی سست یا بڑی منتقلی سے ہوتی ہیں۔ ایک ساتھ مل کر، یہ آپٹیمائزیشن اس بات کو یقینی بناتی ہے کہ آپ کی FastAPI ایپلیکیشن ڈوکر کمپوز ماحول میں کریش ہوئے یا 502 خرابیاں پیدا کیے بغیر بڑی فائل اپ لوڈز کو ہینڈل کر سکتی ہے۔
ڈوکر کمپوز کے ساتھ فاسٹ اے پی آئی میں بڑی فائل اپ لوڈز کے لیے 502 کی خرابی کو ہینڈل کرنا
حل 1: Python (FastAPI) آپٹمائزڈ فائل ہینڈلنگ اور بیک گراؤنڈ ٹاسک کے ساتھ بیک اینڈ اپروچ
# This FastAPI function handles large file uploads using background tasks.
from fastapi import FastAPI, UploadFile, File, BackgroundTasks, HTTPException, status
import os, shutil, uuid
from fastapi.responses import JSONResponse
app = FastAPI()
UPLOAD_DIR = "/app/uploads"
@app.post("/7zip/")
async def upload_7zip(background_tasks: BackgroundTasks, archive_file: UploadFile = File(...)):
# Check if the uploaded file is a valid .7z file
if not archive_file.filename.endswith(".7z"):
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Please upload a valid 7z file.")
# Generate a unique filename to prevent overwrites
archive_filename = f"{uuid.uuid4()}_{archive_file.filename}"
archive_path = os.path.join(UPLOAD_DIR, archive_filename)
try:
# Save the uploaded file to the server
with open(archive_path, "wb") as buffer:
shutil.copyfileobj(archive_file.file, buffer)
# Add file extraction to background tasks to avoid timeouts
background_tasks.add_task(extract_file, archive_path)
return JSONResponse({"message": "File uploaded successfully, extraction is in progress."})
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred while processing the 7z file: {str(e)}")
# Background task to extract files
def extract_file(archive_path: str):
# Placeholder function for extracting 7z files
pass
بڑے اپ لوڈز کو سنبھالنے کے لیے Nginx ریورس پراکسی کو بہتر بنانا
حل 2: بڑے فائل سائز کے اپ لوڈز کے لیے Nginx ریورس پراکسی کنفیگریشن
# Adjusting Nginx configuration to allow larger file uploads
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://app:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Set the maximum allowed upload size to 200MB
client_max_body_size 200M;
proxy_read_timeout 300;
}
بڑے اپ لوڈز کے دوران ٹائم آؤٹ سے بچنے کے لیے ڈاکر کمپوز کو بہتر بنانا
حل 3: بڑی فائل ہینڈلنگ کے لیے بڑھے ہوئے ٹائم آؤٹ کے ساتھ ڈوکر کمپوز کنفیگریشن
# Docker Compose file with increased timeout to avoid 502 errors
version: '3'
services:
app:
container_name: fastapi_app
build: .
command: bash -c "uvicorn main:app --host 0.0.0.0 --port 8000 --timeout-keep-alive=300"
ports:
- "8000:8000"
volumes:
- ./uploads:/app/uploads
depends_on:
- db
restart: always
environment:
- FASTAPI_ENV=production
db:
image: postgres
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
ڈوکر کمپوز کے ساتھ فاسٹ اے پی آئی میں فائل سائز کے مسائل پر قابو پانا
ایک اہم پہلو جو فائل اپ لوڈز کو متاثر کر سکتا ہے۔ ڈوکر کمپوز ماحولیات میموری اور ٹائم آؤٹ کے لیے سرور کی حدود کو سنبھالنا ہے۔ سرور ٹائم آؤٹ ایڈجسٹمنٹ اور ریورس پراکسی کنفیگریشنز کے علاوہ، فائل اپ لوڈز کو سسٹم لیول کی رکاوٹوں سے بھی متاثر کیا جا سکتا ہے، جیسے دستیاب میموری اور CPU وسائل۔ ایک بڑی فائل کو اپ لوڈ کرتے وقت، جیسے 120MB .7z آرکائیو، سرور میموری کی تھکن یا زیادہ CPU استعمال کا شکار ہو سکتا ہے، جس کی وجہ سے یہ درمیانی عمل کو کریش یا ریفریش کر سکتا ہے۔ یہ اس وقت مزید بڑھ سکتا ہے جب متعدد صارفین بیک وقت فائلیں اپ لوڈ کر رہے ہوں۔
ایک اور اہم نکتہ یہ ہے کہ فائل اپ لوڈ کی کارکردگی خود کنٹینرائزیشن کی وجہ سے گر سکتی ہے۔ ڈوکر فی کنٹینر وسائل کو الگ کرتا ہے، مطلب یہ ہے کہ جب تک مناسب طریقے سے ترتیب نہ دی جائے، ایک کنٹینر میں بڑی فائلوں کو مؤثر طریقے سے ہینڈل کرنے کے لیے کافی وسائل نہیں ہوسکتے ہیں۔ اس سے چھوٹی فائلوں کو سنبھالتے وقت سرور ریفریش یا کریش ہو سکتا ہے، جیسے کہ 16-17 MB رینج جس کا آپ نے تجربہ کیا ہے۔ یہ یقینی بنانا ضروری ہے کہ آپ کے Docker کنٹینرز میں ضروری CPU اور میموری کے وسائل مختص کیے گئے ہیں، اور حدود کو حقیقی دنیا کے منظرناموں میں جانچا جانا چاہیے۔
آخر میں، فاسٹ اے پی آئی کی درخواست کی ہینڈلنگ کو سٹریمنگ تکنیکوں کا استعمال کرتے ہوئے بہتر بنایا جا سکتا ہے، جو فائلوں کو ٹکڑے ٹکڑے کرنے کی اجازت دیتی ہے۔ اس سے سرور کی میموری کو مغلوب کیے بغیر بڑی فائلوں کو سنبھالنے میں مدد ملے گی۔ Nginx، Uvicorn، اور Docker وسائل کے مختص کی مناسب ترتیب کے ساتھ مل کر، سٹریمنگ آپ کے API کو مزید مضبوط بنا سکتی ہے۔ ان اضافی اصلاحوں کو شامل کرنا پیداواری ماحول میں بڑے یا ہم آہنگ فائل اپ لوڈز سے نمٹنے کے دوران بہتر استحکام کو یقینی بناتا ہے۔
فاسٹ اے پی آئی اور ڈوکر کمپوز فائل اپ لوڈز کے بارے میں اکثر پوچھے گئے سوالات
- بڑی فائلیں اپ لوڈ کرتے وقت ڈوکر 502 غلطی کیوں دیتا ہے؟
- خرابی کی وجہ سے ہوسکتی ہے۔ timeout issues یا ڈوکر میں وسائل کی رکاوٹیں۔ ایڈجسٹ کرنا uvicorn --timeout-keep-alive اور proxy_read_timeout Nginx میں اس کو کم کرنے میں مدد مل سکتی ہے۔
- میں فاسٹ اے پی آئی میں فائل اپ لوڈ سائز کی حد کو کیسے بڑھا سکتا ہوں؟
- بڑے اپ لوڈز کی اجازت دینے کے لیے، آپ کو ترمیم کرنے کی ضرورت ہے۔ client_max_body_size اپنی Nginx کنفیگریشن میں اور یقینی بنائیں کہ Docker اور FastAPI بڑی فائلوں کے لیے مناسب طریقے سے کنفیگر کیے گئے ہیں۔
- کیا پس منظر کے کام بڑی فائل اپ لوڈ کے دوران ٹائم آؤٹ کو روک سکتے ہیں؟
- ہاں، فاسٹ اے پی آئی کا استعمال کرنا background_tasks.add_task() مین تھریڈ کو بلاک کرنے اور ٹائم آؤٹ کو روکنے کے لیے پروسیسنگ کے کاموں کو آف لوڈ کرنے میں مدد کر سکتا ہے۔
- چھوٹی فائلیں اپ لوڈ کرتے وقت میرا ڈوکر کنٹینر ریفریش کیوں ہوتا ہے؟
- یہ کنٹینر کے اندر وسائل کی حدود کی وجہ سے ہو سکتا ہے۔ یقینی بنائیں کہ کنٹینر میں کافی میموری اور CPU مختص ہے۔
- دوسری کون سی FastAPI کنفیگریشنز بڑی فائلوں میں مدد کر سکتی ہیں؟
- آپ سٹریمنگ اپ لوڈز کو فعال کر کے اور غیر مطابقت پذیر استعمال کر کے FastAPI کو بہتر بنا سکتے ہیں۔ async def I/O آپریشنز کو مؤثر طریقے سے ہینڈل کرنے کے فنکشنز۔
ڈوکر میں 502 غلطیوں کو حل کرنے کے بارے میں حتمی خیالات
Docker کے اندر FastAPI میں بڑی فائل اپ لوڈز کو ہینڈل کرنے کے لیے سرور کے ٹائم آؤٹ، فائل سائز کی حد، اور کنٹینر ریسورس ایلوکیشن کی سوچ سمجھ کر ترتیب کی ضرورت ہوتی ہے۔ ان ترتیبات کو ایڈجسٹ کرنے سے اپ لوڈز کے دوران 502 غلطیوں سے بچنے میں مدد مل سکتی ہے۔
اگر ڈوکر کنٹینرز میں کافی میموری یا CPU کی کمی ہے تو چھوٹے اپ لوڈز بھی مسائل کا باعث بن سکتے ہیں۔ غیر مطابقت پذیر پروسیسنگ تکنیکوں کے ساتھ وسائل کی مناسب حدود کو لاگو کرنا، فائل کو ہموار کرنے اور سسٹم کے استحکام کو یقینی بناتا ہے۔
ڈوکر 502 ایرر سلوشنز کے حوالے اور ذرائع
- FastAPI کے پس منظر کے کاموں اور بڑے اپ لوڈز کے لیے async فائل ہینڈلنگ کی تفصیل کے ساتھ، اس کے سرکاری دستاویزات کے ساتھ وضاحت کرتا ہے۔ فاسٹ اے پی آئی پس منظر کے کام
- 502 غلطیوں کو روکنے کے لیے Nginx کنفیگریشنز، جیسے client_max_body_size اور پراکسی سیٹنگز میں بصیرت فراہم کرتا ہے۔ Nginx کلائنٹ کا زیادہ سے زیادہ جسمانی سائز
- ڈوکر کمپوز ریسورس مینجمنٹ اور بڑی فائل اپ لوڈز کو ہینڈل کرنے کے لیے کنٹینرز کو ترتیب دینے کے بہترین طریقوں پر تبادلہ خیال کرتا ہے۔ ڈاکر کمپوز دستاویزات
- Uvicorn کی آفیشل دستاویزات میں بتایا گیا ہے کہ توسیع شدہ فائل اپ لوڈز کے دوران کنکشنز کو زندہ رکھنے کے لیے سرور ٹائم آؤٹ کو کیسے ایڈجسٹ کیا جائے۔ Uvicorn ٹائم آؤٹ کی ترتیبات