SSD Nodes Learn Hosting plans →
गाइड Matt Connorलेखक: Matt Connor

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 apache2

apt आपके लिए सर्विस को स्टार्ट और इनेबल करता है। इसकी जाँच करें:

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 enable

ufw enable चलाने से पहले OpenSSH को अनुमति दें। ufw डिफ़ॉल्ट रूप से सभी इनकमिंग ट्रैफ़िक को अस्वीकार करता है, और SSH नियम के बिना इसे सक्षम करने पर सक्रिय होते ही आपका कनेक्शन कट जाएगा; आप वर्तमान सत्र में बने रहेंगे लेकिन दोबारा कनेक्ट नहीं हो पाएंगे। sudo ufw status के साथ पुष्टि करें; आप चाहेंगे कि OpenSSH, Apache Full, और उनके v6 समकक्ष सभी ALLOW दिखाएं।

चरण 3 - MariaDB इंस्टॉल करें और इसे सुरक्षित करें

sudo apt install -y mariadb-server
systemctl status mariadb

Ubuntu 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 apache2

a2enconf 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 apache2

apache2ctl configtest को Syntax OK प्रिंट करना चाहिए। a2dissite 000-default लाइन वह है जिसे लोग अक्सर भूल जाते हैं, और यही कारण है कि बाद में डिफ़ॉल्ट पेज अटका हुआ दिखाई देता है, जिसका विवरण विफलताओं (failures) वाले सेक्शन में दिया गया है।

चरण 6 - PHP के चलने की पुष्टि करें, फिर प्रमाण को हटा दें

ऐप रूट में एक लाइन की PHP फ़ाइल डालें:

echo "<?php phpinfo();" | sudo tee /var/www/testapp/info.php

http://app.example.com/info.php पर जाएँ। एक सही परिणाम लंबी बैंगनी और ग्रे रंग की PHP Version 8.3.x तालिका है, जिसमें आपके लोड किए गए मॉड्यूल सूचीबद्ध होंगे, और Server API लाइन में FPM/FastCGI लिखा होगा। यह अंतिम लाइन पुष्टि करती है कि अनुरोध mod_php के बजाय PHP-FPM के माध्यम से जा रहे हैं।

अब इसे तुरंत हटा दें:

sudo rm /var/www/testapp/info.php

phpinfo() आपके सटीक 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', या केवल तभी @'%' (फायरवॉल नियम के साथ जोड़ा गया) का उपयोग करें यदि उसे किसी अन्य मशीन से डेटाबेस तक पहुंचना आवश्यक हो।

चरण 8 - Certbot के साथ HTTPS जोड़ें

Plain HTTP पर login form serve करने से password clear text में भेजे जाते हैं, और हर आधुनिक browser इस page को "Not secure" के रूप में चिह्नित करता है। Certbot इसे एक command में ठीक कर देता है। इसे Apache plugin के साथ install करें:

sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache

