پشته LEMP (شامل Linux، Nginx، MariaDB و PHP-FPM) جایگزینی سریع و سبک برای Apache جهت اجرای سایتهای PHP است. در AlmaLinux 9 همه چیز از مخزن رسمی AppStream میآید، اما SELinux و firewalld کمی دقت میخواهند. این راهنما شما را در یک نصب تمیز روی VPS Linux Infrawire همراهی میکند؛ همین مراحل روی Rocky Linux 9 هم کار میکند.
📋 پیشنیازها
- یک VPS از نوع KVM با AlmaLinux 9 (آیپی و رمز عبور root در بخش کاربری شما موجود است)
- دسترسی SSH با کاربر root
- دامنه
example.comکه بهVPS_IPاشاره میکند
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. نصب PHP 8.3 از ماژول AppStream
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
استخر روی سوکت یونیکس /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 بگردید.
خطای 403 Forbidden یا Permission denied. مالک (nginx:nginx) و برچسب SELinux را با ls -Z /var/www/example.com/public بررسی کنید. باید 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 است.