پیکوسیستم خدمات فنی IT

نصب وردپرس روی سرور مجازی: راه اندازی LEMP با Nginx، MariaDB و PHP-FPM

راه اندازی وردپرس روی سرور مجازی لینوکس با استک LEMP: نصب Nginx، MariaDB و PHP-FPM، ساخت دیتابیس و کاربر، دانلود وردپرس، مجوزهای فایل، تنظیم Nginx، SSL و نکات امنیتی و بکاپ بعد از نصب.

نصب وردپرس روی سرور مجازی: راه اندازی LEMP با Nginx، MariaDB و PHP-FPM

نصب وردپرس روی سرور مجازی بدون کنترل پنل به دانستن چند مرحله نیاز دارد، ولی در عوض سرور سبک تر است، هزینه لایسنس پنل ندارد و همه چیز را خودتان کنترل می کنید. استک رایج LEMP نام دارد: Linux، Nginx (تلفظ «اِنجین اِکس»)، MariaDB (یا MySQL) و PHP-FPM. اگر مدیریت چند سایت با رابط گرافیکی می خواهید، کنترل پنل مثل DirectAdmin انتخاب بهتری است؛ مقایسه آن ها در سی پنل یا دایرکت ادمین آمده.

فرض این مقاله سرور Ubuntu LTS تازه نصب است که با SSH و کاربر غیر root وارد آن شده اید (مراحل اولیه در آموزش نصب Ubuntu Server و SSH چیست) و دامنه به IP سرور اشاره می کند.

مرحله 1: نصب Nginx، MariaDB و PHP

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

دستور آخر رمز root دیتابیس را تنظیم می کند و کاربران ناشناس و دیتابیس تست را حذف می کند. جزئیات Nginx در نصب Nginx روی اوبونتو آمده است. نسخه PHP نصب شده را با php -v ببینید؛ وردپرس نسخه های پشتیبانی شده PHP را در سایت رسمی اعلام می کند.

مرحله 2: ساخت دیتابیس و کاربر

sudo mysql
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

رمز را تصادفی و بلند بگذارید و جایی امن ذخیره کنید. کاربر وردپرس فقط به دیتابیس خودش دسترسی دارد؛ از کاربر root دیتابیس برای وردپرس استفاده نکنید. اگر چند سایت دارید، برای هرکدام دیتابیس و کاربر جدا بسازید تا نفوذ به یک سایت به بقیه نرسد.

مرحله 3: دانلود وردپرس

cd /tmp
curl -O https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
sudo mkdir -p /var/www/example.com
sudo cp -a 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 (کاربر Nginx و PHP-FPM) بگذارید تا وردپرس بتواند افزونه و آپلود را مدیریت کند. مجوز پوشه ها 755 و فایل ها 644 است. فایل پیکربندی را بعداً محدودتر می کنیم.

مرحله 4: تنظیم wp-config.php

cd /var/www/example.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', 'a-long-random-password' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );

بخش کلیدهای امنیتی (salts) را با مقدارهای تازه از https://api.wordpress.org/secret-key/1.1/salt/ پر کنید. سپس مجوز فایل را محدود کنید:

sudo chmod 640 wp-config.php

اگر سایت پشت HTTPS است و می خواهید ویرایش فایل ها از داخل پیشخوان بسته شود، دو خط define( 'DISALLOW_FILE_EDIT', true ); را هم اضافه کنید. این کار جلوی تغییر کد توسط حساب مدیر هک شده را می گیرد.

مرحله 5: تنظیم Nginx

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php;

    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 { deny all; }
    location = /xmlrpc.php { deny all; }

    client_max_body_size 64M;
}