Certbot यहाँ दो plugins का उपयोग करता है। apache authenticator यह साबित करता है कि आपका domain पर नियंत्रण है, इसके लिए वह आपके चल रहे Apache के माध्यम से एक challenge file serve करता है। इसके बाद apache installer आपके virtual host को rewrite करता है ताकि 443 block जोड़ा जा सके, उसे नए certificate पर point किया जा सके, और डिफ़ॉल्ट रूप से सभी HTTP traffic को HTTPS पर redirect किया जा सके। Certbot ने version 1.4.0 (मई 2020) के बाद से redirect के बारे में कोई सवाल नहीं पूछा है, इसलिए यदि आपको plain HTTP serve करना जारी रखना है, तो --no-redirect पास करें। चूँकि आपने चरण 5 में एक वास्तविक ServerName सेट किया है, Certbot स्वचालित रूप से domain का पता लगा लेता है। आज जारी किए गए certificates 90 दिनों तक मान्य रहते हैं (Let's Encrypt 10 फरवरी 2027 को अपनी डिफ़ॉल्ट अवधि घटाकर 64 दिन और 16 फरवरी 2028 को 45 दिन कर देगा), और यह package एक systemd timer install करता है जो उन्हें renew करता है; sudo certbot renew --dry-run के साथ timer को verify करें, जो Congratulations, all simulated renewals succeeded पर समाप्त होना चाहिए।

Challenge, renewal timer, और DNS तथा firewall आवश्यकताओं के पूर्ण विवरण के लिए, Apache पर Certbot के साथ मुफ्त Let's Encrypt TLS certificates जारी करने की companion guide देखें।

बैकअप, अपग्रेड और हार्डनिंग

अपनी स्थिति (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 26.04 LTS अपने डिफ़ॉल्ट के रूप में PHP 8.5 के साथ आता है, और जो php8.3-* पैकेज आपने यहाँ इंस्टॉल किए थे, वे उस रिलीज में मौजूद नहीं हैं। इसलिए अपग्रेड के बाद आप php8.5-fpm चला रहे होते हैं, सॉकेट /run/php/php8.5-fpm.sock हो जाता है, और आपकी Apache कॉन्फ़िगरेशन अभी भी 8.3 सॉकेट की ओर इशारा करती है। नई कॉन्फ़िगरेशन (sudo a2enconf php8.5-fpm) को सक्षम करें और पुरानी को अक्षम करें, अन्यथा एक सामान्य अपग्रेड के बाद भी आपकी साइट Primary script unknown एरर देना शुरू कर देगी। चूंकि PHP रिलीज LTS डिस्ट्रो की तुलना में तेजी से आगे बढ़ती हैं, इसलिए पैच वर्जन को पिन करने के बजाय वर्तमान PHP रिलीज नोट्स देखें।

हार्डनिंग के दो कदम पहले दिन ही उठाना उचित है। पहला, बॉक्स पर Fail2Ban watching SSH लगाएं; एक पब्लिक VPS पर कुछ ही मिनटों में स्वचालित लॉगिन प्रयास शुरू हो जाते हैं, और एक छोटी जेल हजारों प्रयासों को बैन होने से पहले कुछ ही तक सीमित कर देती है। दूसरा, यदि आप Apache वर्चुअल होस्ट, MariaDB डेटाबेस और यूजर्स को मैन्युअल रूप से फाइल एडिट करने के बजाय ब्राउज़र के माध्यम से प्रबंधित करना चाहते हैं, तो the Webmin web-based control panel इसी स्टैक के ऊपर काम करता है और उन्हीं कॉन्फ़िगरेशन फाइलों को नियंत्रित करता है जिन्हें आपने अभी लिखा है। इनमें से कोई भी इन घटकों को समझने का विकल्प नहीं है, लेकिन दोनों ही दैनिक कार्यों की कठिनाई को कम करते हैं।

विफलता के प्रकार और दिखाई देने वाले संदेश

डिफ़ॉल्ट पेज नहीं हट रहा है। आपने अपने virtual host को एडिट किया, reload किया, लेकिन ब्राउज़र अभी भी "Apache2 Ubuntu Default Page" और उसका "It works!" बैनर दिखा रहा है। Apache पहले matching virtual host को सर्व करता है, और जब कोई ServerName अनुरोध से मेल नहीं खाता, तो वर्णानुक्रम में सबसे पहले आने वाला config जीत जाता है, 000-default.conf, testapp.conf से पहले आता है। या तो अनुरोध का host name आपके ServerName से मेल नहीं खाता, या आपने कभी sudo a2dissite 000-default नहीं चलाया। डिफ़ॉल्ट को disable करें, sudo systemctl reload apache2, और apache2ctl -S के साथ पुष्टि करें, जो vhost मैप प्रिंट करता है और दिखाता है कि कौन सा config डिफ़ॉल्ट का स्वामी है। ब्राउज़र कैश भी साफ़ करें; पुराने पेज से मिला cached 200 रिस्पॉन्स बना रह सकता है।

.php फ़ाइल चलने के बजाय डाउनलोड हो रही है। आप info.php खोलते हैं और ब्राउज़र उसे चलाने के बजाय raw <?php सोर्स वाली फ़ाइल डाउनलोड कर लेता है, या उसे plain text के रूप में दिखाता है। Apache फ़ाइल को static asset के रूप में सर्व कर रहा है क्योंकि PHP handler अटैच नहीं है, आपने sudo a2enmod proxy_fcgi, या sudo a2enconf php8.3-fpm को छोड़ दिया है, या उसके बाद Apache को restart नहीं किया है। तीनों (Step 4) चलाएं और reload करें। पुष्टि करें कि मॉड्यूल apache2ctl -M | grep fcgi के साथ लोड है, जिसमें proxy_fcgi_module सूचीबद्ध होना चाहिए। यह एक source-code leak है, न कि केवल एक कॉस्मेटिक बग, इसलिए सर्वर पर कुछ भी वास्तविक डालने से पहले इसे ठीक करें।

ERROR 1698 (28000): Access denied for user 'root'@'localhost'। आपने sudo के बिना mysql -u root या mariadb -u root चलाया। root अकाउंट unix_socket auth का उपयोग करता है, इसलिए यह आपको तभी स्वीकार करता है जब आपका OS user वास्तव में root हो। इसका समाधान sudo mysql है, न कि -u root, और न ही कोई पासवर्ड। यह संदेश socket auth के सही ढंग से काम करने का अपेक्षित व्यवहार है, न कि कोई broken install।

एप्लिकेशन से ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1', सही पासवर्ड के साथ। अकाउंट 'appuser'@'localhost' के रूप में मौजूद है, लेकिन आपका ऐप TCP के माध्यम से 127.0.0.1 पर कनेक्ट हो रहा है, ऐसे सर्वर पर जहाँ host-name resolution अक्षम है (skip-name-resolve), इसलिए MariaDB दोनों को अलग-अलग hosts के रूप में मेल करता है, localhost Unix socket है, 127.0.0.1 TCP है। ऐप को host localhost पर पॉइंट करें ताकि यह socket का उपयोग करे और अकाउंट से मेल खाए, या यदि फ्रेमवर्क केवल 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 ने उसे दिया था। इसके दो सामान्य कारण हैं: आपके config में FPM socket एक ऐसे PHP वर्ज़न की ओर इशारा करता है जो इंस्टॉल नहीं है (रिलीज़ अपग्रेड के बाद आपको PHP 8.5 पर ले जाने के बाद भी 8.3 socket कॉन्फ़िगर है), या फ़ाइल वास्तव में वहां नहीं है क्योंकि DocumentRoot और वास्तविक डायरेक्टरी अलग-अलग हैं। जांचें कि socket ls -l /run/php/ के साथ मौजूद है, पुष्टि करें कि DocumentRoot उस स्थान से मेल खाता है जहाँ फ़ाइल रहती है, और php8.3-fpm (या जो भी PHP-FPM वर्ज़न वास्तव में इंस्टॉल है) और apache2 दोनों को restart करें।

हर restart पर AH00558: apache2: Could not reliably determine the server's fully qualified domain name। यह एक हानिरहित चेतावनी है, त्रुटि नहीं, Apache आपको बता रहा है कि कोई global 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। कोई अन्य वेब सर्वर पहले से ही port 80 पर है, अक्सर पिछले प्रयोग से बचा हुआ nginx। इसे sudo ss -ltnp | grep :80 के साथ खोजें, फिर Apache शुरू करने से पहले दूसरी सर्विस को stop और disable करें।

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 वॉक-थ्रू में चैलेंज, रिन्यूअल टाइमर और सामान्य विफलता के कारणों को कवर किया गया है।

#lamp#apache#mariadb#php-fpm#ubuntu