LEMP स्टैक (Linux, Nginx, MariaDB, PHP-FPM) PHP साइट चलाने के लिए Apache का तेज़ और हल्का विकल्प है। AlmaLinux 9 पर सब कुछ आधिकारिक AppStream रिपॉज़िटरी से आता है, लेकिन SELinux और firewalld पर थोड़ा ध्यान देना पड़ता है। यह गाइड आपके VPS Linux Infrawire पर साफ़ इंस्टॉलेशन में आपका साथ देती है; यही चरण Rocky Linux 9 पर भी काम करते हैं।
📋 पूर्वापेक्षाएँ
- AlmaLinux 9 वाला एक KVM VPS (IP और root पासवर्ड आपके क्लाइंट एरिया में मिलते हैं)
- root के रूप में SSH एक्सेस
VPS_IPकी ओर इशारा करता हुआ डोमेनexample.com
1. सिस्टम अपडेट करें और टूल इंस्टॉल करें
Bashdnf -y update dnf -y install nano policycoreutils-python-utils
policycoreutils-python-utils में semanage आता है, जिसका उपयोग SELinux वाले भाग में होगा।
2. Nginx इंस्टॉल करें और फ़ायरवॉल खोलें
Bashdnf -y install nginx systemctl enable --now nginx firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload firewall-cmd --list-services
3. MariaDB इंस्टॉल करें
Bashdnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation
विज़ार्ड के सवालों के जवाब देकर root पासवर्ड सेट करें, अनाम यूज़र हटाएँ, root का रिमोट लॉगिन बंद करें और टेस्ट डेटाबेस हटाएँ। फिर अलग डेटाबेस और यूज़र बनाएँ:
Bashmysql -u root -p
SQL1CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; 3GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; 4FLUSH PRIVILEGES; 5EXIT;
4. AppStream मॉड्यूल से PHP 8.3 इंस्टॉल करें
AppStream में PHP की कई स्ट्रीम हैं। इंस्टॉल से पहले मनचाही स्ट्रीम चुनें:
Bashdnf module list php dnf -y module reset php dnf -y module enable php:8.3 dnf -y install php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip php -v
डिफ़ॉल्ट रूप से PHP-FPM पूल apache यूज़र से चलता है। चूँकि Nginx nginx यूज़र से चलता है, इसलिए पूल और सेशन डायरेक्टरी को मिलाएँ:
Bashsed -i 's/^user = apache/user = nginx/; s/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf chown -R root:nginx /var/lib/php/session /var/lib/php/wsdlcache /var/lib/php/opcache grep -E '^(user|group|listen)' /etc/php-fpm.d/www.conf systemctl enable --now php-fpm
पूल Unix सॉकेट /run/php-fpm/www.sock पर सुनता है।
5. server block बनाएँ
Bashmkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 root /var/www/example.com/public; 6 index index.php index.html; 7 8 location / { 9 try_files $uri $uri/ /index.php?$query_string; 10 } 11 12 location ~ \.php$ { 13 include fastcgi_params; 14 fastcgi_pass unix:/run/php-fpm/www.sock; 15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 16 } 17 18 location ~ /\.(?!well-known) { 19 deny all; 20 } 21}
Bashnginx -t && systemctl reload nginx
6. SELinux कॉन्फ़िगर करें
SELinux को enforcing मोड में रखें (getenforce)। /var/www के नीचे बनी फ़ाइलों को पहले से httpd_sys_content_t लेबल मिलता है, लेकिन कहीं और से mv से लाई गई फ़ाइलें पुराना लेबल रखती हैं। उन्हें दोबारा लेबल करें और लिखने की अनुमति केवल उन डायरेक्टरी को दें जिन्हें उसकी ज़रूरत है:
Bashrestorecon -Rv /var/www/example.com mkdir -p /var/www/example.com/public/uploads semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/public/uploads(/.*)?' restorecon -Rv /var/www/example.com/public/uploads
बूलियन तभी चालू करें जब आपके एप्लिकेशन को उनकी ज़रूरत हो:
Bash# PHP डेटाबेस से TCP पर जुड़ता है (रिमोट सर्वर या 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # PHP या Nginx बाहर की ओर कनेक्शन बनाते हैं (API, किसी ऐप तक proxy_pass) setsebool -P httpd_can_network_connect 1
सॉकेट से जुड़ने वाले लोकल MariaDB को इनमें से किसी की ज़रूरत नहीं है। SELinux क्या रोक रहा है यह देखने के लिए ausearch -m avc -ts recent चलाएँ। किसी समस्या को setenforce 0 से कभी "ठीक" न करें।
7. PHP टेस्ट करें और टेस्ट फ़ाइल हटाएँ
Bashecho '<?php phpinfo();' > /var/www/example.com/public/info.php curl -sI http://example.com/info.php | head -n 1 rm /var/www/example.com/public/info.php
HTTP/1.1 200 OK की उम्मीद रखें। phpinfo() पेज आपका कॉन्फ़िगरेशन उजागर करता है, इसलिए उसे तुरंत हटाएँ। अंत में सर्विस जाँचें:
Bashsystemctl is-active nginx php-fpm mariadb
🛠️ समस्या निवारण
502 Bad Gateway। PHP-FPM बंद है या fastcgi_pass में सॉकेट का पाथ ग़लत है। systemctl status php-fpm चलाएँ, ls -l /run/php-fpm/www.sock जाँचें और /var/log/nginx/error.log पढ़ें। यदि लॉग में सॉकेट पर Permission denied है तो ausearch से AVC denial खोजें।
403 Forbidden या Permission denied। ls -Z /var/www/example.com/public से मालिक (nginx:nginx) और SELinux लेबल जाँचें। लेबल httpd_sys_content_t होना चाहिए; नहीं तो restorecon -Rv चलाएँ।
"File not found." या खाली पेज। root पाथ या SCRIPT_FILENAME लाइन ग़लत है। दोनों जाँचें, फिर nginx -t चलाएँ।
बाहरी डेटाबेस या API से कनेक्ट नहीं हो रहा। SELinux डिफ़ॉल्ट रूप से आउटगोइंग कनेक्शन रोकता है: ऊपर बताए अनुसार httpd_can_network_connect_db या httpd_can_network_connect चालू करें।
🎉 Nginx, MariaDB और PHP-FPM AlmaLinux 9 पर चल रहे हैं, और SELinux अब भी enforcing मोड में है।