ورود به پنل ثبت‌ نام

آموزش نصب وردپرس روی سرور اوبونتو با Nginx

راهنمای گام‌به‌گام نصب وردپرس روی سرور اوبونتو با Nginx، پایگاه داده MariaDB، PHP-FPM و گواهی SSL رایگان تا یک سایت آماده و امن داشته باشید.

تیم ابر سپهر 13 دقیقه مطالعه
آموزش نصب وردپرس روی سرور اوبونتو با Nginx
در این مقاله

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

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

در این آموزش از پشتهٔ LEMP استفاده می‌کنیم: وب‌سرور Nginx به‌جای Apache برای سبک‌تر بودن مصرف حافظه، پایگاه داده MariaDB به‌عنوان جایگزین سازگار MySQL، و PHP-FPM برای اجرای کدهای وردپرس. همهٔ دستورها روی Ubuntu 24.04 LTS آزمایش شده‌اند.

پیش‌نیازها

  • یک سرور ابری با Ubuntu 24.04 LTS و دسترسی root.
  • یک دامنه یا سابدامین (مثلاً site.domain.com) که با یک رکورد A به آی‌پی سرور اشاره کند. پیش از صدور گواهی SSL باید این رکورد در DNS منتشر شده باشد؛ وگرنه مرحلهٔ گواهی شکست می‌خورد.
  • برای یک سایت معمولی، سروری با ۱ هسته پردازنده و ۲ گیگابایت حافظه نقطهٔ شروع مناسبی است. برای فروشگاه‌های پربازدید یا افزونه‌های سنگین، حافظه را بالاتر ببرید.

اگر هنوز سروری ندارید، می‌توانید از صفحهٔ خرید سرور ابری با کمترین منابع شروع کنید و بعداً منابع را ارتقا دهید. تمام دستورهای این راهنما با کاربر root اجرا می‌شوند؛ اگر با کاربر عادی کار می‌کنید، پیش از هر دستور sudo بگذارید.

گام ۱: به‌روزرسانی سیستم

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

apt update && apt upgrade -y

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

گام ۲: نصب Nginx

وب‌سرور Nginx را نصب و سرویس آن را فعال می‌کنیم:

apt install -y nginx
systemctl enable --now nginx

فلگ --now باعث می‌شود سرویس هم بلافاصله اجرا شود و هم بعد از ریبوت خودکار بالا بیاید. اگر آی‌پی سرور را در مرورگر باز کنید، باید صفحهٔ پیش‌فرض Nginx را ببینید؛ این یعنی وب‌سرور درست کار می‌کند و آمادهٔ پیکربندی برای وردپرس است.

گام ۳: نصب و امن‌سازی MariaDB

پایگاه داده MariaDB را نصب می‌کنیم. وردپرس محتوا، کاربران و تنظیمات را در همین پایگاه داده نگه می‌دارد:

apt install -y mariadb-server
systemctl enable --now mariadb

سپس اسکریپت امن‌سازی را اجرا می‌کنیم تا حساب‌های آزمایشی و دسترسی‌های ناامن پیش‌فرض حذف شوند:

mariadb-secure-installation

در پاسخ به پرسش‌ها، تنظیم رمز root، حذف کاربر ناشناس (anonymous)، غیرفعال کردن ورود root از راه دور و حذف پایگاه دادهٔ تست را بپذیرید. این مرحله ظاهراً کم‌اهمیت است اما همان چیزی است که جلوی بخش بزرگی از حملات خودکار به پایگاه داده را می‌گیرد.

گام ۴: ساخت پایگاه داده و کاربر وردپرس

به کنسول MariaDB وارد می‌شویم:

mariadb

و برای وردپرس یک پایگاه داده و یک کاربر اختصاصی می‌سازیم. رمز strong_password را حتماً با یک رمز قوی جایگزین کنید:

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

نکتهٔ مهم اینجاست که کاربر را با 'wpuser'@'localhost' می‌سازیم؛ یعنی این کاربر فقط از روی خود سرور می‌تواند به پایگاه داده وصل شود، نه از اینترنت. همچنین GRANT را تنها روی پایگاه دادهٔ wordpress می‌دهیم، نه روی همهٔ پایگاه‌ها؛ اگر روزی این اعتبارنامه لو برود، دامنهٔ خسارت محدود می‌ماند. کدگذاری utf8mb4 هم برای پشتیبانی درست از فارسی و ایموجی ضروری است.

گام ۵: نصب PHP-FPM و افزونه‌های موردنیاز

مخازن پیش‌فرض Ubuntu 24.04 نسخهٔ PHP 8.3 را ارائه می‌دهند. برای نصب PHP 8.5 ابتدا مخزن معتبر ondrej/php را اضافه می‌کنیم:

apt install -y software-properties-common
add-apt-repository -y ppa:ondrej/php
apt update

سپس PHP-FPM و افزونه‌هایی را که وردپرس به آن‌ها نیاز دارد نصب می‌کنیم:

apt install -y php8.5-fpm php8.5-mysql php8.5-curl php8.5-gd \
  php8.5-mbstring php8.5-xml php8.5-zip php8.5-intl

