آموزش سرور

نصب وردپرس روی سرور مجازی با LEMP؛ Nginx، MariaDB و PHP بدون کنترل‌پنل

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۷ دقیقه

https://example.comLEMPNginxMariaDBآموزش سرورنصب وردپرس روی سرور مجازیبا LEMP؛ Nginx، MariaDB وPHP بدون کنترل‌پنلمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

برای نصب وردپرس بدون کنترل‌پنل روی اوبونتو ۲۴.۰۴، ابتدا Nginx، MariaDB و PHP-FPM را با apt نصب کنید. سپس یک دیتابیس و کاربر اختصاصی برای وردپرس بسازید، آخرین نسخهٔ وردپرس را در /var/www دانلود کنید، مالکیت فایل‌ها را به www-data بدهید و یک بلوک server در Nginx بنویسید. در پایان با Certbot گواهی SSL رایگان بگیرید و نصب را از مرورگر کامل کنید.

LEMP چیست و چرا بدون کنترل‌پنل؟

LEMP مخفف چهار جزء است: Linux (سیستم‌عامل)، Engine-X یا همان Nginx (وب‌سرور)، MariaDB یا MySQL (دیتابیس) و PHP (زبانی که وردپرس با آن نوشته شده است). این ترکیب یکی از رایج‌ترین و سریع‌ترین بسترها برای اجرای وردپرس است.

کنترل‌پنل‌ها کار را ساده می‌کنند، اما منابع مصرف می‌کنند، خودشان باید به‌روز و امن نگه داشته شوند و گاهی تنظیمات را پیچیده می‌کنند. نصب دستی یعنی سروری سبک‌تر، کنترل کامل روی هر تنظیم و درک واقعی از این‌که سایت شما چطور کار می‌کند. این راهنما برای اوبونتو ۲۴.۰۴ نوشته شده و فرض می‌کند با SSH به سرور وصل شده‌اید؛ اگر نه، ابتدا آموزش اتصال با SSH را ببینید.

مسیر یک درخواست در LEMP
درخواست صفحهفایل‌های PHPکوئری‌هامرورگرhttps://example.comNginxفایل‌های ثابت و TLSPHP-FPMاجرای وردپرسMariaDBپست‌ها و تنظیماتدرخواست صفحهفایل‌های PHPکوئری‌هامرورگرhttps://example.comNginxفایل‌های ثابت و TLSPHP-FPMاجرای وردپرسMariaDBپست‌ها و تنظیمات
شکل ۱ Nginx فایل‌های ثابت را خودش می‌دهد و فقط درخواست‌های PHP را به PHP-FPM می‌سپارد.

پیش‌نیازها

  • یک سرور مجازی با اوبونتو ۲۴.۰۴ و دست‌کم ۱ گیگابایت رم (برای سایت واقعی ۲ گیگ راحت‌تر است)؛
  • یک دامنه که رکورد A آن به آی‌پی سرور اشاره می‌کند (مثلاً example.com و www.example.com)؛
  • دسترسی root یا کاربری با sudo.

ابتدا سیستم را به‌روز کنید و فایروال را آماده کنید:

sudo apt update && sudo apt upgrade -y
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

اگر فرمان دوم خطا داد، بعد از نصب Nginx دوباره اجرا کنید. توضیح کامل فایروال در راهنمای UFW آمده است.

قدم ۱: نصب Nginx، MariaDB و PHP

sudo apt install -y nginx mariadb-server php-fpm php-mysql php-curl php-gd php-intl php-mbstring php-xml php-zip php-imagick

افزونه‌های PHP فهرست‌شده، نیازهای رایج وردپرس و بیشتر افزونه‌ها را پوشش می‌دهند. در اوبونتو ۲۴.۰۴ نسخهٔ پیش‌فرض PHP، نسخهٔ ۸.۳ است. نسخهٔ نصب‌شده و نام سرویس را بررسی کنید:

php -v
systemctl status php8.3-fpm --no-pager

سپس MariaDB را امن کنید:

sudo mysql_secure_installation

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

قدم ۲: ساخت دیتابیس و کاربر وردپرس

هرگز وردپرس را با کاربر root دیتابیس اجرا نکنید. یک دیتابیس و کاربر اختصاصی بسازید:

sudo mysql
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'A-Strong-Random-Password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

رمز را با یک رمز طولانی و تصادفی جایگزین کنید. مجموعه‌کاراکتر utf8mb4 برای پشتیبانی کامل از فارسی و ایموجی ضروری است.

root@server: ~
$ sudo apt install -y nginx mariadb-server php-fpm php-mysql$ php -vPHP 8.3.x (cli) ...$ sudo mysql -e "CREATE DATABASE wordpress CHARACTER SET utf8mb4;"$ sudo nginx -tnginx: configuration file /etc/nginx/nginx.conf test is successful$ sudo certbot --nginx -d example.com -d www.example.comSuccessfully deployed certificate for example.com$ 
شکل ۲ خلاصهٔ دستورهای اصلی؛ همیشه پیش از reload خروجی nginx -t را بررسی کنید.

