TürkiyeVPS

نصب وردپرس روی VPS: با Nginx، PHP 8.3 و MariaDB

وردپرس را به صورت دستی روی VPS با Ubuntu 24.04 نصب کنید: نصب Nginx، PHP 8.3-FPM و MariaDB، ساخت پایگاه داده، تنظیمات wp-config، بلوک سرور Nginx، SSL رایگان و اقدامات امنیتی پایه.

7 دقیقه مطالعه

اجرای وردپرس روی VPS شخصی به شما کنترل کامل می‌دهد: نسخه PHP، تنظیمات کش و پیکربندی سرور را خودتان تعیین می‌کنید. در عوض، به‌روزرسانی‌ها، امنیت و پشتیبان‌گیری هم بر عهده خودتان است. در این راهنما پشته LEMP (لینوکس، Nginx، MariaDB، PHP) را روی Ubuntu 24.04 نصب می‌کنیم و وردپرس را منتشر می‌کنیم.

پیش از شروع، رکورد A در DNS دامنه خود را به آدرس IP سرور VPS اشاره دهید؛ در مرحله SSL به آن نیاز داریم. در مثال‌ها از ornek.com استفاده می‌کنیم؛ آن را با دامنه خودتان جایگزین کنید.

۱. Nginx، PHP 8.3 و MariaDB را نصب کنید

با SSH متصل شوید و بسته‌ها را به‌روز کنید. نسخه پیش‌فرض PHP در مخازن Ubuntu 24.04، نسخه 8.3 است:

sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx mariadb-server php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-intl

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

sudo apt install -y php8.3-imagick

بررسی کنید که سرویس‌ها در حال اجرا باشند:

systemctl status nginx php8.3-fpm mariadb --no-pager

۲. MariaDB را ایمن کنید

sudo mariadb-secure-installation

در Ubuntu، کاربر root در MariaDB به طور پیش‌فرض با unix_socket احراز هویت می‌شود؛ یعنی فقط کاربر root سرور می‌تواند با sudo mariadb وارد شود. بنابراین می‌توانید به پرسش‌های «Switch to unix_socket authentication» و «Change the root password» پاسخ n بدهید. به پرسش‌های حذف کاربران ناشناس، غیرفعال کردن ورود راه دور root، حذف پایگاه داده آزمایشی و بارگذاری دوباره جدول‌های دسترسی پاسخ Y بدهید.

۳. پایگاه داده و کاربر بسازید

برای وردپرس یک پایگاه داده جداگانه و کاربری بسازید که فقط به همان پایگاه داده دسترسی داشته باشد:

sudo mariadb
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'GucluBirSifre123!';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

حتماً رمز عبور را با مقداری طولانی و تصادفی که خودتان تعیین می‌کنید جایگزین کنید. برای تولید رمز تصادفی می‌توانید از دستور openssl rand -base64 24 استفاده کنید.

۴. وردپرس را دانلود کنید و مجوزها را تنظیم کنید

جدیدترین نسخه را مستقیماً از wordpress.org دانلود کنید:

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

اینکه مالک فایل‌ها www-data باشد، به وردپرس اجازه می‌دهد از پیشخوان افزونه و پوسته نصب کند و به‌روزرسانی‌ها را خودش انجام دهد. مجوز 755 برای پوشه‌ها و 644 برای فایل‌ها مقادیری است که وردپرس توصیه می‌کند؛ هرگز به فایل‌ها مجوز 777 ندهید.

۵. فایل wp-config.php را آماده کنید

cd /var/www/ornek.com
sudo cp wp-config-sample.php wp-config.php
sudo nano wp-config.php

سطرهای پایگاه داده را با اطلاعاتی که در مرحله ۳ ساختید پر کنید:

define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', 'GucluBirSifre123!' );
define( 'DB_HOST', 'localhost' );

