500 त्रुटियाँ क्यों आती हैं और कैसे ठीक करें
500 Internal Server Error की वजहें पहचानने, लॉग पढ़ने और resource/timeouts जैसे कारणों को ठीक करने की व्यावहारिक गाइड।

एक वेबसाइट में 500 त्रुटियाँ क्यों आती हैं और उन्हें कैसे ठीक करें: एक व्यावहारिक ट्राइएज गाइड
500 त्रुटि ऐसी समस्या है जो यह बताए बिना साइट को टूटा हुआ महसूस कराती है कि असल दिक्कत कहाँ है। ब्राउज़र एक सादा-सी चेतावनी दिखाता है, विज़िटर को आगे रास्ता नहीं मिलता, और वास्तविक गलती अक्सर कहीं और होती है। इसी वजह से “एक वेबसाइट में 500 त्रुटियाँ क्यों आती हैं और उन्हें कैसे ठीक करें” का सवाल अनुमान लगाने की बजाय ट्राइएज का काम बन जाता है, और यही वजह है कि लोग अक्सर पहले यह पूछते हैं कि 500 internal server error क्या है।
शुरुआत एक नियम से करें: हर खराब दिखने वाले एरर पेज को असली सर्वर-साइड 500 न मानें। 502, 503, गेटवे टाइमआउट, या Cloudflare का ब्रांडेड प्रॉक्सी पेज भी इतना मिलता-जुलता हो सकता है कि अनुभवी टीम भी भ्रमित हो जाए। एक गलत लेबल आपका एक घंटा खराब कर सकता है, और बहुत बार वेबसाइट में 500 error क्यों आता है का जवाब इसी गलत पहचान से छूट जाता है।
1. पहले यह पक्का करें कि त्रुटि सच में सर्वर-साइड 500 है
पेज को प्राइवेट विंडो में खोलें और उसका सटीक संदेश नोट करें। साधारण ओरिजिन एरर अक्सर “500 Internal Server Error” या कुछ उतना ही सामान्य लिखता है, जबकि प्रॉक्सी लेयर अपना कोड, रिक्वेस्ट ID, या अपस्ट्रीम सर्वर के बारे में संदेश दिखा सकती है। यह छोटा-सा फर्क मायने रखता है, क्योंकि 502 आम तौर पर खराब गेटवे रिस्पॉन्स की ओर इशारा करता है, जबकि 503 अक्सर बताता है कि सेवा अस्थायी रूप से उपलब्ध नहीं है।
कम से कम 2 रास्तों से रिस्पॉन्स जाँचें: ब्राउज़र से और, अगर संभव हो, तो कमांड-लाइन रिक्वेस्ट से। अगर ब्राउज़र पर 500 दिख रहा है लेकिन एज पर सर्वर असल में 502 लौटा रहा है, तो आप गलत सिस्टम के पीछे भाग सकते हैं। स्रोत बदलते ही समाधान भी बदल जाता है, इसलिए यह समझना ज़रूरी है कि 500 त्रुटि कैसे ठीक करें इससे पहले कि आप असली वजह पकड़ें।
Cloudflare, Fastly, nginx, Apache, और आपका ऐप—हर एक विफलता को अलग तरीके से चिह्नित कर सकता है। एक साइट में 5xx लेबल वाला साफ-सुथरा CDN पेज दिख सकता है, जबकि दूसरी में सफेद स्क्रीन और HTML बॉडी में एक छोटी-सी लाइन आती है। लक्षण एक जैसे, कारण अलग।
2. त्रुटि को नियंत्रित तरीके से दोहराएँ
वही सटीक URL टेस्ट करें जो फेल हो रहा है, सिर्फ होमपेज नहीं। /checkout पर 500 किसी एक फॉर्म फ़ील्ड, एक प्लगइन हुक, या एक रूट नियम की वजह से हो सकता है, जबकि फ्रंट पेज ठीक काम कर रहा हो। अगर समस्या सिर्फ 1 URL पर आती है, तो खोज बहुत सीमित हो जाती है।
रिक्वेस्ट को 3 चर पर दोहराएँ: ब्राउज़र, डिवाइस, और समय। अगर यह डेस्कटॉप Chrome पर फेल होता है लेकिन मोबाइल Safari पर नहीं, तो संभव है कि कोई स्क्रिप्ट पथ या कैश-से जुड़ा edge case हो। अगर यह सिर्फ न्यूज़लेटर इम्पोर्ट के बाद या रात 2 बजे होता है, तो समय खुद एक संकेत है।
टेस्ट को उबाऊ बनाइए। एक रिक्वेस्ट, एक बदलाव, एक परिणाम। फिर वही URL अलग लॉग-इन स्थिति में आज़माएँ, क्योंकि ऑथेंटिकेटेड यूज़र्स कभी-कभी ऐसे कोड पाथ ट्रिगर करते हैं जिन्हें मेहमान कभी छूते ही नहीं। यह खासकर एडमिन पैनल या मेंबर डैशबोर्ड वाली साइटों में आम है।
एक साधारण रिकॉर्ड रखें: URL, समय, कार्रवाई, और प्रतिक्रिया। चार फ़ील्ड पर्याप्त हैं। जैसे ही आपके पास 3 या 4 एंट्री होंगी, पैटर्न दिखने लगेंगे।
3. वेब सर्वर के error log में पहले failure point को देखें
पेज दूसरी बार फेल हो जाए तो आम तौर पर सबसे पहले error log देखना चाहिए। 500 के टाइमस्टैम्प को सबसे नज़दीकी लॉग एंट्री से मिलाएँ, फिर उसके पहले और बाद की पंक्ति पढ़ें। पहली पंक्ति अक्सर उतना बता देती है जितना एरर पेज कभी नहीं बताएगा।
आप script name, module name, permission warning, या upstream timeout ढूँढ रहे हैं। कोई fatal PHP error सीधे फ़ाइल का नाम बता सकता है। कोई web server error missing directory, bad rewrite target, या backend process से denied connection का ज़िक्र कर सकता है।
एक उपयोगी आदत: फेल हुए रिक्वेस्ट का सटीक टाइमस्टैम्प कॉपी करें और उसे access logs तथा error logs से मिलाएँ। अगर साइट व्यस्त है, तो “सबसे नज़दीकी” घटना कुछ सेकंड गलत भी हो सकती है, इसलिए request path और status code भी देखिए। अगर आपके stack में request ID जुड़ता है, तो वही लंबी खोज बचा सकता है।
जब लॉग में plugin, library, या module का नाम आए, वहीं थोड़ा रुकिए। आसपास का संदर्भ पढ़िए। “allowed memory size exhausted” जैसी पंक्ति resource limits की ओर इशारा करती है, जबकि “permission denied” ownership या mode समस्याओं की ओर, भले ही दोनों 500 के रूप में दिखें।
4. resource-limit और timeout triggers की जाँच करें
500 त्रुटियाँ अक्सर तब आती हैं जब सर्वर किसी बुनियादी चीज़ से बाहर हो जाता है। Memory एक है। Execution time दूसरी। Worker slots तीसरी। इनमें से कोई भी भर जाए तो रिक्वेस्ट पेज बनने से पहले ही फेल हो सकता है।
PHP memory exhaustion एक क्लासिक मामला है। रिपोर्ट export, image resize, या product import को उपलब्ध memory से ज़्यादा चाहिए हो सकती है, और नतीजा graceful warning की बजाय 500 हो सकता है। अगर विफलता बड़े requests के दौरान शुरू हो और load कम होने पर रुक जाए, तो यह बहुत मज़बूत शक है।
Execution time limits भी जाँचें। कोई script जो बहुत देर तक loop करती है, timeout से टकरा सकती है और सर्वर को सफाई करनी पड़ती है। यह import jobs, cron tasks, या किसी धीमे API call के दौरान हो सकता है जो दूसरी सेवा का इंतज़ार करती रहती है। एक धीमा dependency भी काफी है।
Worker या process saturation को पहचानना आसान नहीं होता क्योंकि हल्के traffic में साइट पूरी तरह स्वस्थ दिख सकती है। फिर एक साथ 20 requests आती हैं, queue भर जाती है, और नई requests फेल होने लगती हैं। कुछ hosting plans CPU, entry processes, या I/O पर account-level limits भी लगाते हैं, इसलिए समस्या कोड की बजाय plan में भी हो सकती है।
अगर आपके stack में monitoring है, तो देखें कि traffic spikes के साथ 500s बढ़ते हैं या नहीं। जो 500 सिर्फ campaign, release, या backup window के दौरान आता है, वह अक्सर load समस्या होती है, बस नाम अलग होता है। इसी संदर्भ में website monitoring में क्या बदला आगे के alerting की दिशा समझने में मदद कर सकता है।
5. CMS के बाहर file और folder permissions की जाँच करें
हर 500 एप्लिकेशन से नहीं आता। Deploy, sync, या migration के बाद फ़ाइलें गलत user की ownership में हो सकती हैं। Folder permissions भी बदल सकते हैं। एक बदला हुआ directory mode cache, logs, या uploads पर write रोक सकता है और request के समय failure पैदा कर सकता है।
सबसे पहले उन जगहों को देखें जिन्हें लोग भूल जाते हैं: uploads, temporary files, configuration files, deployment artifacts, और log directories। अगर इनमें से कोई path web server user के लिए writable नहीं है, तो site session file लिखते ही या cache entry बनाते ही फेल हो सकती है। छोटी समस्या, बड़ा शोर।
Ownership problems खासकर एक host से दूसरे host पर migration के बाद आम हैं। किसी file के permission bits सही हो सकते हैं लेकिन owner गलत हो सकता है, और इससे प्रक्रिया फिर भी block हो जाती है। यह वही सूक्ष्म विवरण है जो 500 को तर्कहीन बना देता है, जब तक आप CMS से बाहर निकलकर server layer को सीधे न देखें।
Permissions “ठीक” करने के लिए सब कुछ खुला न छोड़ें। जल्दी में किया गया chmod 777 समस्या छिपा सकता है, लेकिन इससे security गड़बड़ा जाती है और अक्सर असली ownership mismatch भी ढक जाता है। अगर बदलावों के बाद server के लिए security baseline चाहिए, तो साइट की व्यापक website security गाइडेंस टेस्ट करते समय पास रखना उपयोगी है।
6. हाल की server या deployment changes की समीक्षा करें
1 deploy, 1 host change, या 1 config edit पीछे जाएँ। 500s अक्सर PHP version बदलने, web server rewrite, नए redirect rule, या cron job update के तुरंत बाद शुरू होते हैं। अगर समस्या migration के बाद आई है, तो migration खुद ट्रिगर हो सकती है।
PHP version का उछाल पुराने कोड को उजागर कर सकता है जो पहले चुपचाप चल जाता था। जो module एक version पर सही चलता था, वह दूसरे पर फेल हो सकता है। यही बात web server directives पर भी लागू होती हैं जिन्हें पिछले महीने स्वीकार किया जाता था, लेकिन अब config पढ़ते समय error दे देते हैं। एक पंक्ति भी नुकसान कर सकती है।
Security rules भी एक आम कारण हैं। WAF rule, नया firewall condition, या server hardening बदलाव किसी संदिग्ध दिखने वाली request को रोक सकता है, भले वह वैध हो। यहीं change log, memory से हमेशा बेहतर साबित होता है, क्योंकि लोग अक्सर उस “छोटे” update को भूल जाते हैं जिसने route तोड़ दिया।
अगर deployment शामिल था, तो आख़िरी काम करने वाले release की तुलना मौजूदा one से करें। पहले 3 चीज़ें देखें: config files, routing rules, और कोई नया background job। समस्या अक्सर उसी feature में नहीं होती जिसे आपने ship किया, बल्कि उसके साथ आए side effect में होती है।
7. सबसे छोटे सुरक्षित rollback से सेवा बहाल करें
Rollback सीमित होना चाहिए। सबसे पहले नए server-side बदलाव को बंद करें, पूरे system को नहीं। एक-एक करके एक config file, एक rule, या एक deployment step वापस लें ताकि पता चले कौन-सा कदम साइट को ठीक करता है। सब कुछ एक साथ उलट दिया तो सुराग खो जाएगा।
सबसे कम जोखिम वाली आख़िरी बदली हुई चीज़ से शुरू करें। अगर failure से 20 मिनट पहले नया redirect rule जोड़ा गया था, उसे comment out करके फिर टेस्ट करें। अगर कोई PHP setting बदली गई थी, तो उसे पुराने value पर ले जाएँ और फिर जाँचें। लक्ष्य सेवा बहाल करना है, न कि नाटकीय सफाई।
Code deploys के लिए एक सुरक्षित copy तैयार रखें और सिर्फ प्रभावित release को rollback करें। Server configuration के लिए edit करने से पहले मौजूदा file save करें ताकि line by line तुलना हो सके। यह बुनियादी लगता है क्योंकि यह बुनियादी ही है, और बुनियादी कदम सबसे लंबे outages रोकते हैं।
कभी-कभी सबसे छोटा सुरक्षित rollback तकनीकी नहीं होता। अगर कोई cron job हर 5 मिनट में server को flood कर रहा है, तो job रोकिए और site पर नज़र रखिए। अगर backup script resources खा रही है, तो application छूने से पहले schedule बदलिए। साइट को यह नहीं फर्क पड़ता कि server क्यों थक गया है।
8. वही 500 दोबारा न लौटे, इसकी रोकथाम करें
Log monitoring सेट करें ताकि पहला repeated 500 ग्राहकों के शिकायत करने से पहले दिख जाए। एक isolated error एक बात है। उसी route से 5 बार आना pattern है। Alert में route, timestamp, और error text दिखना चाहिए।
Production से पहले staging पर deployments करें। Staging copy गलत config edits और version mismatches पकड़ लेती है, जो वरना पहले live traffic को लगते। Stack को production के जितना संभव हो उतना करीब रखें, क्योंकि test box में harmless दिखने वाली setting असली server पर फेल हो सकती है।
Changes को एक ही जगह ट्रैक करें। इसमें config edits, plugin updates, PHP changes, cron tweaks, और security rule updates शामिल हैं। अगर आप पहले से site changes map कर रहे हैं, तो ostohlo blog में संबंधित सामग्री ostohlo स्टूडियो ब्लॉग में मिल सकती है, जो memory की बजाय रिकॉर्ड चाहिए होने पर काम आती है।
Alerts तब सबसे अहम होते हैं जब वे बार-बार आएँ। अगर वही 500 response हर deploy या हर traffic spike के बाद लौट आता है, तो review threshold बढ़ाइए और incident note में 3 बातें लिखकर रखिए: क्या बदला, कहाँ फेल हुआ, और किसने ठीक किया। अगली बार यही नोट आपका सबसे तेज़ जवाब होगा, खासकर तब जब अगला failure किसी ऐसे deploy window में आए जिसकी आपने उम्मीद नहीं की थी।