نصب وردپرس روی سرور مجازی بدون کنترل پنل به دانستن چند مرحله نیاز دارد، ولی در عوض سرور سبک تر است، هزینه لایسنس پنل ندارد و همه چیز را خودتان کنترل می کنید. استک رایج 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 چیست آمده است.
منابع و مستندات رسمی
- راهنمای رسمی WordPress برای امن سازی
- راهنمای رسمی WordPress برای تنظیم Nginx
- مستندات رسمی Let’s Encrypt برای شروع کار
اجرای وردپرس در کانتینر هم ممکن است؛ در راه اندازی داکر توضیح داده شده است.
اگر ترجیح می دهید راه اندازی وردپرس روی سرور، تنظیم Nginx، SSL، کش، بکاپ و امن سازی را تیم دیگری انجام دهد، نصب، کش، SSL و بکاپ بخشی از مدیریت سرور لینوکس است. برای جابجایی سایت از هاست قبلی هم انتقال هاست و سرور کمترین قطعی را دارد.



