فارسی (Farsi)
€EUR

نصب پشته LEMP روی VPS لینوکس با AlmaLinux 9

2 min
سرور مجازی (VPS/VDS)

پشته 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. به‌روزرسانی سیستم و نصب ابزارها

Bash
dnf -y update dnf -y install nano policycoreutils-python-utils

بسته policycoreutils-python-utils ابزار semanage را فراهم می‌کند که در بخش SELinux به کار می‌رود.

2. نصب Nginx و باز کردن فایروال

Bash
dnf -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

Bash
dnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation

به پرسش‌های ویزارد پاسخ دهید: رمز root را تعیین کنید، کاربران ناشناس را حذف کنید، ورود از راه دور root را ممنوع کنید و پایگاه‌داده آزمایشی را پاک کنید. سپس یک پایگاه‌داده و کاربر اختصاصی بسازید:

Bash
mysql -u root -p
SQL
1CREATE 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 ارائه می‌دهد. پیش از نصب، استریم دلخواه را انتخاب کنید:

Bash
dnf 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 اجرا می‌شود، استخر و دایرکتوری‌های نشست را هماهنگ کنید:

Bash
sed -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

Bash
mkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx
1server { 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}
Bash
nginx -t && systemctl reload nginx

6. پیکربندی SELinux

SELinux را در حالت enforcing نگه دارید (با getenforce بررسی کنید). فایل‌هایی که زیر /var/www ساخته می‌شوند از قبل برچسب httpd_sys_content_t می‌گیرند، اما فایل‌هایی که با mv از جای دیگر منتقل شده‌اند برچسب قبلی خود را نگه می‌دارند. برچسب‌ها را دوباره بزنید و دسترسی نوشتن را فقط به دایرکتوری‌هایی بدهید که نیاز دارند:

Bash
restorecon -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 و حذف فایل آزمایشی

Bash
echo '<?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() پیکربندی شما را فاش می‌کند، پس بلافاصله حذفش کنید. در پایان سرویس‌ها را بررسی کنید:

Bash
systemctl 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 است.

با آخرین پیشنهادها، تخفیف‌ها و تبلیغات ویژه به‌روز بمانید.

مشاهده تخفیف‌ها

ما از کوکی استفاده می‌کنیم

ما از کوکی‌های تحلیلی برای بهبود تجربه شما در سایت خود استفاده می‌کنیم. هیچ داده‌ای به اشخاص ثالث فروخته نمی‌شود. اطلاعات بیشتر در سیاست حفظ حریم خصوصی ما.