فایل را در /etc/nginx/sites-available/example.com بگذارید، به sites-enabled لینک کنید و sudo nginx -t && sudo systemctl reload nginx را اجرا کنید. مسیر سوکت را با نسخه PHP سرورتان تطبیق دهید. خط xmlrpc.php را اگر افزونه ای (مثل اپلیکیشن موبایل وردپرس یا Jetpack) به آن نیاز ندارد ببندید، چون هدف رایج حمله حدس رمز است. client_max_body_size حداکثر حجم آپلود را مشخص می کند و باید با upload_max_filesize و post_max_size در تنظیمات PHP هماهنگ باشد.

مرحله 6: SSL و نصب نهایی

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

مراحل و خطاهای گواهی در نصب SSL روی سرور آمده است. بعد از آن، آدرس سایت را در مرورگر باز کنید. صفحه نصب وردپرس زبان، نام سایت و حساب مدیر را می پرسد. نام کاربری admin را برای مدیر انتخاب نکنید و رمز قوی بگذارید. در بخش تنظیمات و بعد General، هر دو آدرس وردپرس و سایت باید با https شروع شوند.

WP-CLI برای مدیریت راحت تر

WP-CLI ابزار خط فرمان وردپرس است و کارهای تکراری را سریع می کند:

wp core update
wp plugin update --all
wp user list
wp db export backup.sql

با آن می شود به روزرسانی ها، ساخت کاربر و بکاپ دیتابیس را اسکریپت کرد، بدون ورود به پیشخوان.

امنیت و نگه داری بعد از نصب

  • وردپرس، قالب و افزونه ها را به روز نگه دارید. بیشتر سایت های وردپرسی از طریق افزونه آسیب پذیر هک می شوند. افزونه هایی که استفاده نمی شوند را حذف کنید، چون فایل افزونه غیرفعال هم می تواند آسیب پذیر بماند.
  • افزونه و قالب را فقط از منبع رسمی بگیرید. نسخه کرک شده یکی از رایج ترین مسیرهای آلودگی است.
  • احراز هویت دومرحله ای برای حساب مدیر فعال کنید و تعداد تلاش ورود را محدود کنید (با افزونه یا Fail2ban).
  • بکاپ خودکار از فایل ها و دیتابیس، با کپی بیرون از سرور و تست بازیابی (بکاپ گیری از سرور).
  • کش را فعال کنید. کش صفحه با FastCGI cache در Nginx یا افزونه کش، سرعت را چند برابر می کند. اگر سایت کند است، افزایش سرعت سرور مجازی علت یابی را توضیح می دهد.
  • اگر سایت رفتار مشکوک دارد، نشانه ها در علائم هک شدن سایت آمده و بررسی هک در پاکسازی سایت هک شده انجام می شود.

مشکل های رایج

  • صفحه ایی سفید یا خطای 500: لاگ /var/log/nginx/error.log و لاگ PHP-FPM را ببینید. معمولاً افزونه سازگار نیست یا حافظه PHP کم است.
  • Error establishing a database connection: اطلاعات wp-config.php یا سرویس MariaDB را چک کنید (systemctl status mariadb).
  • لینک های داخلی 404 می دهند: بخش try_files یا ساخت دوباره permalinkها از تنظیمات وردپرس.
  • آپلود فایل خطای 413 می دهد: client_max_body_size کوچک است.
  • افزونه نصب نمی شود: مالک فایل ها www-data نیست.

کش صفحه با FastCGI cache در Nginx

وردپرس برای هر بازدید PHP اجرا می کند و از دیتابیس می خواند. کش صفحه نسخه آماده HTML را ذخیره می کند و Nginx بدون PHP تحویل می دهد. تنظیم پایه:

# در بلوک http
fastcgi_cache_path /var/cache/nginx/wp levels=1:2 keys_zone=WPCACHE:50m max_size=500m inactive=60m;

# داخل server
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($request_uri ~* "/wp-admin/|/wp-login.php|/cart|/checkout") { set $skip_cache 1; }
if ($http_cookie ~* "wordpress_logged_in|comment_author") { set $skip_cache 1; }

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_cache WPCACHE;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_valid 200 30m;
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;
}

