نصب LEMP روی سرور مجازی؛ راهنمای گام‌به‌گام از صفر تا اجرا

آموزش کامل نصب LEMP روی سرور مجازی شامل نصب Nginx، MySQL و PHP-FPM با تنظیمات امنیتی اولیه، رفع خطاهای رایج و بهینه‌سازی عملکرد.

۶ دقیقه به‌روزرسانی ۲۷ مرداد ۱۴۰۵

چرا نصب LEMP روی سرور مجازی؟

اگر به‌تازگی یک سرور مجازی (VPS) با سیستم‌عامل اوبونتو یا دبیان تهیه کرده‌اید، احتمالاً اولین قدم برای راه‌اندازی وب‌سایت، نصب یک پشته‌ی نرم‌افزاری وب است. در حالی که LAMP (لینوکس، آپاچی، MySQL، PHP) سال‌ها استاندارد بود، امروزه نصب LEMP (لینوکس، Nginx، MySQL، PHP-FPM) به دلیل عملکرد بالاتر Nginx در مدیریت همزمانی اتصالات و مصرف منابع کمتر، انتخاب هوشمندانه‌تری برای سرورهای مجازی با منابع محدود است.

در این راهنما، فرض می‌کنیم یک سرور مجازی با اوبونتو ۲۲.۰۴ LTS و دسترسی ریشه (root) یا کاربر با مجوز sudo دارید. تمام دستورات را می‌توانید به‌ترتیب اجرا کنید و در پایان، یک وب‌سرور کاملاً کاربردی با پشتیبانی از PHP و MySQL خواهید داشت.

پیش‌نیازها و آماده‌سازی اولیه

قبل از شروع نصب LEMP، مطمئن شوید سیستم‌عامل به‌روز است و ابزارهای پایه نصب شده‌اند:

sudo apt update
sudo apt upgrade -y
sudo apt install -y curl wget git unzip

همچنین بررسی کنید که پورت‌های ۸۰ و ۴۴۳ باز هستند. اگر از فایروال UFW استفاده می‌کنید، دستورات زیر را اجرا کنید:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

نکته مهم: اگر به سرور از طریق SSH متصل هستید، حتماً قبل از فعال‌سازی فایروال، قانون OpenSSH را اضافه کنید؛ در غیر این صورت، اتصال خود را از دست خواهید داد.

مرحله ۱: نصب Nginx

Nginx به‌عنوان وب‌سرور اصلی در پشته LEMP عمل می‌کند. نصب آن ساده است:

sudo apt install -y nginx

پس از نصب، سرویس را فعال و اجرا کنید:

sudo systemctl enable nginx
sudo systemctl start nginx

برای اطمینان از اجرای صحیح، آدرس IP سرور خود را در مرورگر وارد کنید. باید صفحه‌ی پیش‌فرض Nginx را ببینید. اگر صفحه نمایش داده نشد، وضعیت سرویس را بررسی کنید:

sudo systemctl status nginx

در صورت وجود خطا، لاگ‌ها را در /var/log/nginx/error.log بررسی کنید.

تنظیمات اولیه امنیتی Nginx

برای افزایش امنیت، فایل پیکربندی اصلی را ویرایش کنید:

sudo nano /etc/nginx/nginx.conf

در بخش http، خطوط زیر را اضافه یا ویرایش کنید:

server_tokens off;
client_max_body_size 10M;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;

این تنظیمات، اطلاعات نسخه‌ی Nginx را پنهان می‌کند، حجم آپلود را محدود می‌سازد و هدرهای امنیتی مهمی اضافه می‌کند. پس از اعمال تغییرات، پیکربندی را تست و سرویس را ری‌استارت کنید:

sudo nginx -t
sudo systemctl reload nginx

مرحله ۲: نصب MySQL

در این راهنما از MySQL به‌عنوان سیستم مدیریت پایگاه‌داده استفاده می‌کنیم. نصب:

sudo apt install -y mysql-server

پس از نصب، اسکریپت امنیتی را اجرا کنید:

sudo mysql_secure_installation

این اسکریپت چند سؤال می‌پرسد: تنظیم VALIDATE PASSWORD PLUGIN (پیشنهاد می‌شود گزینه ۲ را انتخاب کنید)، تغییر رمز ریشه، حذف کاربران ناشناس، غیرفعال‌سازی ورود ریشه از راه دور و حذف پایگاه‌داده‌های تست. برای همه‌ی سؤالات، پاسخ «Y» دهید.

ایجاد کاربر اختصاصی پایگاه‌داده

به‌جای استفاده از کاربر ریشه برای برنامه‌های وب، یک کاربر اختصاصی بسازید:

sudo mysql

سپس در محیط MySQL:

CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'YourStrongPassword!';
CREATE DATABASE wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wordpress'@'localhost';
FLUSH PRIVILEGES;
EXIT;

خطای رایج: اگر هنگام اجرای mysql_secure_installation با خطای «Access denied for user root» مواجه شدید، به این دلیل است که در نسخه‌های جدید MySQL، کاربر ریشه به‌صورت پیش‌فرض با احراز هویت auth_socket کار می‌کند. برای رفع این مشکل، ابتدا با sudo mysql وارد شوید و سپس:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewRootPassword';
FLUSH PRIVILEGES;
EXIT;

مرحله ۳: نصب PHP-FPM

PHP-FPM (FastCGI Process Manager) پردازش کدهای PHP را بر عهده دارد و به‌خوبی با Nginx کار می‌کند. برای نصب PHP و افزونه‌های پرکاربرد:

sudo apt install -y php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl

پس از نصب، سرویس PHP-FPM را فعال کنید:

sudo systemctl enable php8.1-fpm
sudo systemctl start php8.1-fpm

توجه داشته باشید که نسخه‌ی PHP ممکن است بسته به مخازن سیستم‌عامل شما متفاوت باشد (مثلاً php8.1-fpm در اوبونتو ۲۲.۰۴). با دستور زیر نسخه‌ی دقیق را پیدا کنید:

php -v

پیکربندی PHP-FPM برای امنیت

فایل پیکربندی اصلی را ویرایش کنید:

sudo nano /etc/php/8.1/fpm/php.ini

مقادیر زیر را پیدا و تغییر دهید:

upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 60
memory_limit = 128M
expose_php = Off

تنظیم expose_php = Off اطلاعات نسخه‌ی PHP را از هدرهای HTTP حذف می‌کند. پس از اعمال تغییرات، سرویس را ری‌استارت کنید:

sudo systemctl restart php8.1-fpm

مرحله ۴: پیکربندی Nginx برای کار با PHP

حالا باید یک بلوک سرور (Server Block) برای وب‌سایت خود ایجاد کنیم. ابتدا ساختار پوشه‌ها را بسازید:

sudo mkdir -p /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example.com/html
sudo chmod -R 755 /var/www/example.com

سپس یک فایل تست PHP ایجاد کنید:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/example.com/html/index.php

حالا فایل پیکربندی Nginx را بسازید:

sudo nano /etc/nginx/sites-available/example.com

محتوای زیر را وارد کنید:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

این پیکربندی، درخواست‌های PHP را به سوکت PHP-FPM هدایت می‌کند و دسترسی به فایل‌های مخفی مانند .htaccess را مسدود می‌سازد.

حالا بلوک سرور را فعال کنید:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

خطای رایج: فایل PHP دانلود می‌شود به‌جای اجرا

اگر هنگام باز کردن فایل PHP در مرورگر، آن را دانلود کردید، به این معنی است که Nginx نمی‌تواند درخواست را به PHP-FPM ارسال کند. دلایل احتمالی:

  • مسیر سوکت در پیکربندی اشتباه است. مسیر صحیح را با sudo ls /var/run/php/ بررسی کنید.
  • سرویس PHP-FPM اجرا نمی‌شود. با sudo systemctl status php8.1-fpm وضعیت را بررسی کنید.
  • پسوند فایل .php در بلوک location تعریف نشده است.

مرحله ۵: فعال‌سازی SSL با Let's Encrypt

برای امنیت بیشتر و رتبه‌ی بهتر در گوگل، حتماً SSL را فعال کنید. ابتدا Certbot را نصب کنید:

sudo apt install -y certbot python3-certbot-nginx

سپس گواهی را صادر کنید:

sudo certbot --nginx -d example.com -d www.example.com

Certbot به‌صورت خودکار پیکربندی Nginx را تغییر می‌دهد و ریدایرکت از HTTP به HTTPS را فعال می‌کند. برای اطمینان از تمدید خودکار گواهی:

sudo certbot renew --dry-run

نکته: اگر دامنه‌ی شما هنوز به سرور متصل نیست (DNS تنظیم نشده)، ابتدا رکوردهای A را در پنل مدیریت دامنه خود اضافه کنید؛ در غیر این صورت، صدور گواهی با خطا مواجه می‌شود.

مرحله ۶: تست نهایی و بهینه‌سازی

پس از اتمام نصب LEMP، فایل تست PHP را حذف کنید:

sudo rm /var/www/example.com/html/index.php

برای تست عملکرد، می‌توانید از ابزار ab (Apache Bench) استفاده کنید:

sudo apt install -y apache2-utils
ab -n 1000 -c 100 https://example.com/

این دستور ۱۰۰۰ درخواست همزمان ارسال می‌کند و آمار پاسخ‌گویی را نشان می‌دهد. اگر اعداد رضایت‌بخش نبودند، تنظیمات زیر را در /etc/nginx/nginx.conf اعمال کنید:

worker_processes auto;
worker_connections 1024;
keepalive_timeout 65;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

جمع‌بندی

در این راهنما، مراحل کامل نصب LEMP روی سرور مجازی را با تمرکز بر امنیت و عملکرد پشت سر گذاشتید. حالا یک وب‌سرور Nginx با پشتیبانی از PHP-FPM و MySQL دارید که می‌تواند میزبان وب‌سایت‌های پویا، وردپرس یا برنامه‌های سفارشی باشد. اگر به دنبال یک بستر پایدار برای میزبانی پروژه‌های خود هستید، سرورهای مجازی با منابع اختصاصی و پشتیبانی فنی می‌توانند انتخاب مناسبی باشند؛ اما مهم‌ترین نکته، نگهداری منظم و به‌روزرسانی مداوم نرم‌افزارهای نصب‌شده است.

برای یادگیری بیشتر، پیشنهاد می‌کنم مستندات رسمی Nginx و MySQL را مطالعه کنید و تنظیمات فایروال و بکاپ‌گیری منظم را فراموش نکنید. اگر در هر مرحله به خطا برخوردید، لاگ‌ها را در /var/log/nginx/ و /var/log/mysql/ بررسی کنید؛ معمولاً راه‌حل در همان‌جا پیدا می‌شود.

آیا این مطلب برایتان مفید بود؟