Ubuntu 24.04-ல் LAMP Stack நிறுவுவது எப்படி?
Ubuntu 24.04-ல் Apache, MariaDB, PHP 8.3 மற்றும் PHP-FPM ஆகியவற்றை முறையாக நிறுவுவது எப்படி என்பதை அறியுங்கள். Certbot மூலம் இலவச HTTPS மற்றும் vhost அமைப்புகளைப் பெறுங்கள்.
நீங்கள் உருவாக்குவது
ஒரு LAMP stack என்பது ஒரே Ubuntu 24.04 server-ல் இயங்கும் நான்கு முக்கிய பகுதிகளைக் கொண்டது: அடிப்படையாக Linux, HTTP கோரிக்கைகளை ஏற்கும் Apache, தரவுகளைச் சேமிக்கும் MariaDB, மற்றும் நிரல்களை இயக்கும் PHP 8.3. இந்த வழிகாட்டியின் முடிவில், ஒரு குறிப்பிட்ட application directory-ஐக் கையாளும் name-based virtual host, குறைந்தபட்ச அதிகாரங்களைக் கொண்ட பிரத்யேக user-ஐக் கொண்ட database, Apache-உடன் PHP-FPM மூலம் இணைக்கப்பட்ட PHP, மற்றும் பாதுகாப்பிற்காக இலவச Let's Encrypt certificate ஆகியவற்றை நீங்கள் பெற்றிருப்பீர்கள்.
இதன் நிறுவல் செயல்முறை நான்கு apt கட்டளைகளை மட்டுமே கொண்டது. இந்த வழிகாட்டியில் உள்ள பெரும்பாலான தகவல்கள், இந்த பாகங்களை ஒன்றிணைக்கும் முறைகள் மற்றும் புதிய stack-ல் ஏற்படும் பொதுவான தவறுகளைத் தவிர்ப்பது பற்றியது. உதாரணமாக, வெற்றுப் பக்கத்தைக் காட்டுவது, source code-ஐ browser-ல் download ஆகக் காட்டுவது, அல்லது நீங்கள் உருவாக்கிய database-க்குள் நுழைய முடியாமல் போவது போன்ற சிக்கல்கள் ஏற்படலாம். இத்தகைய ஒவ்வொரு சிக்கலுக்கும் ஒரு குறிப்பிட்ட அறிகுறி உண்டு; அவை ஒவ்வொன்றும் கீழே உள்ளவாறு அதன் துல்லியமான பிழைச் செய்திகளுடன் விளக்கப்பட்டுள்ளன.
முன்நிபந்தனைகள் மற்றும் கவனிக்க வேண்டியவை
புதிதாக நிறுவப்பட்ட Ubuntu 24.04 KVM VPS, sudo பயனர் அல்லது root அணுகல் மற்றும் பொது IPv4 முகவரி இருப்பதாகக் கருதுகிறோம். 1 GB RAM-ல் ஒரு சிறிய stack இயங்கும்; ஆனால் database சார்ந்த application-ஐ நிறுவும் முன் 2 GB RAM-க்கு உயர்த்தவும். ஏனெனில், MariaDB-ன் default buffers மற்றும் சில PHP-FPM workers ஆகியவை முதல் 1 GB-ஐ விரைவாகப் பயன்படுத்திவிடும்.
இறுதியில் Certbot சரியாகச் செயல்பட இரண்டு விஷயங்கள் அவசியம், அவற்றை இப்போதே சரிசெய்யவும். முதலில், VPS-ன் பொது IP-ஐக் குறிக்கும் A record கொண்ட domain name தேவை. Let's Encrypt, HTTP வழியாகவே அந்தப் பெயரைச் சரிபார்க்கும்; வெறும் IP முகவரிக்கு certificate பெற முடியாது. இரண்டாவதாக, 80 மற்றும் 443 ஆகிய ports இணையத்திலிருந்து அணுகக்கூடியதாக இருக்க வேண்டும். பல சேவை வழங்குநர்களின் control panel-ல் உள்ள network firewall-லும், server-க்குள் உள்ள ufw-லும் இந்த ports-ஐத் திறக்க வேண்டும். DNS மாற்றங்கள் முழுமையாகப் பரவ ஒரு மணிநேரம் வரை ஆகலாம், எனவே A record-ஐ இப்போதே அமைத்துவிடவும்; நீங்கள் பயன்படுத்தும் நேரத்திற்குள் அது செயல்பாட்டுக்கு வந்துவிடும்.
படி 1 - Apache-ஐ நிறுவி default பக்கத்தை உறுதிப்படுத்துதல்
sudo apt update
sudo apt install -y apache2apt சேவையைத் தொடங்கி, அதை enable செய்கிறது. அதன் நிலையைச் சரிபார்க்கவும்:
systemctl status apache2active (running) என்று குறிப்பிடும் வரியை நீங்கள் பார்க்க வேண்டும். இப்போது உலாவியில் http://YOUR_SERVER_IP/-ஐத் திறக்கவும். பெரிய "It works!" என்ற வாசகத்துடன் கூடிய Apache2 Ubuntu Default Page தெரிவது சரியான முடிவு; இது Apache இயங்குகிறது என்பதற்கான சான்று, பிழையல்ல. அந்தப் பக்கம் /var/www/html/index.html-ல் உள்ளது மற்றும் அது வழங்கிய default virtual host 000-default.conf மூலம் காட்டப்படுகிறது. நீங்கள் இரண்டையும் பிறகு disable செய்வீர்கள்; இப்போதைக்கு அவை இருப்பது நீங்கள் எதிர்பார்க்கும் முடிவே ஆகும்.
பக்கம் எதும் ஏற்றப்படாமல், ஆனால் systemctl செயல்முறை இயங்குகிறது என்று காட்டினால், firewall தடையாக இருக்கலாம். அதுவே அடுத்த கட்டம்.
படி 2 - HTTP மற்றும் HTTPS-க்கான firewall-ஐத் திறக்கவும்
apache2 தொகுப்பு மூன்று 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 enableநீங்கள் ufw enable-ஐ இயக்குவதற்கு முன்பே OpenSSH-ஐ அனுமதிக்கவும். ufw இயல்பாகவே அனைத்து உள்வரும் traffic-ஐயும் தடுக்கும் (deny). SSH விதி இல்லாமல் அதை இயக்கினால், அது செயல்படுத்தப்பட்ட அடுத்த நொடியே உங்கள் இணைப்பு துண்டிக்கப்படும்; தற்போதைய session-ல் நீங்கள் தொடர்ந்து இருக்கலாம், ஆனால் மீண்டும் இணைக்க முடியாது. sudo ufw status மூலம் உறுதிப்படுத்தவும்; OpenSSH, Apache Full, மற்றும் அவற்றின் v6 இணையானவை அனைத்தும் ALLOW என்று காட்டப்படுவதை நீங்கள் உறுதி செய்ய வேண்டும்.
படி 3 - MariaDB-ஐ நிறுவி பாதுகாத்தல்
sudo apt install -y mariadb-server
systemctl status mariadbUbuntu 24.04-ல் MariaDB 10.11 என்ற நீண்டகால ஆதரவு (LTS) பதிப்பு உள்ளதால், வெளிப்புற repository தேவையில்லை. service இயங்கத் தொடங்கியதும், அதை வலுப்படுத்தவும்:
sudo mysql_secure_installationதிரையில் வரும் கேள்விகளை கவனமாகப் படித்துப் பதிலளிக்கவும்; Enter-ஐ மட்டும் அழுத்த வேண்டாம். current root password கேட்கும்போது, Enter அழுத்தவும், ஏனெனில் இதுவரை கடவுச்சொல் அமைக்கப்படவில்லை. "Switch to unix_socket authentication?" என்று கேட்கும்போது, இந்த package-ல் ஏற்கனவே அது இயக்கப்பட்டிருப்பதால், n அழுத்தவும். அடுத்த பத்தியில் உள்ள காரணத்திற்காக "Change the root password?" என்பதற்கு n என்று பதிலளிக்கவும். மீதமுள்ள கேள்விகளுக்கு Y என்று பதிலளிக்கவும்: anonymous பயனர்களை நீக்குதல், remote root login-ஐத் தடுத்தல், test database-ஐ நீக்குதல் மற்றும் privilege tables-ஐ மீண்டும் ஏற்றுதல் ஆகியவற்றைச் செய்யவும்.
இதுவே அனைவரையும் குழப்பும் பகுதி. Ubuntu-வின் MariaDB-ல் root database கணக்கு கடவுச்சொல்லுக்குப் பதிலாக unix_socket authentication-ஐப் பயன்படுத்துகிறது. அதாவது, நீங்கள் ஏற்கனவே login செய்துள்ள operating-system பயனரை database நம்புகிறது. எனவே, root shell-லிருந்து இது வேலை செய்யும்:
sudo mysql...இது உங்களை எந்தக் கடவுச்சொல்லும் கேட்காமல் MariaDB [(none)]> prompt-க்கு அழைத்துச் செல்லும். இதே கட்டளையை சாதாரண பயனர் இயக்கினால் அது மறுக்கப்படும்; இதுவே இதன் நோக்கம்: database root-க்கான அணுகல் கணினியின் sudo-உடன் இணைக்கப்பட்டுள்ளது. திருடவோ, phish செய்யவோ அல்லது brute-force செய்யவோ கடவுச்சொல் எதுவும் இல்லை. இது கடவுச்சொல்லை விடப் பாதுகாப்பானது, எனவே இதை மாற்ற வேண்டாம். இதிலிருந்து வரும் விதி: ஒரு application-ஐ ஒருபோதும் root கணக்குடன் இணைக்க வேண்டாம். ஒவ்வொரு application-க்கும் தனித்தனி பயனரை உருவாக்கவும் (படி 7), ஏனெனில் TCP வழியாக username மற்றும் password மூலம் இணையும் ஒரு app-ஆல் socket auth-ஐப் பயன்படுத்த முடியாது, மேலும் ஒவ்வொரு app-ம் அதன் சொந்த database-க்குள் மட்டுமே கட்டுப்படுத்தப்பட வேண்டும்.
படி 4 - PHP 8.3 மற்றும் PHP-FPM நிறுவுதல்
Ubuntu 24.04-ன் இயல்புநிலை PHP பதிப்பு 8.3 ஆகும். FPM process manager மற்றும் ஒரு பொதுவான application-க்குத் தேவையான 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. அந்தப் பழைய package, ஒவ்வொரு Apache process-க்குள்ளும் ஒரு PHP interpreter-ஐ உட்பொதிக்கிறது. இது எளிமையானது, ஆனால் ஒரு script-ஐ வழங்கினாலும் அல்லது static image-ஐ வழங்கினாலும் ஒவ்வொரு worker-ம் ஒரு PHP நகலைச் சுமந்து செல்லும்; இவை இரண்டும் ஒரே lifecycle-ஐப் பகிர்ந்து கொள்கின்றன, மேலும் இது Apache-ன் prefork MPM-உடன் மட்டுமே வேலை செய்யும், இதுவே மிகக் குறைந்த செயல்திறன் கொண்டதாகும். அதற்குப் பதிலாக, PHP-FPM ஆனது PHP-ஐத் தனித்தனி process pool-ஆக இயக்குகிறது, இதனுடன் Apache ஒரு socket வழியாகத் தொடர்பு கொள்கிறது. இதன் மூலம் Apache, static கோப்புகளுக்குத் திறன்மிக்க threaded event MPM-ஐப் பயன்படுத்த முடியும் மற்றும் PHP கோரிக்கைகளை மட்டும் FPM-க்கு அனுப்ப முடியும்; web server-லிருந்து தனித்து இந்த pool-ஐத் துல்லியமாக மாற்றியமைக்கலாம் (tune), மேலும் பிற்காலத்தில் நீங்கள் nginx-ஐ முன்னால் பயன்படுத்தினாலும் இதே FPM அமைப்பு அப்படியே வேலை செய்யும். இதுவே தற்போது தரநிலையாக இருப்பதற்குச் சரியான காரணம்.
Apache, proxy_fcgi module வழியாக FPM-ஐ அடைகிறது. இதை enable செய்யவும், FPM package வழங்கிய configuration-ஐ 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 கோப்புகளை FPM socket-க்கு அனுப்பும் விதி உள்ளது. இதன் முக்கியப் பகுதி எந்தவொரு .php கோப்பையும் பொருத்தி, அதை /run/php/php8.3-fpm.sock-ல் உள்ள socket-க்கு அனுப்புகிறது:
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>நீங்கள் அந்தக்கோப்பைத் திருத்த வேண்டியதில்லை; அது சரியாகவே வழங்கப்படுகிறது. ஆனால், socket path-ஐத் தெரிந்து வைத்திருப்பது, பிற்காலத்தில் ஏற்படும் "PHP இயங்குவதற்குப் பதிலாகத் தரவிறக்கம் ஆகிறது" (PHP downloads instead of running) மற்றும் "Primary script unknown" போன்ற பிழைகளைக் கண்டறிய உதவும்; இவை இரண்டுமே Apache மற்றும் FPM ஆகியவற்றுக்கு இடையே இந்த socket அல்லது அதன் பின்னால் உள்ள கோப்பு குறித்த முரண்பாட்டால் ஏற்படுபவை.
படி 5 - உங்கள் செயலிக்கான பெயர் சார்ந்த virtual host
பெயர் சார்ந்த virtual hosting மூலம் ஒரே IP முகவரியில் பல தளங்களை இயக்க முடியும்; கோரிக்கையில் உள்ள Host: header-ஐ வைத்து Apache எந்தத் தளம் என்பதைத் தீர்மானிக்கிறது. இயல்புநிலை /var/www/html-லிருந்து தள்ளி, உங்கள் செயலிக்காக ஒரு கோப்பகத்தை (directory) உருவாக்கவும்:
sudo mkdir -p /var/www/testapp
sudo chown -R www-data:www-data /var/www/testapp
sudo chmod -R 755 /var/www/testappஉரிமையாளர் (Ownership) முக்கியமானது. Ubuntu-வில் Apache மற்றும் PHP-FPM ஆகிய இரண்டும் www-data பயனராக இயங்குகின்றன. எனவே, இணைய சேவையகம் படிக்க வேண்டிய கோப்புகள் மற்றும் பதிவேற்றங்கள் (uploads) போன்ற செயலி எழுத வேண்டிய கோப்பகங்கள் www-data பயனரின் உரிமையில் இருக்க வேண்டும். நீங்கள் உங்கள் பயனர் கணக்கின் மூலம் கோப்புகளைத் திருத்த விரும்பினால், கோப்புகளை உங்கள் வசம் வைத்துக்கொண்டு, உங்கள் பயனரை www-data குழுவில் சேர்ப்பது பொதுவான முறையாகும்; சாதாரண 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-ஐ உங்கள் உண்மையான டொமைனுக்கு மாற்றவும். Options -Indexes, index கோப்பு இல்லாதபோது Apache கோப்பகப் பட்டியலைக் காட்டுவதைத் தடுக்கிறது; இல்லையெனில் பார்வையாளர்கள் உங்கள் source tree-ஐப் பார்க்க முடியும். AllowOverride All, .htaccess கோப்பு செயல்பட அனுமதிக்கிறது; பெரும்பாலான PHP செயலிகள் அழகான URL-களுக்கு இதை எதிர்பார்க்கின்றன. உங்கள் செயலிக்கு இது தேவையில்லை என்றால், வேகத்தை அதிகரிக்க இதை None என மாற்றலாம். இந்தத் தளத்தை இயக்கவும், இயல்புநிலை தளத்தை முடக்கவும், உள்ளமைவைச் சரிபார்த்து, reload செய்யவும்:
sudo a2ensite testapp
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2apache2ctl configtest கட்டளை Syntax OK என்று காட்ட வேண்டும். a2dissite 000-default வரியைத்தான் பலரும் மறந்துவிடுகிறார்கள்; இதனால்தான் இயல்புநிலை பக்கம் மாறாமல் இருப்பதாகத் தோன்றும், இது தோல்விகள் (failures) பகுதியில் விவரிக்கப்பட்டுள்ளது.
படி 6 - PHP இயங்குவதை உறுதிசெய்து, அந்தச் சான்றை நீக்குதல்
App root-ல் ஒரு வரி கொண்ட PHP கோப்பை உருவாக்கவும்:
echo "<?php phpinfo();" | sudo tee /var/www/testapp/info.phphttp://app.example.com/info.php-க்குச் செல்லவும். சரியான முடிவாக, ஊதா மற்றும் சாம்பல் நிறத்திலான PHP Version 8.3.x அட்டவணை தோன்றும்; அதில் ஏற்றப்பட்ட modules பட்டியலிடப்பட்டிருக்கும். Server API வரியில் FPM/FastCGI என்று இருக்க வேண்டும். இந்த கடைசி வரி, கோரிக்கைகள் mod_php வழியாக அல்லாமல் PHP-FPM வழியாகச் செல்வதை உறுதிப்படுத்துகிறது.
இப்போது அதை உடனடியாக நீக்கவும்:
sudo rm /var/www/testapp/info.phpphpinfo() உங்கள் PHP பதிப்பு, ஏற்றப்பட்ட extensions, கோப்பு பாதைகள் (file paths) மற்றும் environment விவரங்களை வெளிப்படுத்தும். இது அறியப்பட்ட பாதுகாப்பு ஓட்டைகளைக் கொண்ட பதிப்பைத் தேடும் நபர்களுக்கு ஒரு வாய்ப்பாக அமையும். இது ஒரு சோதனை மட்டுமே, அம்சம் அல்ல. பக்கத்தைப் பார்த்தவுடன் அதை நீக்கிவிடவும். அட்டவணைக்கு பதிலாக உங்கள் browser info.php கோப்பை பதிவிறக்கம் செய்யக் கேட்டால், PHP Apache-உடன் சரியாக இணைக்கப்படவில்லை என்று அர்த்தம்; வேறு எதையும் செய்வதற்கு முன் தோல்விகள் (failures) பகுதிக்குச் செல்லவும்.
படி 7 - பயன்பாட்டுத் தரவுத்தளத்தை (app database) உருவாக்குதல் மற்றும் குறைந்தபட்ச அதிகாரங்கள் கொண்ட பயனரை அமைத்தல்
Socket-authentication மூலம் 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 என்பது நான்கு-பைட் (four-byte) UTF-8 ஆகும். பழைய utf8 குறியீட்டு முறை emoji மற்றும் சில CJK எழுத்துகளைச் சரியாகக் கையாளாது, எனவே எப்போதும் utf8mb4-ஐப் பயன்படுத்தவும். அனுமதி (grant) appdb.*-க்கு மட்டுமே வழங்கப்பட்டுள்ளது, *.*-க்கு அல்ல: இந்த பயனர் தனது சொந்தத் தரவுத்தளத்தை மட்டுமே அணுக முடியும். இதனால், பயன்பாட்டில் (app) SQL-injection பாதிப்பு ஏற்பட்டாலும், பிற தளங்களின் தரவுத்தள அட்டவணைகளை அணுக முடியாது. மேலும், 'appuser'@'localhost' இந்த கணக்கின் இணைப்புகளை அந்தந்த server-க்குள்ளேயே கட்டுப்படுத்துகிறது.
அந்தப் பயனராகச் சோதிக்கவும்:
mysql -u appuser -p appdbஇது கடவுச்சொல்லைக் கேட்கும், பின்னர் உங்களை MariaDB [appdb]> prompt-க்குக் கொண்டு செல்லும். இதில் -h flag இல்லை என்பதைக் கவனிக்கவும். அதைத் தவிர்க்கும்போது, client உள்ளூர் Unix socket வழியாக இணையும்; இதைத்தான் MariaDB localhost எனக் கருதுகிறது. கவனிக்க வேண்டிய ஒரு விஷயம்: MySQL மற்றும் MariaDB-ஐப் பொறுத்தவரை, localhost என்பது Unix socket-ஐயும், 127.0.0.1 என்பது TCP இணைப்பையும் குறிக்கும். பொதுவான Ubuntu 24.04 MariaDB-ல், 127.0.0.1-லிருந்து வரும் TCP இணைப்பை server localhost-ஆக மாற்றும், எனவே இரண்டும் ஒரே கணக்கோடு பொருந்தும். ஆனால், skip-name-resolve இயக்கப்பட்டிருக்கும் server-களில் (இது ஒரு பொதுவான performance tweak மற்றும் பல container images-ல் இயல்பானது), இவை இரண்டும் வெவ்வேறு hosts-ஆகக் கருதப்படும். இதனால், 127.0.0.1 மூலம் இணையும் ஒரு பயன்பாடு, கடவுச்சொல் சரியாக இருந்தாலும் ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' (using password: YES) பிழையுடன் நிராகரிக்கப்படும்.
எனவே, உங்கள் பயன்பாட்டை localhost host, appuser பயனர், appdb தரவுத்தளம் ஆகியவற்றுடன் இணைக்கவும்; ஒருபோதும் root-ஐப் பயன்படுத்த வேண்டாம். PHP-ன் mysqli மற்றும் PDO ஆகிய இரண்டும் host-ஆக localhost என்ற string-ஐப் பயன்படுத்தும்போது Unix socket-க்கு மாறிவிடும், இது நீங்கள் உருவாக்கிய கணக்குடன் சரியாகப் பொருந்தும். ஒரு framework கட்டாயமாக numeric TCP host-ஐக் கோரினால், அது இணையும் முறைக்கு ஏற்ப பயனரை உருவாக்கவும் ('appuser'@'127.0.0.1'). வேறொரு இயந்திரத்திலிருந்து தரவுத்தளத்தை அணுக வேண்டியிருந்தால் மட்டுமே @'%'-ஐப் பயன்படுத்தவும் (அப்போது firewall விதியையும் சேர்க்க வேண்டும்).
படி 8 - Certbot மூலம் HTTPS-ஐச் சேர்த்தல்
Plain HTTP மூலம் login படிவத்தை வழங்குவது கடவுச்சொற்களைத் தெளிவான உரையாக (clear text) அனுப்பும், மேலும் நவீன உலாவிகள் அனைத்தும் அந்தப் பக்கத்தை "Not secure" என்று குறிக்கும். Certbot ஒரே கட்டளையில் இதைச் சரிசெய்கிறது. Apache plugin-உடன் அதை நிறுவவும்:
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apacheCertbot இங்கே இரண்டு plugin-களைப் பயன்படுத்துகிறது. apache authenticator என்பது உங்கள் Apache வழியாக ஒரு challenge கோப்பைச் சுருக்கமாக வழங்குவதன் மூலம் நீங்கள் அந்த domain-ஐக் கட்டுப்படுத்துகிறீர்கள் என்பதை உறுதிப்படுத்துகிறது. பின்னர் apache installer உங்கள் virtual host-ஐ மாற்றி எழுதி 443 தொகுதியைச் சேர்க்கிறது, புதிய certificate-ஐச் சுட்டிக்காட்டுகிறது, மேலும் இயல்பாகவே அனைத்து HTTP traffic-ஐயும் HTTPS-க்குத் திருப்பி விடுகிறது. Certbot 2.0-க்குப் பிறகு redirect குறித்த கேள்வி எதுவும் இல்லை; நீங்கள் plain HTTP-ஐத் தொடர்ந்து வழங்க விரும்பினால் --no-redirect-ஐப் பயன்படுத்தவும். நீங்கள் படி 5-ல் உண்மையான ServerName-ஐ அமைத்திருப்பதால், Certbot தானாகவே domain-ஐக் கண்டறியும். Certificates 90 நாட்கள் வரை செல்லுபடியாகும், மேலும் இந்தத் தொகுப்பு அவற்றைச் சரியாகப் புதுப்பிக்கும் systemd timer-ஐ நிறுவுகிறது; sudo certbot renew --dry-run மூலம் அந்த timer-ஐச் சரிபார்க்கவும், அது Congratulations, all simulated renewals succeeded-ல் முடிவடைய வேண்டும்.
Challenge, renewal timer, மற்றும் DNS மற்றும் firewall தேவைகள் குறித்த முழுமையான விளக்கத்திற்கு, Apache-ல் Certbot மூலம் இலவச Let's Encrypt TLS certificates வழங்குதல் என்ற துணை வழிகாட்டியைப் பார்க்கவும்.
Backups, upgrades, and hardening
உங்கள் server-ன் நிலையைத் தக்கவைக்கும் இரண்டு விஷயங்களை backup எடுக்க வேண்டும்: databases மற்றும் web root. தினசரி logical dump எடுப்பது எளிமையான மற்றும் நம்பகமான முறையாகும், sudo sh -c 'mysqldump --all-databases --single-transaction | gzip > /root/db-$(date +%F).sql.gz', பின்னர் அதை server-லிருந்து வெளியே நகர்த்த வேண்டும். இந்த முழு pipeline-ஐயும் sudo sh -c-க்குள் வைப்பது முக்கியம்: இல்லையெனில், shell அந்த > /root/... redirect-ஐ உங்கள் user-ஆகவே இயக்கும், இதனால் Permission denied பிழை ஏற்படும். ஏனெனில் mysqldump மட்டுமே sudo-ஐப் பெற்றிருக்கும். --single-transaction, InnoDB tables-ஐ lock செய்யாமல் ஒரு சீரான snapshot-ஐ வழங்குகிறது. இதை /var/www மற்றும் /etc/apache2/sites-available ஆகியவற்றின் tar-உடன் இணைத்தால், அந்த files-ஐக் கொண்டு புதிய VPS-ல் முழு stack-ஐயும் மீண்டும் உருவாக்க முடியும்.
Upgrades என்பது ஒரு சாதாரண sudo apt update && sudo apt upgrade செயல்முறைதான். இதில் கவனிக்க வேண்டியது PHP version bump ஆகும். எதிர்காலத்தில் Ubuntu அதன் default-ஐ PHP 8.4-க்கு மாற்றும்போது, apt ஆனது 8.3-க்கு இணையாக php8.4-fpm-ஐ install செய்யலாம். அப்போது socket /run/php/php8.4-fpm.sock ஆக மாறிவிடும், ஆனால் உங்கள் Apache config இன்னும் 8.3 socket-ஐயே சுட்டிக்காட்டும். புதிய conf-ஐ enable செய்து (sudo a2enconf php8.4-fpm) பழையதை disable செய்யவும்; இல்லையெனில், வழக்கமான upgrade-க்குப் பிறகு உங்கள் தளம் Primary script unknown பிழையைக் காட்டத் தொடங்கும். PHP releases, LTS distro-வை விட வேகமாக வருவதால், patch version-ஐ pin செய்வதற்குப் பதிலாக, தற்போதைய PHP release notes-ஐச் சரிபார்க்கவும்.
முதல் நாளிலேயே இரண்டு hardening நடவடிக்கைகளை மேற்கொள்வது நல்லது. முதலாவதாக, Fail2Ban watching SSH-ஐ server-ல் நிறுவவும். பொது வெளியில் இருக்கும் VPS-ல் சில நிமிடங்களிலேயே தானியங்கி login முயற்சிகள் தொடங்கும்; ஒரு சிறிய jail மூலம் ஆயிரக்கணக்கான முயற்சிகளைத் தடுத்து, சில முயற்சிகளுக்குப் பிறகு ban செய்ய முடியும். இரண்டாவதாக, Apache virtual hosts, MariaDB databases மற்றும் users ஆகியவற்றை file-களைத் திருத்துவதற்குப் பதிலாக browser மூலம் நிர்வகிக்க விரும்பினால், the Webmin web-based control panel-ஐப் பயன்படுத்தலாம். இது நீங்கள் உருவாக்கிய அதே stack-ன் மேல் இயங்கி, அதே config files-ஐக் கையாளும். இவை எவையும் தொழில்நுட்பத்தைப் புரிந்துகொள்வதற்கு மாற்றாகாது, ஆனால் அன்றாட வேலைப்பளுவைக் குறைக்கும்.
தோல்வி முறைகள் மற்றும் நீங்கள் காணும் செய்திகள்
இயல்புநிலை பக்கம் (default page) மறையவில்லை. நீங்கள் உங்கள் virtual host-ஐத் திருத்தி, reload செய்த பிறகும், browser-ல் "Apache2 Ubuntu Default Page" மற்றும் அதன் "It works!" பேனர் தெரிகிறது. Apache முதலில் பொருந்தும் virtual host-ஐயே வழங்கும். கோரிக்கைக்கு எந்தவொரு ServerName-ம் பொருந்தாதபோது, அகரவரிசையில் முதலாவதாக உள்ள config-ஏ வெற்றி பெறும்; 000-default.conf ஆனது testapp.conf-க்கு முன்னதாகவே வரிசைப்படுத்தப்படும். கோரிக்கையின் host name உங்கள் ServerName-உடன் பொருந்தவில்லை அல்லது நீங்கள் sudo a2dissite 000-default-ஐ இயக்கவில்லை. sudo systemctl reload apache2 மூலம் இயல்புநிலை அமைப்பை முடக்கவும், பின் apache2ctl -S மூலம் உறுதிப்படுத்தவும்; இது vhost வரைபடத்தை அச்சிட்டு, எந்த config இயல்புநிலையைக் கொண்டுள்ளது என்பதைக் காட்டும். Browser cache-ஐயும் அழிக்கவும்; பழைய பக்கத்தின் cached 200 பதில் தொடர்ந்து காட்டப்படலாம்.
ஒரு .php கோப்பு இயங்குவதற்குப் பதிலாகத் தரவிறக்கம் ஆகிறது. நீங்கள் info.php-ஐத் திறக்கும்போது, browser அதை இயக்குவதற்குப் பதிலாக, மூல <?php குறியீட்டைக் கொண்ட கோப்பைத் தரவிறக்கம் செய்கிறது அல்லது plain text-ஆகக் காட்டுகிறது. PHP handler இணைக்கப்படாததால், Apache அந்தக் கோப்பை static asset-ஆக வழங்குகிறது. நீங்கள் sudo a2enmod proxy_fcgi அல்லது sudo a2enconf php8.3-fpm-ஐத் தவிர்த்திருக்கலாம் அல்லது அதன் பிறகு Apache-ஐ restart செய்யாமல் இருந்திருக்கலாம். மூன்றையும் (Step 4) இயக்கி, reload செய்யவும். apache2ctl -M | grep fcgi மூலம் module ஏற்றப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும்; அது proxy_fcgi_module-ஐப் பட்டியலிட வேண்டும். இது வெறும் தோற்றப் பிழை அல்ல, source-code கசிவு. எனவே, server-ல் எதையும் பதிவேற்றும் முன் இதைச் சரிசெய்யவும்.
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 தேவையில்லை, கடவுச்சொல்லும் தேவையில்லை. இந்தச் செய்தி socket அங்கீகாரம் சரியாகச் செயல்படுவதைக் குறிக்கும் எதிர்பார்க்கப்பட்ட நடத்தை, இது நிறுவல் பிழை அல்ல.
பயன்பாட்டிலிருந்து ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1', சரியான கடவுச்சொல்லுடன். கணக்கு 'appuser'@'localhost' என்ற பெயரில் உள்ளது, ஆனால் உங்கள் பயன்பாடு TCP வழியாக 127.0.0.1-க்கு இணைகிறது. அந்த server-ல் host-name resolution முடக்கப்பட்டுள்ளது (skip-name-resolve), எனவே MariaDB இரண்டையும் வெவ்வேறு hosts-ஆகக் கருதுகிறது; localhost என்பது Unix socket, 127.0.0.1 என்பது TCP. பயன்பாட்டை localhost host-ஐ நோக்கிச் சுட்டிக்காட்டவும், அப்போதுதான் அது socket-ஐப் பயன்படுத்தி கணக்குடன் பொருந்தும். அல்லது framework TCP-ல் மட்டுமே பேசும் என்றால், 'appuser'@'127.0.0.1' என்ற இரண்டாவது கணக்கை உருவாக்கவும்.
/var/log/apache2/testapp-error.log-ல் AH01071: Got error 'Primary script unknown', browser-ல் File not found. காட்டுகிறது. Apache கோரிக்கையை PHP-FPM-க்கு அனுப்பியது, ஆனால் Apache கொடுத்த பாதையில் FPM-ஆல் script-ஐக் கண்டறிய முடியவில்லை. இதற்கு இரண்டு பொதுவான காரணங்கள்: உங்கள் config-ல் உள்ள FPM socket நிறுவப்படாத PHP version-ஐச் சுட்டிக்காட்டுகிறது (upgrade செய்த பிறகு php8.4 socket, ஆனால் 8.3 மட்டுமே இயங்குகிறது), அல்லது DocumentRoot மற்றும் உண்மையான directory மாறுபடுவதால் கோப்பு அங்கு இல்லை. ls -l /run/php/ மூலம் socket உள்ளதா எனச் சரிபார்க்கவும், DocumentRoot கோப்பு இருக்கும் இடத்துடன் பொருந்துகிறதா என உறுதிப்படுத்தவும், பின் php8.3-fpm மற்றும் apache2 இரண்டையும் restart செய்யவும்.
ஒவ்வொரு restart-ன் போதும் AH00558: apache2: Could not reliably determine the server's fully qualified domain name. இது ஒரு பாதிப்பில்லாத எச்சரிக்கை, பிழை அல்ல. global ServerName அமைக்கப்படவில்லை என்று Apache உங்களுக்குத் தெரிவிக்கிறது. /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. வேறொரு web server ஏற்கனவே 80 port-ஐப் பிடித்துள்ளது; பெரும்பாலும் முந்தைய சோதனையின்போது இயக்கப்பட்ட nginx-ஆக இருக்கலாம். sudo ss -ltnp | grep :80 மூலம் அதைக் கண்டறிந்து, Apache-ஐத் தொடங்கும் முன் அந்தச் சேவையை நிறுத்தி முடக்கவும்.
FAQ
mod_php அல்லது PHP-FPM - எதைப் பயன்படுத்த வேண்டும்?
PHP-FPM-ஐப் பயன்படுத்தவும். mod_php ஒவ்வொரு Apache process-க்குள்ளும் ஒரு interpreter-ஐ இணைக்கிறது, மேலும் இது மெதுவான prefork MPM-ஐப் பயன்படுத்த கட்டாயப்படுத்துகிறது. இதனால், ஒரு static image-ஐ வழங்கும்போதும் Apache, PHP-ன் சுமையைச் சுமக்க வேண்டியுள்ளது. PHP-FPM, PHP-ஐ ஒரு தனித்த, சுதந்திரமாக நிர்வகிக்கப்படும் pool-ஆக இயக்குகிறது. Apache இதை ஒரு socket வழியாக அணுகுகிறது. இது வேகமான threaded event MPM-உடன் இணைந்து செயல்படுகிறது, மேலும் பிற்காலத்தில் nginx-க்கு மாறுவதையும் எளிதாக்குகிறது. இதுவே நவீன தரநிலை (modern default); mod_php என்பது in-process செயல்பாட்டைச் சார்ந்திருக்கும் பழைய (legacy) application-களுக்கு மட்டுமே பொருத்தமானது.
PHP கோப்பை இயக்கும்போது, ஏன் என் browser அதை download செய்கிறது?
PHP handler இணைக்கப்படாததால், Apache .php கோப்பை ஒரு static download-ஆகக் கருதுகிறது. FPM பயன்படுத்தும் Ubuntu 24.04-ல், நீங்கள் sudo a2enmod proxy_fcgi, sudo a2enconf php8.3-fpm அல்லது அதன் பிறகு செய்ய வேண்டிய Apache restart ஆகியவற்றில் ஏதேனும் ஒன்றைத் தவறவிட்டிருக்கலாம். மூன்றையும் இயக்கி, reload செய்யவும். பின்னர் apache2ctl -M | grep fcgi மூலம் proxy_fcgi_module பட்டியலிடப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும். இதைச் சரிசெய்யும் வரை, server source code-ஐ வெளிப்படுத்தும் என்பதால், இதை அவசரமாகக் கையாளவும்.
சரியான password இருந்தும் MariaDB-ல் ஏன் root access மறுக்கப்படுகிறது?
password இல்லாததால், Ubuntu-ன் MariaDB root கணக்கை unix_socket மூலம் அங்கீகரிக்கிறது. இது operating-system root user-உடன் பிணைக்கப்பட்டுள்ளது. ஒரு சாதாரண shell-லிருந்து mysql -u root-ஐ இயக்கினால், வடிவமைப்பின்படி ERROR 1698 (28000): Access denied for user 'root'@'localhost' என்ற விடை கிடைக்கும். அதற்குப் பதிலாக sudo mysql மூலம் இணைக்கவும். root-ஐ மீண்டும் பயன்படுத்துவதற்குப் பதிலாக, ஒவ்வொரு application-க்கும் தனித்தனி password-அங்கீகாரம் கொண்ட user-ஐ உருவாக்கவும்.
எனது LAMP தளத்தில் HTTPS-ஐ எவ்வாறு சேர்ப்பது?
certbot மற்றும் python3-certbot-apache ஆகியவற்றை install செய்யவும். ஒரு domain-ன் A record-ஐ server-ஐ நோக்கிச் சுட்டிக்காட்டவும், பின்னர் sudo certbot --apache-ஐ இயக்கவும். apache authenticator, உங்கள் இயங்கும் Apache மூலம் domain கட்டுப்பாட்டை உறுதிப்படுத்துகிறது. installer, port 443-க்கான virtual host-ஐ மாற்றி அமைத்து, தானியங்கி புதுப்பித்தலை (automatic renewal) அமைக்கும். முழுமையான Certbot மற்றும் Apache வழிகாட்டி சவால்கள், புதுப்பித்தல் timer மற்றும் பொதுவான தோல்வி நிலைகளை விளக்குகிறது.