قدم ۳: دانلود وردپرس

cd /tmp
curl -LO https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
sudo mkdir -p /var/www/example.com
sudo cp -a /tmp/wordpress/. /var/www/example.com/
sudo chown -R www-data:www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 755 {} \;
sudo find /var/www/example.com -type f -exec chmod 644 {} \;

مالکیت فایل‌ها با کاربر www-data است که PHP-FPM با آن اجرا می‌شود؛ بنابراین وردپرس می‌تواند افزونه نصب و تصاویر آپلود کند. اگر دانلود از سرور ایران با مشکل روبه‌رو شد، فایل را روی کامپیوتر خودتان دانلود و با scp یا sftp منتقل کنید.

قدم ۴: پیکربندی Nginx

فایل /etc/nginx/sites-available/example.com را بسازید:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php index.html;
    client_max_body_size 64M;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

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

    location ~ /\.(ht|git) { deny all; }
    location = /xmlrpc.php { deny all; }

    location ~* \.(jpg|jpeg|png|webp|gif|svg|css|js|woff2)$ {
        expires 30d;
        access_log off;
    }
}

خط try_files لینک‌های یکتای وردپرس (Permalinks) را ممکن می‌کند. بستن xmlrpc.php یکی از اهداف رایج حملات حدس رمز را حذف می‌کند؛ اگر از اپلیکیشن موبایل وردپرس یا Jetpack استفاده می‌کنید، این خط را بردارید. سایت را فعال و Nginx را بارگذاری مجدد کنید:

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

ساختار فایل‌های Nginx را در مبانی پیکربندی Nginx توضیح داده‌ایم.

قدم ۵: گواهی SSL رایگان

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot گواهی Let's Encrypt را می‌گیرد، تنظیمات HTTPS را به فایل Nginx اضافه می‌کند و تمدید خودکار را فعال می‌کند. جزئیات و رفع خطاها در آموزش Nginx و Let's Encrypt.

قدم ۶: تکمیل نصب از مرورگر

آدرس https://example.com را باز کنید. زبان را انتخاب کنید، نام دیتابیس (wordpress)، نام کاربری (wpuser)، رمز و میزبان (localhost) را وارد کنید. سپس عنوان سایت، نام کاربری مدیر و رمز را تعیین کنید. نام کاربری مدیر را admin نگذارید.

نصب در شش قدم
  1. نصب بسته‌ها

    Nginx، MariaDB، PHP-FPM و افزونه‌های PHP.

  2. دیتابیس

    دیتابیس utf8mb4 و کاربر اختصاصی با رمز قوی.

  3. فایل‌های وردپرس

    دانلود در /var/www و مالکیت www-data.

  4. بلوک server

    try_files، PHP-FPM و مسدودسازی فایل‌های حساس.

  5. SSL

    گواهی رایگان با Certbot و تمدید خودکار.

  6. نصب از مرورگر

    اطلاعات دیتابیس و حساب مدیر با نام غیرقابل حدس.

شکل ۳ پس از این شش قدم، تنظیمات PHP، کرون واقعی، بکاپ و امنیت را فراموش نکنید.

تنظیمات پس از نصب

افزایش محدودیت آپلود و حافظه

در فایل /etc/php/8.3/fpm/php.ini این مقادیر را تنظیم کنید و سپس PHP-FPM را ری‌استارت کنید:

upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
sudo systemctl restart php8.3-fpm

کرون واقعی به‌جای WP-Cron

WP-Cron با هر بازدید بررسی می‌شود و در سایت‌های کم‌بازدید دیر اجرا و در سایت‌های پربازدید بار اضافه ایجاد می‌کند. در wp-config.php خط define('DISABLE_WP_CRON', true); را اضافه کنید و یک کرون‌جاب سیستمی بسازید که هر پنج دقیقه wp-cron.php را اجرا کند. روش آن در راهنمای کرون‌جاب لینوکس آمده است.

امنیت و بکاپ

  • ورود SSH را با کلید انجام دهید و Fail2ban را نصب کنید.
  • از دیتابیس و پوشهٔ wp-content بکاپ منظم و خارج از سرور بگیرید.
  • وردپرس، قالب و افزونه‌ها را به‌روز نگه دارید و افزونه‌های بلااستفاده را حذف کنید.

سرعت بیشتر

OPcache در PHP به‌طور پیش‌فرض فعال است. برای سایت‌های پربازدید، Redis برای کش اشیا و CDN برای فایل‌های ثابت را اضافه کنید.