در همین فایل، بخش هشت‌سطری کلیدهای امنیتی (AUTH_KEY، SECURE_AUTH_KEY و غیره) را با مقادیر یکتا جایگزین کنید. مقادیر تازه را می‌توانید از سرویس رسمی وردپرس بگیرید:

curl -s https://api.wordpress.org/secret-key/1.1/salt/

خروجی را کپی کنید و به جای سطرهایی که عبارت put your unique phrase here دارند بچسبانید. سپس این سطر را بالای سطر /* That's all, stop editing! */ اضافه کنید؛ ویرایشگر فایل پوسته‌ها و افزونه‌ها را در پیشخوان غیرفعال می‌کند:

define( 'DISALLOW_FILE_EDIT', true );

مالک و مجوز فایل را اصلاح کنید:

sudo chown www-data:www-data wp-config.php
sudo chmod 640 wp-config.php

۶. محدودیت‌های آپلود PHP را افزایش دهید

محدودیت پیش‌فرض آپلود فایل در PHP دو مگابایت است و با نخستین آپلود پوسته یا تصویر بزرگ مشکل ایجاد می‌کند. به جای ویرایش فایل اصلی php.ini، ساختن یک فایل تنظیمات جداگانه حفظ تغییرات شما را در به‌روزرسانی‌ها آسان‌تر می‌کند:

sudo nano /etc/php/8.3/fpm/conf.d/99-wordpress.ini
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 120
sudo systemctl restart php8.3-fpm

۷. بلوک سرور Nginx را بنویسید

