Ubuntu 24.04 पर LAMP स्टैक और PHP-FPM कैसे सेटअप करें
Ubuntu 24.04 पर Apache, MariaDB और PHP 8.3 के साथ LAMP स्टैक इंस्टॉल करें। इस गाइड में unix_socket ऑथेंटिकेशन, PHP-FPM कॉन्फ़िगरेशन और Certbot के जरिए मुफ्त HTTPS सेटअप शामिल है।
आप क्या बना रहे हैं
LAMP स्टैक एक Ubuntu 24.04 सर्वर पर चार गतिशील भागों का संयोजन है: आधार के रूप में Linux, HTTP अनुरोधों का उत्तर देने के लिए Apache, डेटा रखने के लिए MariaDB, और कोड चलाने के लिए PHP 8.3। इस प्रक्रिया के अंत में, आपके पास एक नाम-आधारित वर्चुअल होस्ट होगा जो एक वास्तविक एप्लिकेशन डायरेक्टरी को सर्व करेगा, न्यूनतम विशेषाधिकार वाला एक समर्पित डेटाबेस उपयोगकर्ता होगा, PHP-FPM के माध्यम से Apache से जुड़ी PHP होगी, और ऊपर एक मुफ्त Let's Encrypt प्रमाणपत्र होगा।
इंस्टॉलेशन प्रक्रिया में केवल चार apt कमांड शामिल हैं। इस गाइड का अधिकांश भाग इन घटकों के बीच का संयोजन है, और उन सामान्य गलतियों को ठीक करना है जिनके कारण एक नया स्टैक खाली पेज दिखाता है, ब्राउज़र को सोर्स कोड डाउनलोड के रूप में दे देता है, या आपको आपके द्वारा इंस्टॉल किए गए डेटाबेस में प्रवेश करने से रोकता है। इनमें से प्रत्येक समस्या का एक विशिष्ट संकेत होता है जिसे आप पहचान सकते हैं, और नीचे प्रत्येक का नाम उस सटीक टेक्स्ट के साथ दिया गया है जो आपको दिखाई देगा।
पूर्व-आवश्यकताएँ और महत्वपूर्ण सावधानियाँ
मान लें कि आपके पास Ubuntu 24.04 का एक नया KVM VPS है, जिसमें sudo उपयोगकर्ता या root का एक्सेस है और एक सार्वजनिक IPv4 पता है। एक न्यूनतम स्टैक 1 GB RAM में चल सकता है; लेकिन उस पर कोई वास्तविक डेटाबेस-आधारित एप्लिकेशन चलाने से पहले उसे 2 GB RAM दें, क्योंकि MariaDB के डिफ़ॉल्ट बफ़र्स और कुछ PHP-FPM वर्कर्स जल्दी ही पहली गीगाबाइट मेमोरी का उपयोग कर लेते हैं।
अंत में Certbot के काम करने के लिए दो शर्तें पूरी होनी चाहिए, इसलिए उन्हें अभी व्यवस्थित कर लें। आपके पास एक domain name होना चाहिए जिसका A record VPS के सार्वजनिक IP पर पॉइंट करता हो। Let's Encrypt HTTP के माध्यम से उस नाम का सत्यापन करता है, और केवल एक IP पते के लिए सर्टिफिकेट प्राप्त नहीं किया जा सकता है। साथ ही, 80 और 443 पोर्ट इंटरनेट से एक्सेस योग्य होने चाहिए। कई प्रदाताओं के लिए इसका मतलब है कि उन्हें कंट्रोल पैनल में नेटवर्क फ़ायरवॉल के साथ-साथ बॉक्स के अंदर ufw में भी खोलना होगा। DNS परिवर्तनों को लागू होने में एक घंटे तक का समय लग सकता है, इसलिए A record को पहले ही सेट कर लें ताकि जब आपको इसकी आवश्यकता हो, तब तक यह सक्रिय हो जाए।
Step 1 - Apache इंस्टॉल करें और डिफ़ॉल्ट पेज की पुष्टि करें
sudo apt update
sudo apt install -y apache2apt आपके लिए सर्विस को स्टार्ट और इनेबल करता है। इसकी जाँच करें:
systemctl status apache2आपको एक लाइन की आवश्यकता है जिसमें active (running) लिखा हो। अब ब्राउज़र में http://YOUR_SERVER_IP/ खोलें। Apache2 Ubuntu Default Page जिस पर बड़ा "It works!" बैनर है, सही परिणाम है। यह इस बात का प्रमाण है कि Apache सर्विस दे रहा है, कोई त्रुटि नहीं है। वह पेज /var/www/html/index.html पर स्थित है और इसे शिप किए गए डिफ़ॉल्ट वर्चुअल होस्ट 000-default.conf द्वारा सर्व किया जाता है। आप बाद में दोनों को डिसेबल कर देंगे; अभी के लिए उनकी उपस्थिति वही है जिसे आप देखना चाहते हैं।
यदि पेज बिल्कुल भी लोड नहीं होता है लेकिन systemctl कहता है कि प्रोसेस चल रही है, तो फ़ायरवॉल बाधा डाल रहा है। यह अगला चरण है।
Step 2 - HTTP और HTTPS के लिए फायरवॉल खोलें
apache2 पैकेज तीन ufw एप्लिकेशन प्रोफाइल रजिस्टर करता है। उन्हें सूचीबद्ध करें:
sudo ufw app listआप Apache, Apache Full, और Apache Secure देखेंगे। Apache केवल पोर्ट 80 है, Apache Secure केवल 443 है, और Apache Full दोनों है; यही वह है जिसकी आपको आवश्यकता है, क्योंकि आप अंत में TLS जोड़ रहे हैं।
sudo ufw allow OpenSSH
sudo ufw allow "Apache Full"
sudo ufw enableufw enable चलाने से पहले OpenSSH को अनुमति दें। ufw डिफ़ॉल्ट रूप से सभी इनकमिंग ट्रैफ़िक को अस्वीकार करता है, और SSH नियम के बिना इसे सक्षम करने पर सक्रिय होते ही आपका कनेक्शन कट जाएगा; आप वर्तमान सत्र में बने रहेंगे लेकिन दोबारा कनेक्ट नहीं हो पाएंगे। sudo ufw status के साथ पुष्टि करें; आप चाहेंगे कि OpenSSH, Apache Full, और उनके v6 समकक्ष सभी ALLOW दिखाएं।
चरण 3 - MariaDB इंस्टॉल करें और इसे सुरक्षित करें
sudo apt install -y mariadb-server
systemctl status mariadbUbuntu 24.04 में MariaDB 10.11 शामिल है, जो एक लॉन्ग-टर्म-सपोर्ट रिलीज़ है, इसलिए आपको किसी बाहरी रिपॉजिटरी की आवश्यकता नहीं है। सर्विस के चलने के बाद, इसे सुरक्षित (harden) करें:
sudo mysql_secure_installationप्रॉम्प्ट्स को केवल Enter दबाकर आगे बढ़ाने के बजाय उन्हें पढ़ना बेहतर है। जब यह current root password के लिए पूछे, तो Enter दबाएं, क्योंकि अभी कोई पासवर्ड सेट नहीं है। जब यह "Switch to unix_socket authentication?" पूछे, तो उत्तर से कोई फर्क नहीं पड़ता क्योंकि यह इस पैकेज पर पहले से ही सक्षम है, इसलिए n दबाएं। "Change the root password?" के लिए n कहें, जिसका कारण अगले पैराग्राफ में दिया गया है, फिर बाकी के लिए Y उत्तर दें: अनाम उपयोगकर्ताओं (anonymous users) को हटाएं, रिमोट रूट लॉगिन को अस्वीकार करें, टेस्ट डेटाबेस को हटाएं, और प्रिविलेज टेबल को पुनः लोड करें।
यहाँ वह हिस्सा है जो सभी को भ्रमित करता है। Ubuntu के MariaDB पर root डेटाबेस अकाउंट पासवर्ड के बजाय unix_socket ऑथेंटिकेशन का उपयोग करता है। इसका मतलब है कि डेटाबेस उस ऑपरेटिंग-सिस्टम उपयोगकर्ता पर भरोसा करता है जिसके रूप में आपने पहले ही ऑथेंटिकेट किया है। इसलिए यह रूट शेल से काम करता है:
sudo mysql...और यह आपको बिना पासवर्ड मांगे MariaDB [(none)]> प्रॉम्प्ट पर ले आता है। एक अनप्रिविलेज्ड उपयोगकर्ता के रूप में चलाया गया वही कमांड अस्वीकार कर दिया जाता है, जो कि इसका मुख्य उद्देश्य है: डेटाबेस रूट तक पहुंच बॉक्स पर sudo से जुड़ी होती है, और चोरी करने, फिशिंग करने या ब्रूट-फोर्स करने के लिए कोई पासवर्ड नहीं होता है। यह पासवर्ड से अधिक सुरक्षित है, इसलिए इसे न बदलें। इससे जो नियम निकलता है वह यह है: कभी भी किसी एप्लिकेशन को root अकाउंट पर पॉइंट न करें। प्रत्येक एप्लिकेशन के लिए एक समर्पित उपयोगकर्ता बनाएं (चरण 7), क्योंकि TCP के माध्यम से यूजरनेम और पासवर्ड के साथ कनेक्ट होने वाला ऐप वैसे भी सॉकेट ऑथेंटिकेशन का उपयोग नहीं कर सकता है, और आप चाहते हैं कि प्रत्येक ऐप अपने स्वयं के डेटाबेस तक ही सीमित रहे।
चरण 4 - PHP 8.3 को PHP-FPM के साथ इंस्टॉल करें
Ubuntu 24.04 का डिफ़ॉल्ट PHP संस्करण 8.3 है। FPM प्रोसेस मैनेजर और उन एक्सटेंशन को इंस्टॉल करें जिनकी एक सामान्य एप्लिकेशन को आवश्यकता होती है:
sudo apt install -y php8.3-fpm php8.3-mysql php8.3-cli \
php8.3-curl php8.3-xml php8.3-mbstring php8.3-zipध्यान दें कि उस सूची में क्या नहीं है: libapache2-mod-php। वह पुराना पैकेज हर Apache प्रोसेस के भीतर एक PHP इंटरप्रेटर को एम्बेड करता है। यह सरल है, लेकिन हर वर्कर एक PHP कॉपी रखता है, चाहे वह स्क्रिप्ट सर्व कर रहा हो या कोई स्टेटिक इमेज। दोनों का लाइफसाइकिल एक ही होता है, और यह केवल Apache के prefork MPM के साथ काम करता है, जो सबसे कम कुशल है। इसके बजाय PHP-FPM PHP को प्रोसेस के अपने पूल के रूप में चलाता है, जिससे Apache एक सॉकेट के माध्यम से बात करता है। Apache तब स्टेटिक फाइलों के लिए थ्रेडेड event MPM का उपयोग कर सकता है और केवल PHP अनुरोधों को आगे भेज सकता है। पूल को वेब सर्वर से स्वतंत्र रूप से ट्यून किया जाता है, और यदि आप बाद में nginx का उपयोग करते हैं, तो भी यही FPM सेटअप काम करता है। अच्छे कारणों से यह वर्तमान डिफ़ॉल्ट है।
Apache, proxy_fcgi मॉड्यूल के माध्यम से FPM तक पहुँचता है। इसे इनेबल करें, FPM पैकेज द्वारा डाली गई कॉन्फ़िगरेशन को इनेबल करें, और रीस्टार्ट करें:
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
sudo systemctl restart apache2a2enconf php8.3-fpm, /etc/apache2/conf-available/php8.3-fpm.conf को सक्रिय करता है, जिसमें वह नियम होता है जो PHP फाइलों को FPM सॉकेट पर रूट करता है। इसका मुख्य भाग किसी भी .php फाइल से मेल खाता है और उसे /run/php/php8.3-fpm.sock पर स्थित सॉकेट पर फॉरवर्ड करता है:
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>आपको उस फाइल को एडिट करने की आवश्यकता नहीं है; यह सही स्थिति में आती है। लेकिन सॉकेट पाथ की जानकारी होना आपको बाद में आने वाली "PHP डाउनलोड्स इंस्टेड ऑफ रनिंग" और "प्राइमरी स्क्रिप्ट अननोन" जैसी त्रुटियों का निदान करने में मदद करती है। ये दोनों समस्याएं Apache और FPM के इस सॉकेट या उसके पीछे की फाइल पर असहमत होने के कारण होती हैं।
Step 5 - अपने ऐप के लिए नेम-बेस्ड वर्चुअल होस्ट
नेम-बेस्ड वर्चुअल होस्टिंग एक ही IP पर कई साइट्स चलाने की सुविधा देती है; Apache अनुरोध में मौजूद Host: हेडर के आधार पर साइट का चयन करता है। ऐप के लिए एक डायरेक्टरी बनाएं, जो डिफ़ॉल्ट /var/www/html से अलग हो:
sudo mkdir -p /var/www/testapp
sudo chown -R www-data:www-data /var/www/testapp
sudo chmod -R 755 /var/www/testappओनरशिप (स्वामित्व) महत्वपूर्ण है। Ubuntu पर Apache और PHP-FPM दोनों www-data यूजर के रूप में चलते हैं, इसलिए जिन फाइलों को वेब सर्वर को पढ़ना है, और जिन डायरेक्टरी में ऐप को लिखना है (जैसे कि uploads फोल्डर), उनका ओनर www-data होना चाहिए। यदि आप अपने लॉगिन यूजर के रूप में भी फाइलें एडिट करेंगे, तो एक सामान्य तरीका यह है कि फाइलों का ओनर खुद को रखें और अपने यूजर को www-data ग्रुप में जोड़ें; एक साधारण डिप्लॉयमेंट के लिए, www-data:www-data सबसे सरल विकल्प है।
/etc/apache2/sites-available/testapp.conf पर वर्चुअल होस्ट बनाएं:
<VirtualHost *:80>
ServerName app.example.com
DocumentRoot /var/www/testapp
<Directory /var/www/testapp>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/testapp-error.log
CustomLog ${APACHE_LOG_DIR}/testapp-access.log combined
</VirtualHost>ServerName को अपने वास्तविक डोमेन पर सेट करें। Options -Indexes तब Apache को डायरेक्टरी लिस्टिंग दिखाने से रोकता है जब कोई इंडेक्स फाइल मौजूद न हो, अन्यथा विजिटर्स आपके सोर्स ट्री को ब्राउज़ कर सकते हैं। AllowOverride All एक .htaccess फाइल को काम करने की अनुमति देता है, जिसकी अपेक्षा अधिकांश PHP एप्लिकेशन सुंदर URL (pretty URLs) के लिए करते हैं; यदि आपके ऐप को इसकी आवश्यकता नहीं है, तो थोड़ी गति बढ़ाने के लिए इसे None पर सेट करें। इस साइट को इनेबल करें, डिफ़ॉल्ट को डिसेबल करें, कॉन्फ़िगरेशन की जांच करें, और रिलोड करें:
sudo a2ensite testapp
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2apache2ctl configtest को Syntax OK प्रिंट करना चाहिए। a2dissite 000-default लाइन वह है जिसे लोग अक्सर भूल जाते हैं, और यही कारण है कि बाद में डिफ़ॉल्ट पेज अटका हुआ दिखाई देता है, जिसका विवरण विफलताओं (failures) वाले सेक्शन में दिया गया है।
चरण 6 - PHP के चलने की पुष्टि करें, फिर प्रमाण को हटा दें
ऐप रूट में एक लाइन की PHP फ़ाइल डालें:
echo "<?php phpinfo();" | sudo tee /var/www/testapp/info.phphttp://app.example.com/info.php पर जाएँ। एक सही परिणाम लंबी बैंगनी और ग्रे रंग की PHP Version 8.3.x तालिका है, जिसमें आपके लोड किए गए मॉड्यूल सूचीबद्ध होंगे, और Server API लाइन में FPM/FastCGI लिखा होगा। यह अंतिम लाइन पुष्टि करती है कि अनुरोध mod_php के बजाय PHP-FPM के माध्यम से जा रहे हैं।
अब इसे तुरंत हटा दें:
sudo rm /var/www/testapp/info.phpphpinfo() आपके सटीक PHP संस्करण, प्रत्येक लोड किए गए एक्सटेंशन, फ़ाइल पाथ और एनवायरनमेंट विवरण को उजागर करता है, जो सर्वर में ज्ञात खामियों को खोजने वाले किसी भी व्यक्ति के लिए एक उपहार है। यह एक परीक्षण है, कोई सुविधा नहीं। पेज देखने के तुरंत बाद इसे हटा दें। यदि तालिका के बजाय आपका ब्राउज़र info.php को डाउनलोड करने का विकल्प देता है, तो PHP Apache से नहीं जुड़ा है; कुछ भी करने से पहले विफलता अनुभाग (failures section) पर जाएँ।
Step 7 - ऐप डेटाबेस और न्यूनतम-विशेषाधिकार वाला उपयोगकर्ता बनाना
सॉकेट-प्रमाणीकृत root के रूप में डेटाबेस खोलें:
sudo mysqlफिर एक डेटाबेस और केवल उसी डेटाबेस तक सीमित एक उपयोगकर्ता बनाएं:
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;यहाँ तीन जानबूझकर किए गए चुनाव हैं। utf8mb4 वास्तविक चार-बाइट वाला UTF-8 है, पुराना utf8 उपनाम चुपचाप इमोजी और कुछ CJK वर्णों को काट देता है, इसलिए हमेशा utf8mb4 का उपयोग करें। ग्रांट appdb.* पर है, न कि *.* पर: यह उपयोगकर्ता केवल अपने डेटाबेस को छू सकता है और कुछ नहीं, इसलिए ऐप में SQL-injection की खामी अन्य सभी साइटों की टेबल को नहीं पढ़ सकती है। और 'appuser'@'localhost' खाते को केवल उसी मशीन से आने वाले कनेक्शन तक सीमित करता है।
उस उपयोगकर्ता के रूप में इसका परीक्षण करें:
mysql -u appuser -p appdbयह पासवर्ड मांगता है और आपको MariaDB [appdb]> प्रॉम्प्ट पर ले आता है। ध्यान दें कि इसमें कोई -h फ्लैग नहीं है, इसे हटा दें और क्लाइंट स्थानीय Unix सॉकेट पर कनेक्ट हो जाएगा, जिसे MariaDB ठीक localhost के रूप में गिनता है। एक बात जो जानने योग्य है: MySQL और MariaDB के लिए, localhost का अर्थ Unix सॉकेट है और 127.0.0.1 का अर्थ TCP कनेक्शन है। स्टॉक Ubuntu 24.04 MariaDB पर सर्वर अभी भी 127.0.0.1 से TCP कनेक्शन को वापस localhost पर रिज़ॉल्व करता है, इसलिए दोनों खाते से मेल खाते हैं, लेकिन skip-name-resolve सक्षम वाले सर्वरों पर (एक सामान्य प्रदर्शन सुधार, और कई कंटेनर इमेज में मानक), दोनों को अलग-अलग होस्ट के रूप में माना जाता है, और एक ऐप जो 127.0.0.1 डायल करता है उसे पासवर्ड सही होने पर भी ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' (using password: YES) के साथ अस्वीकार कर दिया जाता है।
इसलिए अपने एप्लिकेशन को होस्ट localhost, उपयोगकर्ता appuser, डेटाबेस appdb पर पॉइंट करें, कभी भी root पर नहीं। PHP का mysqli और PDO दोनों Unix सॉकेट पर स्विच हो जाते हैं जब होस्ट शाब्दिक स्ट्रिंग localhost होता है, जो आपके द्वारा अभी बनाए गए खाते से मेल खाता है। यदि कोई फ्रेमवर्क संख्यात्मक TCP होस्ट पर जोर देता है, तो उपयोगकर्ता को उस तरह से बनाएं जैसे वह वास्तव में कनेक्ट होता है, 'appuser'@'127.0.0.1', या केवल तभी @'%' (फायरवॉल नियम के साथ जोड़ा गया) का उपयोग करें यदि उसे किसी अन्य मशीन से डेटाबेस तक पहुंचना आवश्यक हो।
Step 8 - Certbot के साथ HTTPS जोड़ना
सादे HTTP पर लॉगिन फॉर्म चलाने से पासवर्ड स्पष्ट टेक्स्ट (clear text) में भेजे जाते हैं, और हर आधुनिक ब्राउज़र इस पेज को "Not secure" के रूप में चिह्नित करता है। Certbot इसे एक कमांड में ठीक कर देता है। इसे Apache प्लगइन के साथ इंस्टॉल करें:
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apacheCertbot यहाँ दो प्लगइन्स का उपयोग करता है। apache authenticator यह साबित करता है कि आपका डोमेन पर नियंत्रण है, इसके लिए यह आपके चल रहे Apache के माध्यम से एक चैलेंज फ़ाइल को संक्षिप्त रूप से सर्व करता है, और फिर apache installer आपके वर्चुअल होस्ट को फिर से लिखता है ताकि 443 ब्लॉक जोड़ा जा सके, इसे नए सर्टिफिकेट पर पॉइंट किया जा सके, और डिफ़ॉल्ट रूप से सभी HTTP ट्रैफ़िक को HTTPS पर रीडायरेक्ट किया जा सके। Certbot 2.0 के बाद से रीडायरेक्ट के लिए कोई प्रश्न नहीं पूछा जाता है; यदि आपको सादे HTTP को सर्व करना जारी रखना है, तो --no-redirect पास करें। चूँकि आपने Step 5 में एक वास्तविक ServerName सेट किया है, Certbot स्वचालित रूप से डोमेन का पता लगा लेता है। सर्टिफिकेट 90 दिनों तक चलते हैं और पैकेज एक systemd टाइमर इंस्टॉल करता है जो उन्हें रिन्यू करता है; sudo certbot renew --dry-run के साथ टाइमर को सत्यापित करें, जो Congratulations, all simulated renewals succeeded पर समाप्त होना चाहिए।
चैलेंज, रिन्यूअल टाइमर, और DNS तथा फ़ायरवॉल आवश्यकताओं के पूर्ण विवरण के लिए, Apache पर Certbot के साथ निःशुल्क Let's Encrypt TLS सर्टिफिकेट जारी करने पर आधारित गाइड देखें।
बैकअप, अपग्रेड और हार्डनिंग
अपनी स्थिति (state) को सुरक्षित रखने वाली दो चीजों का बैकअप लें: डेटाबेस और वेब रूट। हर रात एक लॉजिकल डंप लेना सबसे सरल और विश्वसनीय तरीका है, sudo sh -c 'mysqldump --all-databases --single-transaction | gzip > /root/db-$(date +%F).sql.gz', जिसे बाद में सर्वर से बाहर कॉपी कर लिया जाता है। पूरी पाइपलाइन को sudo sh -c में लपेटना महत्वपूर्ण है: इसके बिना शेल > /root/... रीडायरेक्ट को आपके अपने यूजर के रूप में चलाता है और Permission denied के साथ विफल हो जाता है, क्योंकि केवल mysqldump को ही sudo विरासत में मिला था। --single-transaction InnoDB टेबल्स को लॉक किए बिना उनका एक सुसंगत स्नैपशॉट प्रदान करता है। इसे /var/www और /etc/apache2/sites-available के tar के साथ जोड़ें, और आप उन फाइलों से एक नए VPS पर पूरा स्टैक फिर से बना सकते हैं।
अपग्रेड एक सामान्य sudo apt update && sudo apt upgrade प्रक्रिया है। जो समस्या पैदा करता है वह PHP version bump है, जब भविष्य का Ubuntu डिफ़ॉल्ट को PHP 8.4 पर ले जाता है, तो apt शायद 8.3 के साथ-साथ php8.4-fpm भी इंस्टॉल कर दे, सॉकेट /run/php/php8.4-fpm.sock बन जाता है, और आपका Apache कॉन्फ़िगरेशन अभी भी 8.3 सॉकेट की ओर इशारा कर रहा होता है। नए कॉन्फ़िगरेशन (sudo a2enconf php8.4-fpm) को सक्षम करें और पुराने को अक्षम करें, अन्यथा एक सामान्य अपग्रेड के बाद भी आपकी साइट Primary script unknown त्रुटि देना शुरू कर देगी। चूंकि PHP रिलीज़ LTS डिस्ट्रो की तुलना में तेज़ी से आगे बढ़ती हैं, इसलिए पैच वर्ज़न को पिन करने के बजाय वर्तमान PHP रिलीज़ नोट्स देखें।
हार्डनिंग के दो कदम पहले दिन ही उठाना उचित है। पहला, बॉक्स पर Fail2Ban watching SSH लगाएं, एक सार्वजनिक VPS पर कुछ ही मिनटों में स्वचालित लॉगिन प्रयास होने लगते हैं, और एक छोटी जेल हजारों प्रयासों को बैन होने से पहले मुट्ठी भर तक सीमित कर देती है। दूसरा, यदि आप Apache वर्चुअल होस्ट, MariaDB डेटाबेस और उपयोगकर्ताओं को मैन्युअल रूप से फाइलें संपादित करने के बजाय ब्राउज़र के माध्यम से प्रबंधित करना पसंद करते हैं, तो the Webmin web-based control panel इसी स्टैक के ऊपर काम करता है और उन्हीं कॉन्फ़िगरेशन फाइलों को नियंत्रित करता है जिन्हें आपने अभी लिखा है। इनमें से कोई भी घटकों को समझने का विकल्प नहीं है, लेकिन दोनों ही दैनिक कार्यों की कठिनाई को कम करते हैं।
विफलता के प्रकार, और वे संदेश जो आपको दिखाई देंगे
डिफ़ॉल्ट पेज नहीं हट रहा है। आपने अपने वर्चुअल होस्ट को संपादित किया, रीलोड किया, लेकिन ब्राउज़र अभी भी "Apache2 Ubuntu Default Page" और उसका "It works!" बैनर दिखा रहा है। Apache पहले मेल खाने वाले वर्चुअल होस्ट को सर्व करता है, और जब कोई ServerName अनुरोध से मेल नहीं खाता है, तो वर्णानुक्रम में पहली कॉन्फ़िगरेशन जीत जाती है, 000-default.conf, testapp.conf से पहले आता है। या तो अनुरोध का होस्ट नाम आपके ServerName से मेल नहीं खाता है, या आपने कभी sudo a2dissite 000-default नहीं चलाया। डिफ़ॉल्ट को अक्षम करें, sudo systemctl reload apache2, और apache2ctl -S के साथ पुष्टि करें, जो vhost मैप प्रिंट करता है और दिखाता है कि कौन सी कॉन्फ़िगरेशन डिफ़ॉल्ट को नियंत्रित करती है। ब्राउज़र कैश भी साफ़ करें; पुराने पेज से प्राप्त कैश किया गया 200 रिस्पॉन्स बना रहता है।
एक .php फ़ाइल चलने के बजाय डाउनलोड हो रही है। आप info.php खोलते हैं और ब्राउज़र उसे चलाने के बजाय कच्चा <?php सोर्स कोड वाली फ़ाइल डाउनलोड कर लेता है, या उसे सादे टेक्स्ट के रूप में दिखाता है। Apache फ़ाइल को एक स्टेटिक एसेट के रूप में सर्व कर रहा है क्योंकि PHP हैंडलर जुड़ा नहीं है, आपने sudo a2enmod proxy_fcgi, या sudo a2enconf php8.3-fpm को छोड़ दिया है, या उसके बाद Apache को रीस्टार्ट नहीं किया है। तीनों को चलाएं (चरण 4) और रीलोड करें। पुष्टि करें कि मॉड्यूल apache2ctl -M | grep fcgi के साथ लोड हो गया है, जिसमें proxy_fcgi_module सूचीबद्ध होना चाहिए। यह सोर्स-कोड लीक है, न कि कोई कॉस्मेटिक बग, इसलिए सर्वर पर कुछ भी वास्तविक डालने से पहले इसे ठीक करें।
ERROR 1698 (28000): Access denied for user 'root'@'localhost'। आपने sudo के बिना mysql -u root या mariadb -u root चलाया। root अकाउंट unix_socket ऑथेंटिकेशन का उपयोग करता है, इसलिए यह आपको केवल तभी स्वीकार करता है जब आपका OS यूजर वास्तव में root हो। इसका समाधान sudo mysql है, न कि -u root, और न ही कोई पासवर्ड। यह संदेश सॉकेट ऑथेंटिकेशन के सही ढंग से काम करने का अपेक्षित व्यवहार है, न कि कोई खराब इंस्टॉलेशन।
एप्लिकेशन से ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1', सही पासवर्ड के साथ। अकाउंट 'appuser'@'localhost' के रूप में मौजूद है, लेकिन आपका ऐप TCP के माध्यम से 127.0.0.1 पर उस सर्वर से कनेक्ट हो रहा है जहाँ होस्ट-नाम रिज़ॉल्यूशन अक्षम है (skip-name-resolve), इसलिए MariaDB दोनों को अलग-अलग होस्ट के रूप में मेल करता है, localhost यूनिक्स सॉकेट है, 127.0.0.1 TCP है। ऐप को होस्ट localhost पर इंगित करें ताकि यह सॉकेट का उपयोग करे और अकाउंट से मेल खाए, या यदि फ्रेमवर्क केवल TCP का उपयोग करता है तो दूसरा अकाउंट 'appuser'@'127.0.0.1' बनाएं।
/var/log/apache2/testapp-error.log में AH01071: Got error 'Primary script unknown', ब्राउज़र में File not found. दिखाई दे रहा है। Apache ने अनुरोध को PHP-FPM को सौंप दिया, लेकिन FPM उस पथ पर स्क्रिप्ट नहीं ढूंढ सका जो Apache ने उसे दिया था। दो सामान्य कारण: आपकी कॉन्फ़िगरेशन में FPM सॉकेट एक ऐसे PHP संस्करण की ओर इशारा करता है जो इंस्टॉल नहीं है (अपग्रेड के बाद php8.4 सॉकेट जबकि केवल 8.3 चल रहा है), या फ़ाइल वास्तव में वहां नहीं है क्योंकि DocumentRoot और वास्तविक निर्देशिका में असहमति है। जांचें कि सॉकेट ls -l /run/php/ के साथ मौजूद है, पुष्टि करें कि DocumentRoot उस स्थान से मेल खाता है जहाँ फ़ाइल रहती है, और php8.3-fpm तथा apache2 दोनों को रीस्टार्ट करें।
हर रीस्टार्ट पर AH00558: apache2: Could not reliably determine the server's fully qualified domain name। यह एक हानिरहित चेतावनी है, त्रुटि नहीं, Apache आपको बता रहा है कि कोई ग्लोबल ServerName सेट नहीं है। इसे /etc/apache2/conf-available/servername.conf में ServerName your.domain लिखकर और sudo a2enconf servername चलाकर शांत करें।
Apache शुरू होने पर (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80। कोई अन्य वेब सर्वर पहले से ही पोर्ट 80 का उपयोग कर रहा है, अक्सर पिछले प्रयोगों से बचा हुआ nginx। इसे sudo ss -ltnp | grep :80 के साथ खोजें, फिर Apache शुरू करने से पहले दूसरी सेवा को रोकें और अक्षम करें।
FAQ
mod_php या PHP-FPM - मुझे किसका उपयोग करना चाहिए?
PHP-FPM का उपयोग करें। mod_php प्रत्येक Apache प्रोसेस में एक इंटरप्रेटर को एम्बेड करता है और धीमे prefork MPM का उपयोग करने के लिए मजबूर करता है, इसलिए जब Apache एक स्टेटिक इमेज सर्व कर रहा होता है तब भी उस पर PHP का ओवरहेड बना रहता है। PHP-FPM, PHP को एक अलग और स्वतंत्र रूप से ट्यून किए गए पूल के रूप में चलाता है जिसे Apache एक सॉकेट के माध्यम से एक्सेस करता है। यह तेज थ्रेडेड event MPM के साथ काम करता है और बाद में इसे बिना किसी बदलाव के nginx पर ले जाया जा सकता है। यह आधुनिक डिफॉल्ट है; mod_php केवल उन पुराने ऐप्स के लिए उचित है जो इन-प्रोसेस व्यवहार पर निर्भर हैं।
मेरा ब्राउज़र PHP फ़ाइल को चलाने के बजाय उसे डाउनलोड क्यों कर रहा है?
Apache, .php फ़ाइल को एक स्टेटिक डाउनलोड के रूप में देख रहा है क्योंकि इससे कोई PHP हैंडलर नहीं जुड़ा है। FPM के साथ Ubuntu 24.04 पर इसका मतलब है कि आपने sudo a2enmod proxy_fcgi, sudo a2enconf php8.3-fpm, या उसके बाद Apache को रीस्टार्ट करने में से कोई एक चरण छोड़ दिया है। तीनों कमांड चलाएँ और रीलोड करें, फिर apache2ctl -M | grep fcgi के साथ सत्यापित करें कि proxy_fcgi_module लिस्ट में है। जब तक आप इसे ठीक नहीं करते, सर्वर सोर्स कोड लीक कर रहा है, इसलिए इसे तत्काल प्राथमिकता दें।
सही पासवर्ड होने के बावजूद MariaDB में root एक्सेस क्यों अस्वीकार कर दिया जाता है?
क्योंकि कोई पासवर्ड नहीं है, Ubuntu का MariaDB, root अकाउंट को unix_socket द्वारा प्रमाणित करता है, जो इसे ऑपरेटिंग-सिस्टम के root यूजर से जोड़ता है। एक सामान्य शेल से mysql -u root चलाने पर डिज़ाइन के अनुसार ERROR 1698 (28000): Access denied for user 'root'@'localhost' प्राप्त होता है। इसके बजाय sudo mysql के साथ कनेक्ट करें, और root का पुन: उपयोग करने के बजाय किसी भी एप्लिकेशन के लिए एक अलग पासवर्ड-प्रमाणित यूजर बनाएँ।
मैं अपनी LAMP साइट में HTTPS कैसे जोड़ूँ?
certbot और python3-certbot-apache इंस्टॉल करें, डोमेन के A रिकॉर्ड को सर्वर पर पॉइंट करें, और फिर sudo certbot --apache चलाएँ। Apache ऑथेंटिकेटर आपके चल रहे Apache के माध्यम से डोमेन नियंत्रण को प्रमाणित करता है और इंस्टॉलर पोर्ट 443 के लिए वर्चुअल होस्ट को रीराइट करता है और ऑटोमैटिक रिन्यूअल सेट करता है। पूर्ण Certbot और Apache वॉक-थ्रू में चैलेंज, रिन्यूअल टाइमर और सामान्य विफलता के कारणों को कवर किया गया है।