رفع خطاهای رایج

  • 502 Bad Gateway: مسیر سوکت PHP-FPM در Nginx با نسخهٔ نصب‌شده یکی نیست یا سرویس PHP-FPM اجرا نمی‌شود. رفع خطای 502 را ببینید.
  • Error establishing a database connection: نام دیتابیس، کاربر یا رمز در wp-config.php اشتباه است یا MariaDB اجرا نمی‌شود.
  • دانلود فایل PHP به‌جای اجرا: بلوک location ~ \.php$ درست تنظیم نشده است.
  • لینک‌های یکتا 404 می‌دهند: خط try_files را بررسی کنید.
  • درخواست اطلاعات FTP هنگام نصب افزونه: مالکیت فایل‌ها با www-data نیست.

چه سروری برای شروع؟

برای یک سایت وردپرسی معمولی، سرور ۱ یا ۲ هسته با ۲ گیگ رم شروع مناسبی است. اگر مخاطبانتان در ایران‌اند، سرور مجازی ایران سرعت بارگذاری را برای آن‌ها بهتر می‌کند. کمترین هزینهٔ ساعتی سرور ایران کلودیفای در حال حاضر ۱٬۲۰۰ است.

چرا Nginx و نه Apache؟

وردپرس روی هر دو وب‌سرور به‌خوبی اجرا می‌شود و بسیاری از هاست‌های اشتراکی از Apache استفاده می‌کنند. تفاوت اصلی در معماری است. Apache به‌طور سنتی برای هر اتصال یک پردازه یا رشته اختصاص می‌دهد و PHP را می‌تواند داخل خودش اجرا کند؛ این مدل ساده است اما با افزایش کاربران هم‌زمان، رم بیشتری مصرف می‌کند. Nginx با مدل رویدادمحور، هزاران اتصال را با چند پردازهٔ سبک مدیریت می‌کند و PHP را به سرویس جداگانهٔ PHP-FPM می‌سپارد.

نتیجهٔ عملی این است که روی سرورهای کوچک، Nginx همراه با PHP-FPM معمولاً رم کمتری مصرف می‌کند و فایل‌های ثابت مثل تصاویر را سریع‌تر تحویل می‌دهد. در مقابل، Nginx فایل .htaccess را نمی‌خواند؛ بنابراین افزونه‌هایی که قوانینشان را در این فایل می‌نویسند (مثل برخی افزونه‌های کش و امنیتی)، باید قوانین معادل را در پیکربندی Nginx داشته باشند. بیشتر افزونه‌های معروف راهنمای تنظیم Nginx را در مستندات خود ارائه می‌کنند.

نگهداری منظم سرور وردپرسی

نصب، پایان کار نیست. یک برنامهٔ نگهداری ساده از بیشتر مشکلات جلوگیری می‌کند. هر هفته به‌روزرسانی‌های وردپرس، قالب و افزونه‌ها را بررسی و نصب کنید؛ پیش از به‌روزرسانی‌های بزرگ از دیتابیس و فایل‌ها بکاپ بگیرید. هر ماه به‌روزرسانی‌های سیستم‌عامل را نصب کنید، فضای دیسک را بررسی کنید و لاگ خطای Nginx و PHP را مرور کنید تا خطاهای تکراری را پیش از تبدیل شدن به مشکل جدی پیدا کنید. هر چند ماه یک بار هم بکاپ را روی یک سرور آزمایشی بازگردانی کنید تا از سالم بودن آن مطمئن شوید.

اگر هنوز تصمیم نگرفته‌اید سایت را کجا میزبانی کنید، صفحهٔ میزبانی سایت روی سرور مجازی هزینهٔ ماهانه، انتخاب پلن و چک‌لیست انتقال از هاست اشتراکی را یک‌جا آورده است.

سؤالات متداول

آیا نصب وردپرس بدون کنترل‌پنل برای تازه‌کارها سخت است؟

اگر دستورها را به ترتیب اجرا کنید، کل کار کمتر از یک ساعت طول می‌کشد. مزیتش این است که سرور سبک‌تر است و دقیقاً می‌دانید هر بخش چطور کار می‌کند.

MariaDB بهتر است یا MySQL؟

برای وردپرس هر دو به‌خوبی کار می‌کنند و از نظر دستورها تقریباً یکسان‌اند. MariaDB در مخازن اوبونتو در دسترس و نصبش ساده است.

چند سایت وردپرسی را می‌توانم روی یک سرور نصب کنم؟

محدودیت فنی خاصی وجود ندارد؛ برای هر سایت پوشه، دیتابیس، کاربر دیتابیس و بلوک server جداگانه بسازید. تعداد واقعی به منابع سرور و بازدید سایت‌ها بستگی دارد.

خطای 413 Request Entity Too Large هنگام آپلود فایل چیست؟

یعنی حجم فایل از محدودیت Nginx بیشتر است. مقدار client_max_body_size را در بلوک server و مقادیر upload_max_filesize و post_max_size را در php.ini افزایش دهید.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.