sudo nano /etc/nginx/sites-available/ornek.com
server {
    listen 80;
    server_name ornek.com www.ornek.com;
    root /var/www/ornek.com;
    index index.php index.html;

    client_max_body_size 64M;

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

    location = /xmlrpc.php {
        deny all;
    }

    location ~* /wp-content/uploads/.*\.php$ {
        deny all;
    }

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

    location ~ /\.(?!well-known) {
        deny all;
    }

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

نکات مهم:

  • try_files $uri $uri/ /index.php?$args: اگر فایل واقعی وجود نداشته باشد، درخواست به وردپرس سپرده می‌شود. کار کردن پیوندهای یکتا (مانند /blog/yazi-adi) به همین سطر وابسته است.
  • fastcgi_pass: درخواست‌های PHP را به سوکت PHP 8.3-FPM می‌فرستد. نام سوکت باید با نسخه PHP یکسان باشد.
  • مسدود کردن PHP در پوشه uploads: حتی اگر به دلیل یک حفره، فایل PHP در پوشه آپلودها قرار داده شود، اجرا نمی‌شود. چون Nginx بلوک‌های عبارت منظم را از بالا به پایین امتحان می‌کند، این بلوک باید پیش از بلوک عمومی \.php$ بیاید.
  • xmlrpc.php: اغلب در حملات حدس رمز (brute force) استفاده می‌شود. اگر از ابزاری مانند Jetpack یا اپلیکیشن موبایل وردپرس استفاده می‌کنید که به XML-RPC نیاز دارد، این بلوک را حذف کنید.

سایت را فعال کنید:

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

۸. فایروال و SSL

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

یک گواهی SSL رایگان از Let's Encrypt بگیرید:

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

بهتر است SSL را پیش از اجرای ویزارد نصب وردپرس راه‌اندازی کنید؛ به این ترتیب وردپرس نشانی سایت را از همان ابتدا با https:// ذخیره می‌کند و بعداً لازم نیست نشانی را تغییر دهید.

۹. ویزارد نصب را کامل کنید

در مرورگر به https://ornek.com بروید. مراحل انتخاب زبان، عنوان سایت، نام کاربری مدیر، رمز عبور و ایمیل را کامل کنید. برای مدیر نام کاربری قابل حدسی مثل admin انتخاب نکنید و از رمز عبور قوی استفاده کنید.

امنیت و نگهداری پایه

  • به‌روزرسانی‌ها: هسته وردپرس، پوسته‌ها و افزونه‌ها را به‌روز نگه دارید. افزونه‌ها و پوسته‌هایی را که استفاده نمی‌کنید فقط غیرفعال نکنید، حذف کنید.
  • به‌روزرسانی سرور: بسته‌های Ubuntu را به طور منظم به‌روز کنید. برای مراحلی مانند کلید SSH، غیرفعال کردن ورود root و Fail2ban، راهنمای امنیت سرور لینوکس را ببینید.
  • تلاش‌های ورود: استفاده از افزونه‌ای که تلاش‌های حدس رمز در صفحه ورود را محدود می‌کند و همچنین احراز هویت دومرحله‌ای را در نظر بگیرید.
  • پشتیبان‌گیری: از پایگاه داده و پوشه wp-content به طور منظم پشتیبان بگیرید و پشتیبان‌ها را بیرون از سرور نگه دارید:
sudo mariadb-dump wordpress | gzip > ~/wordpress-db-$(date +%F).sql.gz
sudo tar czf ~/wordpress-dosyalar-$(date +%F).tar.gz -C /var/www/ornek.com wp-content wp-config.php

اگر نمی‌خواهید سرور را مدیریت کنید

مدیریت VPS شخصی آموزنده است، اما هر کسب‌وکاری وقت آن را ندارد. اگر هدف شما فقط انتشار یک سایت وردپرسی است، دو گزینه دیگر وجود دارد:

  • هاست وردپرس: روی دیسک NVMe اجرا می‌شود؛ پس از پرداخت، تیم ما وردپرس را نصب می‌کند و سایت را آماده استفاده به شما تحویل می‌دهد.
  • هاست وب: با کنترل پنل اختصاصی، phpMyAdmin و مدیر فایل ارائه می‌شود و از PHP 8.3 و MariaDB پشتیبانی می‌کند. قیمت‌های به‌روز (به دلار آمریکا) در صفحه بسته درج شده است. اگر می‌خواهید تفاوت‌ها را بدانید، مقاله هاست وب چیست را بخوانید.

اگر می‌خواهید چند سایت، تنظیمات اختصاصی PHP یا برنامه‌های دیگری غیر از وردپرس اجرا کنید، یک VPS با دسترسی root انعطاف بیشتری به شما می‌دهد.

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

پیوندهای یکتا خطای 404 می‌دهند؛ چرا؟

Nginx فایل .htaccess مربوط به Apache را نمی‌خواند. مطمئن شوید سطر try_files $uri $uri/ /index.php?$args; داخل location / در بلوک سرور وجود دارد، سپس sudo nginx -t و sudo systemctl reload nginx را اجرا کنید.

پیام «خطا در برقراری ارتباط با پایگاه داده» می‌گیرم؛ چه کنم؟

بررسی کنید که مقادیر DB_NAME، DB_USER و DB_PASSWORD در wp-config.php دقیقاً با مقادیری که در مرحله ۳ ساختید یکسان باشند و MariaDB در حال اجرا باشد (systemctl status mariadb).

هنگام نصب افزونه، اطلاعات FTP خواسته می‌شود؛ چرا؟

وردپرس وقتی نتواند روی فایل‌ها بنویسد، اطلاعات FTP می‌خواهد. بررسی کنید که مالک پوشه سایت www-data باشد: sudo chown -R www-data:www-data /var/www/ornek.com.

هنگام آپلود فایل خطای «413 Request Entity Too Large» می‌گیرم.

این خطا از Nginx است. مقدار client_max_body_size را در بلوک سرور، همراه با upload_max_filesize و post_max_size در PHP افزایش دهید، سپس Nginx و PHP-FPM را دوباره بارگذاری کنید.

آیا می‌توانم چند سایت وردپرسی را روی یک VPS اجرا کنم؟

بله. کافی است برای هر سایت یک پایگاه داده و کاربر جداگانه، یک پوشه جداگانه (مانند /var/www/site2.com) و یک بلوک سرور Nginx جداگانه بسازید.