هر افزونه نقشی دارد: php8.5-mysql برای ارتباط با پایگاه داده، php8.5-gd برای پردازش تصویر، php8.5-curl برای فراخوانی سرویس‌های بیرونی و به‌روزرسانی‌ها، php8.5-mbstring و php8.5-intl برای مدیریت درست متن فارسی، و php8.5-zip برای نصب افزونه و قالب از داخل پیشخوان. نبود هر کدام باعث می‌شود وردپرس در نصب یا هنگام کار هشدار «افزونهٔ لازم موجود نیست» بدهد.

برای اینکه بارگذاری رسانه و افزونه با محدودیت مواجه نشود، چند مقدار پیش‌فرض PHP را افزایش می‌دهیم. فایل تنظیمات را باز کنید:

nano /etc/php/8.5/fpm/php.ini

و این مقادیر را پیدا و اصلاح کنید:

upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 120

سپس PHP-FPM را ری‌استارت کنید تا تغییرها اعمال شوند:

systemctl restart php8.5-fpm

مقدار پیش‌فرض upload_max_filesize روی ۲ مگابایت است؛ بدون افزایش آن، آپلود قالب یا تصویر با حجم معمولی هم ناتمام می‌ماند و پیام خطای مبهمی می‌گیرید.

گام ۶: دانلود و استقرار فایل‌های وردپرس

آخرین نسخهٔ وردپرس را از سایت رسمی دریافت و استخراج می‌کنیم:

cd /tmp
curl -O https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz

فایل‌ها را به مسیر ریشهٔ سایت منتقل می‌کنیم:

mkdir -p /var/www/wordpress
cp -a /tmp/wordpress/. /var/www/wordpress/

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

chown -R www-data:www-data /var/www/wordpress
find /var/www/wordpress -type d -exec chmod 755 {} \;
find /var/www/wordpress -type f -exec chmod 644 {} \;

کاربر www-data همان کاربری است که Nginx و PHP-FPM با آن اجرا می‌شوند. دسترسی 755 برای پوشه‌ها و 644 برای فایل‌ها حداقل مجوز لازم است؛ دادن مجوز 777 که گاهی در آموزش‌های نادرست دیده می‌شود، عملاً درِ سرور را به روی هر کاربر دیگری باز می‌کند و باید از آن پرهیز کرد.

گام ۷: پیکربندی wp-config.php

وردپرس اطلاعات اتصال به پایگاه داده را از فایل wp-config.php می‌خواند. از روی نمونه یک نسخه می‌سازیم:

cd /var/www/wordpress
cp wp-config-sample.php wp-config.php
nano wp-config.php

مقادیر مربوط به پایگاه داده را با همان چیزی که در گام چهارم ساختید هماهنگ کنید:

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

بخش کلیدهای امنیتی (Authentication Unique Keys and Salts) را هم باید با مقادیر تصادفی پر کنید. وردپرس یک سرویس رسمی برای تولید این کلیدها دارد:

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

خروجی این دستور را جایگزین بخش کلیدهای پیش‌فرض در wp-config.php کنید. این کلیدها کوکی‌های ورود کاربران را رمزنگاری می‌کنند؛ اگر آن‌ها را روی مقدار پیش‌فرض رها کنید، نشست‌های ورود در برابر جعل آسیب‌پذیر می‌شوند.

گام ۸: تعریف بلوک سرور در Nginx

حالا به Nginx می‌گوییم چطور درخواست‌های این دامنه را به وردپرس تحویل دهد. فایل پیکربندی سایت را می‌سازیم:

nano /etc/nginx/sites-available/wordpress

و محتوای زیر را در آن قرار می‌دهیم. به‌جای site.domain.com دامنهٔ خودتان را بگذارید:

server {
    listen 80;
    server_name site.domain.com;
    root /var/www/wordpress;
    index index.php;

    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.5-fpm.sock;
    }

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

چند نکته دربارهٔ این پیکربندی:

  • try_files $uri $uri/ /index.php?$args قلب پیوندهای یکتای (Permalink) وردپرس است؛ اگر آدرسی به فایل واقعی نرسد، درخواست به index.php سپرده می‌شود تا وردپرس آن را مسیریابی کند. بدون این خط، فقط صفحهٔ اصلی کار می‌کند و بقیهٔ صفحه‌ها خطای ۴۰۴ می‌دهند.
  • fastcgi_pass باید دقیقاً به سوکت نسخهٔ PHP نصب‌شده اشاره کند (php8.5-fpm.sock). اگر نسخهٔ PHP متفاوت باشد، این مسیر را هماهنگ کنید وگرنه با خطای «502 Bad Gateway» روبه‌رو می‌شوید.
  • location ~ /\.ht دسترسی به فایل‌های حساس .ht* را می‌بندد.
  • client_max_body_size 64M باید با مقدار PHP در گام پنجم هماهنگ باشد؛ اگر فقط یکی را زیاد کنید، سقف واقعی آپلود همان مقدار کوچک‌تر باقی می‌ماند.

