Ubuntu 24.04 वर LAMP stack कसे स्थापित करावे
Ubuntu 24.04 वर Apache, MariaDB, PHP 8.3 आणि PHP-FPM वापरून LAMP stack तयार करा. Certbot द्वारे HTTPS आणि name-based vhost सेटअप करण्याची अचूक पद्धत शिका.
तुम्ही काय तयार करत आहात
LAMP stack हे एका Ubuntu 24.04 सर्व्हरवरील चार घटक आहेत: पाया म्हणून Linux, HTTP साठी Apache, डेटा साठवण्यासाठी MariaDB, आणि कोड चालवण्यासाठी PHP 8.3. या प्रक्रियेच्या शेवटी तुमच्याकडे एक real application directory सर्व्ह करणारा name-based virtual host, एक dedicated least-privilege user असलेला डेटाबेस, PHP-FPM द्वारे Apache ला जोडलेले PHP, आणि त्यावर एक मोफत Let's Encrypt certificate असेल.
ही installation प्रक्रिया चार apt कमांड्सची आहे. या मार्गदर्शिकेतील बहुतेक सर्व माहिती ही विविध घटकांमधील जोडणी (wiring) आणि काही सामान्य चुकांविषयी आहे. या चुकांमुळे नवीन stack मध्ये blank page दिसणे, source code ब्राउझरमध्ये download म्हणून येणे, किंवा नुकत्याच install केलेल्या डेटाबेसमध्ये प्रवेश नाकारला जाणे यांसारख्या समस्या उद्भवू शकतात. या प्रत्येक चुकीचे विशिष्ट लक्षण असते आणि खाली दिलेल्या मजकुरावरून तुम्ही त्या ओळखू शकता.
Prerequisites and the honest gotchas
Ubuntu 24.04 KVM VPS, sudo user किंवा root आणि public IPv4 address असलेला नवीन सर्व्हर गृहीत धरा. Minimal stack साठी 1 GB RAM पुरेशी आहे; परंतु real database-backed application वापरण्यापूर्वी 2 GB RAM द्या. MariaDB चे default buffers आणि काही PHP-FPM workers मुळे 1 GB RAM लवकर संपू शकते.
शेवटी Certbot यशस्वीपणे चालण्यासाठी खालील दोन गोष्टी आवश्यक आहेत:
- तुमच्या VPS च्या public IP कडे निर्देशित करणारा A record असलेला domain name आवश्यक आहे. Let's Encrypt त्या नावावर HTTP द्वारे validation करते; केवळ IP address वरून certificate मिळू शकत नाही.
- इंटरनेटवरून 80 आणि 443 ports उपलब्ध असणे आवश्यक आहे. अनेक providers मध्ये, याचा अर्थ control panel मधील network firewall आणि
ufwमधील firewall दोन्हीमध्ये हे ports open करणे असा होतो.
DNS changes propagate होण्यासाठी एक तास लागू शकतो, म्हणून आधी A record सेट करा जेणेकरून तुम्हाला गरज पडेल तेव्हा तो कार्यरत असेल.
Step 1 - Apache इंस्टॉल करा आणि default page तपासा
sudo apt update
sudo apt install -y apache2apt तुमच्यासाठी service सुरू करते आणि enable करते. ते तपासा:
systemctl status apache2तुम्हाला active (running) असलेली ओळ दिसणे आवश्यक आहे. आता ब्राउझरमध्ये http://YOUR_SERVER_IP/ उघडा. "It works!" बॅनरसह Apache2 Ubuntu Default Page दिसणे हे योग्य आहे — याचा अर्थ Apache व्यवस्थित काम करत आहे. ही page /var/www/html/index.html वर उपलब्ध आहे आणि ती default virtual host 000-default.conf द्वारे सर्व्ह केली जाते. तुम्ही नंतर या दोन्ही गोष्टी disable कराल; सध्या त्या कार्यरत असणे आवश्यक आहे.
जर page लोड होत नसेल पण systemctl मध्ये process running दिसत असेल, तर firewall अडथळा ठरत आहे. पुढची पायरी तीच आहे.
Step 2 - HTTP आणि HTTPS साठी firewall उघडा
apache2 package तीन ufw application profiles रजिस्टर करते. त्यांची यादी खालीलप्रमाणे आहे:
sudo ufw app listतुम्हाला Apache, Apache Full, आणि Apache Secure दिसतील. Apache फक्त port 80 साठी आहे, Apache Secure फक्त 443 साठी आहे, आणि Apache Full दोन्हीसाठी आहे — तुम्हाला याची गरज आहे, कारण तुम्ही शेवटी TLS जोडणार आहात.
sudo ufw allow OpenSSH
sudo ufw allow "Apache Full"
sudo ufw enableufw enable चालवण्यापूर्वी OpenSSH allow करा. ufw मध्ये सर्व incoming traffic deny करण्यासाठी default सेटिंग असते. जर तुम्ही SSH rule शिवाय firewall enable केला, तर कनेक्शन लगेच तुटते — तुमची सध्याची session सुरू राहील पण तुम्ही पुन्हा connect करू शकणार नाही. sudo ufw status वापरून खात्री करा; OpenSSH, Apache Full आणि त्यांचे v6 equivalents या सर्वांसाठी ALLOW असणे आवश्यक आहे.
Step 3 - MariaDB इंस्टॉल करा आणि सुरक्षित करा
sudo apt install -y mariadb-server
systemctl status mariadbUbuntu 24.04 मध्ये MariaDB 10.11 (long-term-support release) आधीच येते, त्यामुळे तुम्हाला बाह्य repository ची गरज नाही. सर्व्हिस सुरू झाल्यावर, ती सुरक्षित (harden) करा:
sudo mysql_secure_installationप्रॉम्प्ट्स फक्त Enter दाबण्याऐवजी ते नीट वाचणे आवश्यक आहे. जेव्हा current root password विचारली जाईल, तेव्हा Enter दाबा — सध्या कोणताही पासवर्ड नाही. जेव्हा "Switch to unix_socket authentication?" विचारले जाईल, तेव्हा उत्तर बदलत नाही कारण या package मध्ये ते आधीच सक्षम (enabled) आहे, म्हणून n दाबा. पुढील परिच्छेदातील कारणास्तव "Change the root password?" साठी n निवडा, त्यानंतर उर्वरित प्रश्नांसाठी Y उत्तर द्या: anonymous users काढून टाका, remote root login नाकारा, test database काढून टाका आणि privilege tables reload करा.
येथे सर्वांचा गोंधळ होतो. Ubuntu च्या MariaDB मध्ये root डेटाबेस खाते unix_socket authentication वापरते, पासवर्ड नाही. याचा अर्थ असा की डेटाबेस तुमच्या operating-system युजरवर विश्वास ठेवतो ज्याद्वारे तुम्ही आधीच authenticate झाला आहात. त्यामुळे root shell मधून हे काम करते:
sudo mysql...आणि तुम्हाला पासवर्ड विचारल्याशिवाय MariaDB [(none)]> प्रॉम्प्टवर नेऊन सोडते. जेव्हा हीच कमांड अनprivileged युजर म्हणून चालवली जाते, तेव्हा ती नाकारली जाते, आणि मुख्य उद्देश तोच आहे: डेटाबेस root कडे प्रवेश मिळवण्यासाठी मशीनवरील sudo आवश्यक आहे, आणि चोरी करण्यासाठी, phish करण्यासाठी किंवा brute-force करण्यासाठी कोणताही पासवर्ड उपलब्ध नाही. हे पासवर्डपेक्षा अधिक सुरक्षित आहे, म्हणून त्यात बदल करू नका. यातून निघणारा नियम: never कोणत्याही application ला root खात्याशी जोडू नका. प्रत्येक application साठी स्वतंत्र युजर तयार करा (Step 7), कारण TCP द्वारे username आणि password वापरून कनेक्ट होणारे app socket auth वापरू शकत नाही, आणि तुम्हाला प्रत्येक app ला त्याच्या स्वतःच्या डेटाबेसपुरते मर्यादित ठेवायचे आहे.
Step 4 - PHP 8.3 आणि PHP-FPM इंस्टॉल करा
Ubuntu 24.04 मधील डीफॉल्ट PHP 8.3 आहे. FPM process manager आणि सामान्य ॲपसाठी आवश्यक असलेले extensions इंस्टॉल करा:
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 process मध्ये PHP interpreter एम्बेड असतो. हे सोपे आहे, परंतु प्रत्येक worker मध्ये PHP ची एक प्रत असते, मग तो script सर्व्ह करत असो किंवा static image. या दोन्हीचे lifecycle एकच असते आणि ते फक्त Apache च्या prefork MPM सोबत काम करते — जे सर्वात कमी कार्यक्षम आहे. त्याऐवजी PHP-FPM PHP ला स्वतःच्या process pool मध्ये चालवते, ज्याशी Apache socket द्वारे संवाद साधतो. यामुळे Apache static files साठी threaded event MPM वापरू शकतो आणि फक्त PHP requests पुढे पाठवू शकतो. हे pool web server पासून स्वतंत्रपणे tune करता येते, आणि जर तुम्ही पुढे nginx वापरले, तरी हीच FPM setup काम करते. चांगल्या कारणांमुळे हे सध्याचे डीफॉल्ट आहे.
Apache, proxy_fcgi module द्वारे FPM शी जोडले जाते. ते enable करा, FPM पॅकेजने दिलेली config enable करा आणि restart करा:
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 files ला FPM socket कडे route करणारा नियम असतो. याचा मुख्य भाग कोणत्याही .php file ला मॅच करतो आणि त्याला /run/php/php8.3-fpm.sock वरील socket कडे फॉरवर्ड करतो:
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>तुम्ही ती file एडिट करू नका; ती आधीच योग्य असते. परंतु socket path माहित असल्यास, तुम्हाला भविष्यात येणाऱ्या "PHP downloads instead of running" आणि "Primary script unknown" या त्रुटींचे निदान करण्यास मदत होईल — या दोन्ही त्रुटी Apache आणि FPM यांच्यातील socket किंवा त्यामागच्या file बाबतच्या असहमतीमुळे उद्भवतात.
Step 5 - तुमच्या app साठी name-based virtual host
Name-based virtual hosting मुळे एका IP वर अनेक sites चालवता येतात; Apache विनंतीमधील (request) Host: header वरून योग्य site निवडते. default /var/www/html पासून दूर, app साठी एक directory तयार करा:
sudo mkdir -p /var/www/testapp
sudo chown -R www-data:www-data /var/www/testapp
sudo chmod -R 755 /var/www/testappOwnership महत्त्वाचे आहे. Ubuntu वर Apache आणि PHP-FPM दोन्ही www-data user म्हणून चालतात, म्हणून web server ला वाचता येतील असे files — आणि app ला ज्या directories मध्ये write करण्याची गरज आहे (उदा. uploads folder) — त्या www-data कडून owned असाव्यात. जर तुम्हाला तुमच्या login user ने files edit करायच्या असतील, तर files स्वतःच्या मालकीच्या ठेवणे आणि तुमच्या user ला www-data group मध्ये समाविष्ट करणे हा एक सामान्य मार्ग आहे; साध्या deploy साठी, www-data:www-data हा सर्वात सोपा पर्याय आहे.
/etc/apache2/sites-available/testapp.conf येथे virtual host तयार करा:
<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 तुमच्या real domain वर सेट करा. Options -Indexes मुळे index file नसल्यास Apache directory list करत नाही — अन्यथा visitors तुमच्या source tree मध्ये browse करू शकतात. AllowOverride All मुळे .htaccess file काम करते, जे बहुतेक PHP applications ला pretty URLs साठी आवश्यक असते; जर तुमच्या app ला याची गरज नसेल, तर थोड्या speed gain साठी ते None मध्ये टाका. ही site enable करा, default site disable करा, config तपासा आणि reload करा:
sudo a2ensite testapp
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2apache2ctl configtest ने Syntax OK प्रिंट केले पाहिजे. a2dissite 000-default ही अशी line आहे जी लोक विसरतात, आणि यामुळेच default page नंतर अडकल्यासारखी दिसते — याची माहिती failures section मध्ये दिली आहे.
Step 6 - PHP कार्यरत आहे हे तपासा, आणि नंतर ती फाईल हटवा
app root मध्ये एक ओळीची PHP फाईल तयार करा:
echo "<?php phpinfo();" | sudo tee /var/www/testapp/info.phphttp://app.example.com/info.php ला भेट द्या. योग्य निकाल म्हणजे लोड केलेल्या modules ची यादी असलेली लांब जांभळी आणि राखाडी रंगाची PHP Version 8.3.x टेबल, ज्यामध्ये Server API ओळीवर FPM/FastCGI असे लिहिलेले असेल. ही शेवटची ओळ हे सिद्ध करते की requests mod_php ऐवजी PHP-FPM द्वारे जात आहेत.
आता ती फाईल लगेच हटवा:
sudo rm /var/www/testapp/info.phpphpinfo() मुळे तुमची नेमकी PHP version, सर्व लोड केलेली extensions, file paths आणि environment details उघड होतात — जे सर्व्हरवर त्रुटी असलेल्या version साठी शोध घेणाऱ्या कोणाही व्यक्तीसाठी उपयुक्त ठरू शकते. ही केवळ एक चाचणी आहे, feature नाही. पेज पाहिल्याबरोबर ती फाईल हटवून टाका. जर टेबलऐवजी तुमच्या ब्राउझरने info.php download करण्याचा पर्याय दिला, तर PHP, Apache शी जोडलेले नाही; इतर काहीही करण्यापूर्वी failures section कडे जा.
Step 7 - app database आणि least-privilege user तयार करा
socket-authenticated root म्हणून database उघडा:
sudo mysqlत्यानंतर एक database आणि फक्त त्या database साठी मर्यादित असलेला एक user तयार करा:
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 हे खरे four-byte UTF-8 आहे — जुना utf8 alias emoji आणि काही CJK characters आपोआप कापतो (truncate करतो), म्हणून नेहमी utf8mb4 वापरा. grant appdb.* वर आहे, *.* वर नाही: हा user फक्त स्वतःच्या database ला हाताळू शकतो आणि इतर कशालाही नाही, ज्यामुळे app मध्ये SQL-injection असल्यास इतर कोणत्याही site च्या tables वाचता येणार नाहीत. आणि 'appuser'@'localhost' मुळे हे account फक्त त्याच machine वरून येणाऱ्या connections साठी मर्यादित राहते.
त्या user ने test करा:
mysql -u appuser -p appdbहे password मागेल आणि तुम्हाला MariaDB [appdb]> prompt वर नेईल. लक्षात घ्या की येथे -h flag नाही — तो न वापरल्यास client local Unix socket द्वारे connect होतो, ज्याला MariaDB localhost मानतो. एक महत्त्वाची गोष्ट: MySQL आणि MariaDB साठी, localhost म्हणजे Unix socket आणि 127.0.0.1 म्हणजे TCP connection. stock Ubuntu 24.04 MariaDB वर server अजूनही 127.0.0.1 कडून येणारे TCP connection localhost मध्ये resolve करते, त्यामुळे दोन्ही account शी मॅच होतात — परंतु ज्या servers वर skip-name-resolve enabled आहे (एक सामान्य performance tweak, आणि अनेक container images मध्ये standard आहे), तिथे हे दोन्ही वेगळे hosts मानले जातात; अशा वेळी जर app 127.0.0.1 वापरत असेल, तर password बरोबर असूनही ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' (using password: YES) error येतो.
त्यामुळे तुमच्या application साठी host localhost, user appuser, आणि database appdb वापरा — कधीही root वापरू नका. PHP चे mysqli आणि PDO दोन्ही Unix socket वर switch होतात जेव्हा host हा literal string localhost असतो, जो तुम्ही नुकताच तयार केलेल्या account शी मॅच होतो. जर एखादे framework numeric TCP host वापरत असेल, तर user तशा प्रकारे तयार करा ज्याप्रमाणे तो प्रत्यक्षात connect होतो — 'appuser'@'127.0.0.1', किंवा @'%' (firewall rule सह) फक्त तेव्हाच जर त्याला दुसऱ्या machine वरून database ला reach करायचे असेल.
Step 8 - Certbot वापरून HTTPS जोडा
Plain HTTP वर login form सर्व्ह केल्यामुळे passwords clear text मध्ये जातात आणि प्रत्येक आधुनिक browser त्या page ला "Not secure" असे दर्शवते. Certbot एका कमांडद्वारे ही समस्या सोडवते. Apache plugin वापरून ते install करा:
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apacheCertbot येथे दोन plugins वापरते. apache authenticator तुमच्या चालू असलेल्या Apache द्वारे brief challenge file सर्व्ह करून तुम्ही domain चे मालक आहात हे सिद्ध करते, आणि apache installer तुमच्या virtual host मध्ये 443 block जोडून, त्याला नवीन certificate कडे निर्देशित करून आणि सर्व HTTP traffic ला default प्रमाणे HTTPS कडे redirect करून configuration पुन्हा लिहिते — Certbot 2.0 पासून redirect साठी कोणताही प्रश्न विचारला जात नाही; जर तुम्हाला plain HTTP सर्व्ह करणे आवश्यक असेल, तर --no-redirect वापरा. तुम्ही Step 5 मध्ये खरा ServerName सेट केल्यामुळे, Certbot domain आपोआप ओळखते. Certificates 90 दिवस वैध असतात आणि हे package एक systemd timer install करते जो त्यांचे नूतनीकरण (renew) करतो; sudo certbot renew --dry-run वापरून timer तपासा, जो Congratulations, all simulated renewals succeeded मध्ये संपायला हवा.
Challenge, renewal timer, आणि DNS व firewall आवश्यकतांची संपूर्ण माहितीसाठी, issuing free Let's Encrypt TLS certificates with Certbot on Apache वरील मार्गदर्शक पहा.
Backups, upgrades, and hardening
तुमची state सुरक्षित ठेवण्यासाठी दोन गोष्टींचा backup घ्या: databases आणि web root. दररोज रात्री logical dump घेणे हा सर्वात सोपा आणि विश्वसनीय मार्ग आहे — sudo sh -c 'mysqldump --all-databases --single-transaction | gzip > /root/db-$(date +%F).sql.gz', आणि नंतर तो box च्या बाहेर copy करा. संपूर्ण pipeline sudo sh -c मध्ये wrap करणे महत्त्वाचे आहे: त्याशिवाय shell > /root/... redirect तुमच्या स्वतःच्या user ने चालवेल आणि Permission denied त्रुटीसह fail होईल, कारण फक्त mysqldump कडे sudo चा वारसा (inheritance) असतो. --single-transaction मुळे InnoDB tables lock न करता त्यांचा एक consistent snapshot मिळतो. यासोबत /var/www आणि /etc/apache2/sites-available चा tar जोडा, आणि तुम्ही त्या files वापरून नवीन VPS वर संपूर्ण stack पुन्हा तयार करू शकता.
Upgrades ही एक सामान्य sudo apt update && sudo apt upgrade प्रक्रिया आहे. PHP version bump ही समस्या निर्माण करू शकते — जेव्हा भविष्यातील Ubuntu मध्ये default version बदलून PHP 8.4 केले जाईल, तेव्हा apt कदाचित 8.3 सोबत php8.4-fpm देखील install करेल, socket /run/php/php8.4-fpm.sock होईल, आणि तुमची Apache config अजूनही 8.3 socket कडे निर्देशित असेल. नवीन conf (sudo a2enconf php8.4-fpm) enable करा आणि जुने disable करा, अन्यथा नियमित upgrade नंतर तुमची site Primary script unknown error दाखवू लागेल. PHP releases हे LTS distro पेक्षा वेगाने बदलतात, म्हणून patch version fix करण्याऐवजी सध्याच्या PHP release notes तपासा.
पहिल्या दिवशी दोन hardening steps करणे फायदेशीर ठरते. पहिले, box वर Fail2Ban SSH monitoring सुरू करा — public VPS वर काही मिनिटांतच automated login attempts सुरू होतात, आणि एक लहान jail हजारो attempts ना ban करण्यापूर्वी काही मोजक्या attempts पर्यंत मर्यादित करते. दुसरे, जर तुम्हाला files मॅन्युअली edit करण्याऐवजी Apache virtual hosts, MariaDB databases आणि users ब्राउझरद्वारे व्यवस्थापित करायचे असतील, तर Webmin web-based control panel याच stack वर काम करते आणि तुम्ही लिहिलेल्या config files नियंत्रित करते. यापैकी कोणतीही गोष्ट घटक समजून घेण्याची जागा घेऊ शकत नाही, परंतु दोन्ही दैनंदिन कामे सोपी करतात.
Failure modes, with the strings you will see
The default page will not go away. तुम्ही तुमचा virtual host edit केला, reload केला, तरीही ब्राउझरमध्ये "Apache2 Ubuntu Default Page" आणि त्याचा "It works!" बॅनर दिसत आहे. Apache हा पहिला मॅच होणारा virtual host सर्व्ह करतो. जेव्हा कोणताही ServerName विनंतीशी (request) मॅच होत नाही, तेव्हा वर्णानुक्रमे (alphabetically) येणारी पहिली कॉन्फिगरेशन फाईल निवडली जाते — 000-default.conf हे testapp.conf च्या आधी येते. एकतर विनंतीचे host name तुमच्या ServerName शी मॅच होत नाही, किंवा तुम्ही sudo a2dissite 000-default रन केले नाही. default डिसेबल करा, sudo systemctl reload apache2, आणि apache2ctl -S ने कन्फर्म करा; हे vhost मॅप प्रिंट करते आणि कोणती कॉन्फिगरेशन default साठी जबाबदार आहे ते दाखवते. ब्राउझर कॅशे (cache) देखील क्लिअर करा; जुन्या पेजचा कॅशे केलेला 200 रिस्पॉन्स तसेच राहू शकतो.
A .php file downloads instead of running. तुम्ही info.php उघडता आणि ब्राउझर फाईल रन करण्याऐवजी त्यातील मूळ <?php सोर्स कोड डाउनलोड करतो किंवा तो plain text म्हणून दाखवतो. Apache ही फाईल static asset म्हणून सर्व्ह करत आहे कारण PHP handler जोडलेला नाही — तुम्ही sudo a2enmod proxy_fcgi किंवा sudo a2enconf php8.3-fpm वगळले आहे, किंवा त्यानंतर Apache रीस्टार्ट केला नाही. तिन्ही स्टेप्स (Step 4) रन करा आणि reload करा. apache2ctl -M | grep fcgi वापरून मॉड्यूल लोड झाले आहे की नाही ते तपासा, ज्यामध्ये proxy_fcgi_module ची यादी असायला हवी. ही source-code leak आहे, केवळ cosmetic bug नाही, त्यामुळे सर्व्हरवर प्रत्यक्ष डेटा टाकण्यापूर्वी हे दुरुस्त करा.
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 योग्यरित्या काम करत असल्यामुळे येतो, ही इन्स्टॉलेशनमधील त्रुटी नाही.
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 या दोघांना वेगळे होस्ट मानते — localhost हा Unix socket आहे, तर 127.0.0.1 हा TCP आहे. ॲपला host localhost कडे वळवा जेणेकरून ते socket वापरेल आणि अकाऊंट मॅच होईल, किंवा जर framework फक्त TCP वापरत असेल तर दुसरे अकाऊंट 'appuser'@'127.0.0.1' तयार करा.
AH01071: Got error 'Primary script unknown' /var/log/apache2/testapp-error.log मध्ये, ब्राउझरमध्ये File not found. दिसत आहे. Apache ने विनंती PHP-FPM कडे पाठवली, परंतु FPM ला Apache ने दिलेल्या पाथवर (path) स्क्रिप्ट सापडली नाही. याची दोन सामान्य कारणे आहेत: तुमच्या कॉन्फिगरेशनमधील FPM socket अशा PHP व्हर्जनला पॉइंट करत आहे जे इन्स्टॉल केलेले नाही (उदा. upgrade नंतर फक्त 8.3 चालू असताना php8.4 socket असणे), किंवा DocumentRoot आणि प्रत्यक्ष डिरेक्टरीमध्ये तफावत असल्यामुळे फाईल तिथे नाही. ls -l /run/php/ ने socket अस्तित्वात आहे की नाही ते तपासा, DocumentRoot फाईलच्या लोकेशनशी मॅच होते की नाही ते कन्फर्म करा, आणि php8.3-fpm व apache2 दोन्ही रीस्टार्ट करा.
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 रन करून ही वॉर्निंग थांबवा.
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 Apache सुरू होताना. दुसरा एखादा वेब सर्व्हर आधीच port 80 वापरत आहे — अनेकदा हे मागील प्रयोगातून उरलेला nginx असू शकतो. sudo ss -ltnp | grep :80 ने तो शोधा, आणि Apache सुरू करण्यापूर्वी त्या इतर सर्व्हिसला stop आणि disable करा.
FAQ
mod_php की PHP-FPM - मी काय वापरावे?
PHP-FPM वापरा. mod_php प्रत्येक Apache process मध्ये interpreter समाविष्ट करते आणि slow prefork MPM वापरण्यास भाग पाडते, त्यामुळे Apache जेव्हा static image सर्व्ह करतो तेव्हाही त्यावर PHP चा overhead राहतो. PHP-FPM, PHP ला एक स्वतंत्र, independently tuned pool म्हणून चालवते ज्यापर्यंत Apache socket द्वारे पोहोचतो, तो faster threaded event MPM सोबत काम करतो, आणि नंतर nginx वर सहजपणे स्थलांतरित होतो. हा आधुनिक default पर्याय आहे; mod_php फक्त अशा legacy app साठी योग्य आहे ज्याला in-process behaviour ची आवश्यकता आहे.
PHP फाईल रन होण्याऐवजी ब्राउझर ती download का करतोय?
Apache .php फाईलला static download म्हणून मानत आहे कारण त्याला कोणताही PHP handler जोडलेला नाही. Ubuntu 24.04 वर FPM सह, याचा अर्थ तुम्ही sudo a2enmod proxy_fcgi, sudo a2enconf php8.3-fpm किंवा त्यानंतर Apache restart करणे विसरला आहात. तिन्ही प्रक्रिया पूर्ण करा आणि reload करा, त्यानंतर apache2ctl -M | grep fcgi वापरून proxy_fcgi_module सूचीबद्ध आहे की नाही ते तपासा. जोपर्यंत तुम्ही हे ठीक करत नाही तोपर्यंत सर्व्हर तुमचा source code लीक करत आहे, त्यामुळे याकडे तातडीने लक्ष द्या.
योग्य password असूनही MariaDB मध्ये root access का नाकारला जातो?
कारण तिथे password नाही — Ubuntu चे MariaDB, root खाते unix_socket द्वारे authenticate करते, जे ते operating-system च्या root user शी जोडते. mysql -u root सामान्य shell मधून design नुसार ERROR 1698 (28000): Access denied for user 'root'@'localhost' परत करते. त्याऐवजी sudo mysql ने कनेक्ट करा, आणि root पुन्हा वापरण्याऐवजी कोणत्याही application साठी स्वतंत्र password-authenticated user तयार करा.
माझ्या LAMP site ला HTTPS कसे जोडायचे?
certbot आणि python3-certbot-apache इंस्टॉल करा, डोमेनचा A record सर्व्हरकडे पॉइंट करा, आणि नंतर sudo certbot --apache चालवा. Apache authenticator तुमच्या चालू असलेल्या Apache द्वारे डोमेन नियंत्रण सिद्ध करतो आणि installer port 443 साठी virtual host पुन्हा लिहतो (rewrites) आणि automatic renewal सेट करतो. full Certbot आणि Apache मार्गदर्शिका मध्ये या आव्हानाबद्दल, renewal timer बद्दल आणि सामान्य failure modes बद्दल माहिती दिली आहे.