این تنظیم کاربران وارد شده، سفارش ها و صفحه مدیریت را از کش مستثنی می کند. بعد از هر تغییر محتوا کش باید پاک شود (با افزونه ای مثل Nginx Helper یا پاک کردن پوشه کش). اگر سایت فروشگاهی است، مسیرهای سبد خرید و حساب کاربری را حتماً در شرط ها بگذارید، وگرنه کاربران صفحه یکدیگر را می بینند. اصل کش و دلیل آن در CDN چیست هم آمده است.

Redis برای object cache

وردپرس نتیجه کوئری های تکراری را می تواند در Redis نگه دارد تا دیتابیس کمتر بار بکشد:

sudo apt install redis-server php-redis
sudo systemctl enable --now redis-server
wp plugin install redis-cache --activate
wp redis enable

این کار روی سایت های پرکوئری (فروشگاه، عضویت) اثر واضح دارد. روی سایت ساده شرکتی اثرش کم است و لازم نیست. Redis را فقط روی localhost گوش بدهید و از اینترنت ببندید.

به روزرسانی بدون ترس: محیط تست

به روزرسانی افزونه روی سایتی که فروش می کند، ریسک دارد. یک محیط تست (staging) روی همان سرور یا سرور دیگر بسازید: کپی فایل ها و دیتابیس به زیردامنه مثل staging.example.com (که با رمز یا IP محدود شود و ایندکس نشود). به روزرسانی را اول آنجا امتحان کنید، بعد روی سایت اصلی اعمال کنید. قبل از هر به روزرسانی روی سایت اصلی از فایل ها و دیتابیس بکاپ بگیرید (بکاپ گیری از سرور).

کرون وردپرس

وردپرس به صورت پیش فرض کارهای زمان بندی شده را با هر بازدید بررسی می کند (WP-Cron). در سایت پربازدید این بار اضافه است و در سایت کم بازدید ممکن است کارها دیر اجرا شوند. بهتر است آن را غیرفعال و با کرون واقعی سرور جایگزین کنید:

# در wp-config.php
define( 'DISABLE_WP_CRON', true );

# در crontab کاربر www-data
*/5 * * * * cd /var/www/example.com && wp cron event run --due-now --quiet

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

جزئیات نصب و تنظیم دیتابیس در نصب MySQL روی اوبونتو بیشتر آمده است.

برای ورود مدیر سایت، احراز هویت دو مرحله ای را فعال کنید.

کش اشیا برای سرعت وردپرس در Redis چیست توضیح داده شده است.

اجرای وردپرس و دیتابیس با Compose هم در Docker Compose چیست آمده است.

منابع و مستندات رسمی

اجرای وردپرس در کانتینر هم ممکن است؛ در راه اندازی داکر توضیح داده شده است.

اگر ترجیح می دهید راه اندازی وردپرس روی سرور، تنظیم Nginx، SSL، کش، بکاپ و امن سازی را تیم دیگری انجام دهد، نصب، کش، SSL و بکاپ بخشی از مدیریت سرور لینوکس است. برای جابجایی سایت از هاست قبلی هم انتقال هاست و سرور کمترین قطعی را دارد.

نحوه تهیه مقاله ها

استعلام

کارتان را بگویید، مسیر و هزینه را می گوییم

چند خط درباره وضعیت فعلی و چیزی که می خواهید بنویسید. یک مهندس خودش با شما تماس می گیرد و درخواست به واحد فروش نمی رود.

  1. 01درخواست را می خوانیم و اگر ابهامی بود تماس می گیریم.
  2. 02در صورت نیاز، بررسی اولیه ریموت یا بازدید انجام می شود.
  3. 03پیشنهاد مکتوب با دامنه کار، زمان بندی و هزینه می فرستیم.

اطلاعات شما فقط برای پاسخ به همین درخواست استفاده می شود. حریم خصوصی