سپس سایت را فعال، پیکربندی پیش‌فرض را غیرفعال و تنظیمات را بررسی می‌کنیم:

ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx

دستور nginx -t پیش از reload، درستی فایل پیکربندی را می‌سنجد؛ همیشه پیش از بارگذاری مجدد آن را اجرا کنید تا یک خطای تایپی سرویس را از کار نیندازد.

گام ۹: تنظیم فایروال

فایروال UFW را نصب و قواعد آن را تعریف می‌کنیم:

apt install -y ufw
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable

قاعدهٔ Nginx Full هر دو پورت ۸۰ و ۴۴۳ را باز می‌کند تا هم HTTP و هم HTTPS در دسترس باشند. پورت پایگاه داده را باز نمی‌کنیم، چون در گام چهارم دسترسی را به localhost محدود کردیم و MariaDB نباید از بیرون قابل دسترس باشد.

پیش از اجرای ufw enable مطمئن شوید قاعدهٔ OpenSSH را اضافه کرده‌اید، وگرنه ارتباط SSH فعلی شما بلافاصله قطع می‌شود و راه بازگشت نخواهید داشت. اگر این اتفاق افتاد، از کنسول تحت وب کنترل پنل ابر سپهر وارد سرور شوید و قاعده را اضافه کنید.

گام ۱۰: فعال‌سازی SSL با Let's Encrypt

برای اینکه سایت روی HTTPS اجرا شود، Certbot را نصب و یک گواهی رایگان صادر می‌کنیم:

apt install -y certbot python3-certbot-nginx
certbot --nginx -d site.domain.com

Certbot ایمیل و پذیرش شرایط را می‌پرسد، گواهی را صادر می‌کند و خودش فایل Nginx را برای HTTPS و ریدایرکت خودکار پورت ۸۰ به ۴۴۳ ویرایش می‌کند. تمدید خودکار گواهی هم با یک تایمر systemd انجام می‌شود؛ برای آزمودن آن:

certbot renew --dry-run

اکنون آدرس https://site.domain.com را در مرورگر باز کنید. جادوگر نصب وردپرس ظاهر می‌شود و از شما زبان، عنوان سایت و مشخصات کاربر مدیر را می‌پرسد. برای نام کاربری مدیر از admin استفاده نکنید و رمز قوی انتخاب کنید؛ بخش بزرگی از حملات brute-force دقیقاً نام کاربری admin را هدف می‌گیرند.

اگر با مفاهیم Nginx و پراکسی معکوس بیشتر آشنا نیستید، مقالهٔ آموزش نصب n8n روی سرور با داکر و Nginx همین الگوی وب‌سرور و گواهی SSL را در یک سناریوی دیگر شرح می‌دهد.

نگهداری: به‌روزرسانی و بک‌آپ

به‌روزرسانی وردپرس، قالب‌ها و افزونه‌ها را می‌توانید مستقیم از پیشخوان انجام دهید؛ چون در گام ششم مالکیت فایل‌ها را به www-data دادیم، وردپرس اجازهٔ نوشتن دارد و نیازی به کار دستی نیست. با این حال، به‌روز نگه‌داشتن خود سیستم‌عامل هم ضروری است:

apt update && apt upgrade -y

بک‌آپ یک سایت وردپرس دو بخش دارد: فایل‌ها و پایگاه داده. برای پایگاه داده از mysqldump استفاده می‌کنیم:

mariadb-dump -u wpuser -p wordpress > /root/wordpress-db-$(date +%F).sql

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

tar czf /root/wordpress-files-$(date +%F).tar.gz -C /var/www wordpress

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

کار دستور / ابزار چه زمانی
بک‌آپ پایگاه داده mariadb-dump ... > backup.sql پیش از هر تغییر
بک‌آپ فایل‌ها tar czf ... هفتگی
مشاهدهٔ خطاهای PHP tail -f /var/log/nginx/error.log هنگام عیب‌یابی
ری‌استارت PHP systemctl restart php8.5-fpm پس از تغییر php.ini
بک‌آپ کامل سرور اسنپ‌شات کنترل پنل پیش از هر تغییر پرخطر

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

جمع‌بندی

در این راهنما مرحله‌به‌مرحله به آموزش نصب وردپرس بر روی سرور ubuntu پرداختیم: از نصب پشتهٔ LEMP و ساخت پایگاه داده تا امن‌سازی سایت با گواهی رایگان Let's Encrypt. با یک سرور ابری کوچک هم می‌توانید در کمتر از نیم‌ساعت یک وردپرس امن و پایدار داشته باشید.

سه تصمیمی که بیشترین تفاوت را می‌سازند: محدود کردن دسترسی کاربر پایگاه داده به localhost، تنظیم درست مالکیت و مجوز فایل‌ها برای کاربر www-data، و گرفتن اسنپ‌شات پیش از هر به‌روزرسانی. اگر هنوز سروری برای این کار ندارید، می‌توانید از صفحهٔ خرید سرور ابری با کمترین منابع شروع کنید و هر زمان که ترافیک سایت بیشتر شد، منابع را ارتقا دهید.

مقالات مرتبط