راهاندازی وردپرس مولتیسایت (Multisite) روی سرور مجازی و اختصاصی با Nginx

اگر چند سایت وردپرسی دارید که هسته و افزونههای مشترک دارند، نگهداری چند نصب جدا از هم زمان زیادی میگیرد. وردپرس مولتیسایت همان چند سایت را زیر یک نصب و یک پایگاه داده میآورد. این مطلب مراحل راهاندازی وردپرس مولتیسایت روی سرور مجازی یا اختصاصی خودتان را با پیکربندی Nginx نشان میدهد.
مولتیسایت چیست و چه زمانی به آن نیاز دارید
مولتیسایت یک قابلیت داخلی وردپرس است که به یک نصب اجازه میدهد شبکهای از چند سایت را مدیریت کند. همهٔ سایتها هسته و افزونههای یکسانی دارند، اما هرکدام جدولهای دیتابیس، تنظیمات، قالب و کاربران خودش را دارد.
این حالت برای این موقعیتها مناسب است:
- آژانسی که چند سایت کوچک برای مشتریهای مختلف میسازد و نمیخواهد هر بار افزونهها را جدا آپدیت کند.
- برندی با چند زیرسایت منطقهای یا چند زبان که محتوای مشترک دارند.
- دانشگاه یا سازمانی که هر بخش یک زیرسایت مستقل با مدیر خودش میخواهد.
اگر سایتها محصول یا محتوای کاملا متفاوتی دارند و بینشان اشتراکی نیست، نصب جدا معمولا سادهتر است. مولتیسایت برای مدیریت متمرکز طراحی شده، نه برای جمع کردن پروژههای بیربط.
سابدامین یا سابدایرکتوری؛ کدام را انتخاب کنید
قبل از نصب باید یکی از این دو ساختار URL را انتخاب کنید، چون بعدا تغییرش بدون دردسر نیست.
| معیار | سابدامین (site1.example.com) | سابدایرکتوری (example.com/site1) |
|---|---|---|
| نیاز به DNS Wildcard | دارد | ندارد |
| گواهی SSL | باید Wildcard یا SAN باشد | یک گواهی معمولی کافی است |
| مناسب برای | شبکهای که هر سایت باید دامنهٔ اختصاصی بگیرد | شبکهای که همه زیر یک دامنه میمانند |
| تنظیم Nginx | سادهتر، فقط server_name با * | نیاز به چند rewrite اضافه |
اگر سایت اصلی کمتر از یک ماه سن دارد، وردپرس سابدایرکتوری را پیشنهاد میدهد؛ دلیلش محدودیت قدیمی کوکیهاست که دیگر جدی نیست، اما همین الان هم نصبهای تازه را با همین پیام نشان میدهد. برای این مطلب روش سابدامین را مثال میزنیم و تفاوت Nginx را برای سابدایرکتوری هم جدا میآوریم.

سرور مجازی یا اختصاصی: کدام برای مولتیسایت کافی است
یک شبکه با چند سایت کمترافیک روی یک سرور مجازی با منابع متوسط بهراحتی بالا میآید؛ همهٔ سایتها یک پردازش PHP-FPM و یک دیتابیس مشترک دارند، پس بار اضافهشدن هر سایت زیاد نیست. وقتی تعداد سایتها از چند ده بیشتر میشود یا یکی از زیرسایتها ترافیک سنگین میگیرد، منابع اختصاصی یک سرور اختصاصی جلوی تاثیر گرفتن سایتها از هم را میگیرد. شروع با سرور مجازی و ارتقا بعدی، مسیر معمولتر است.
پیشنیازها قبل از شروع
- PHP نسخهٔ پشتیبانیشده و ماژولهای معمول وردپرس (mysqli، curl، gd)
- MySQL یا MariaDB با یک دیتابیس خالی
- Nginx نصبشده و یک نصب تازهٔ وردپرس که هنوز هیچ افزونهای روی آن فعال نشده
- دسترسی root یا sudo برای ویرایش فایلهای تنظیمات سرور
اگر وردپرس را روی یک سایت فعال و در حال کار تبدیل به مولتیسایت میکنید، قبل از شروع یک بکاپ کامل از فایلها و دیتابیس بگیرید؛ این کار برگشتناپذیر نیست اما تنظیمات زیادی تغییر میکند.
فعالسازی مولتیسایت در wp-config.php
خط زیر را بالای wp-config.php، قبل از خط /* That's all, stop editing! */ اضافه کنید:
define( 'WP_ALLOW_MULTISITE', true );
بعد از ذخیره، یک گزینهٔ تازه به نام «Network Setup» زیر منوی Tools در پیشخان وردپرس ظاهر میشود. اینجا هنوز فعلا کاری نمیکنیم، فقط این امکان را باز میکنیم که از پنل مدیریت شبکه بسازیم.
ساخت شبکه از پنل مدیریت
در صفحهٔ Network Setup دو گزینه میبینید: سابدامین یا سابدایرکتوری. بعد از انتخاب و زدن دکمهٔ «Install»، وردپرس چند خط کد تولید میکند که باید دستی در دو فایل قرار بگیرند.
خطهای مربوط به wp-config.php را همانجایی که WP_ALLOW_MULTISITE را گذاشتید اضافه کنید، چیزی شبیه این (مقدارهای واقعی را از خروجی خود وردپرس بردارید):
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', true );
define( 'DOMAIN_CURRENT_SITE', 'example.com' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
خطهای مربوط به .htaccess را برای حالت Nginx نادیده بگیرید؛ معادل آنها را در بخش بعد با پیکربندی Nginx مینویسیم. بعد از ذخیرهٔ فایل باید دوباره وارد وردپرس شوید؛ از این مرحله به بعد یک منوی «My Sites» در بالای صفحه ظاهر میشود.
اگر WP-CLI روی سرور نصب است، همین تبدیل و افزودن زیرسایتهای بعدی با دستورهایی مثل wp core multisite-convert و wp site create هم ممکن است، بدون باز کردن پنل مدیریت؛ راهنمای نصب و مدیریت وردپرس با WP-CLI دستورهای رایج را توضیح میدهد.
تنظیم DNS Wildcard برای سابدامینها
اگر روش سابدامین را انتخاب کردید، باید یک رکورد Wildcard در DNS دامنه اضافه کنید تا هر زیرسایتی که از پنل وردپرس میسازید، بدون برگشتن به DNS بالا بیاید:
*.example.com. A <IP سرور>
بدون این رکورد، هر زیرسایت تازه با خطای DNS باز نمیشود، چون فقط دامنهٔ اصلی و www آن ثبت شدهاند.
پیکربندی Nginx برای مولتیسایت
برای نصب سابدامین، کافی است server_name را با یک Wildcard بنویسید؛ بقیهٔ تنظیمات مثل یک وردپرس معمولی است:
server {
listen 443 ssl;
server_name example.com *.example.com;
root /var/www/example.com;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* ^/wp-content/uploads/sites/[0-9]+/.*\.(jpg|jpeg|png|gif|css|js)$ {
expires 30d;
}
}
برای نصب سابدایرکتوری باید چند rewrite اضافه کنید تا آدرسهای /site1/wp-admin و فایلهای هر زیرسایت به مسیر درست برسند:
location / {
try_files $uri $uri/ /index.php?$args;
}
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) $2 last;
rewrite ^(/[^/]+)?(/.*\.php)$ $2 last;
}
location ~* ^/files/(.*)$ {
rewrite ^/files/(.*)$ /wp-content/blogs.php?file=$1 last;
}
استفاده از if داخل location در Nginx معمولا توصیه نمیشود، اما همین نسخه سالها در مستندات رسمی وردپرس برای Nginx منتشر شده و برای این مورد خاص جواب میدهد. بعد از هر تغییر، پیکربندی را تست و Nginx را ریلود کنید:
nginx -t && systemctl reload nginx
گواهی SSL برای سابدامینهای نامحدود
گواهی SSL معمولی فقط برای یک دامنه یا چند دامنهٔ مشخص صادر میشود، در حالی که در حالت سابدامین نمیدانید چند زیرسایت ساخته خواهد شد. راهحل گواهی Wildcard است که با چالش DNS (نه HTTP) صادر میشود:
certbot certonly --manual --preferred-challenges dns \
-d example.com -d '*.example.com'
این روش به یک رکورد TXT موقت در DNS دامنه نیاز دارد. اگر DNS شما از یک Provider با API پشتیبانیشده توسط Certbot است، از پلاگین DNS همان Provider استفاده کنید تا تمدید گواهی هم خودکار بماند؛ حالت manual را فقط برای تست یا صدور یکباره نگه دارید. برای یک دامنهٔ معمولی بدون نیاز به Wildcard، نصب گواهی SSL رایگان با Let's Encrypt و Certbot مراحل سادهتر چالش HTTP را نشان میدهد.
چند نکته برای افزایش سرعت وردپرس روی شبکهٔ مولتیسایت
چون همه سایتها یک هسته و یک پردازش PHP مشترک دارند، چند تنظیم ساده روی کل شبکه اثر میگذارد:
- یک افزونهٔ کش را Network Activate کنید، نه اینکه هر مدیر زیرسایت افزونهٔ کش خودش را نصب کند؛ تنظیمات پراکنده باعث میشود بعضی زیرسایتها بدون کش بمانند.
- Object Cache با Redis یا Memcached روی مولتیسایت اثرش از یک سایت تکی بیشتر است، چون همهٔ زیرسایتها از همان نمونهٔ کش استفاده میکنند؛ مراحل راهاندازی آن در راهاندازی کش Redis برای وردپرس آمده.
- افزونهها را فقط برای زیرسایتهایی که به آنها نیاز دارند Network Activate کنید، نه همه را برای همه؛ هر افزونهٔ فعال روی هر زیرسایت بار PHP را اضافه میکند.
- اندازهٔ pool پردازش PHP-FPM را با تعداد زیرسایتها و ترافیک واقعی تنظیم کنید، نه مقدار پیشفرض نصب.
سؤالات متداول
تفاوت وردپرس مولتیسایت با نصب چند وردپرس جدا چیست؟ مولتیسایت یک هسته، یک پوشهٔ افزونه و یک دیتابیس مشترک دارد و همهٔ زیرسایتها از یک پنل مدیریت میشوند. چند نصب جدا هرکدام هسته، افزونه و آپدیت مستقل خودشان را دارند.
بعد از نصب میشود از سابدامین به سابدایرکتوری تغییر داد؟ وردپرس راهی رسمی برای این تغییر ندارد. عملا باید شبکهٔ تازه بسازید و محتوای هر سایت را منتقل کنید، پس بهتر است ساختار را از ابتدا درست انتخاب کنید.
برای یک شبکهٔ مولتیسایت کوچک چه منابعی لازم است؟ برای چند زیرسایت کمترافیک، یک پلن متوسط روی سرور مجازی معمولا کافی است. با افزایش تعداد سایتها یا ترافیک یکی از آنها، نیاز به رم و پردازنده بیشتر، یا سرور اختصاصی، بالا میرود.
آیا همهٔ افزونههای وردپرس با مولتیسایت کار میکنند؟ بیشتر افزونهها کار میکنند، اما بعضی که فرض میکنند فقط یک سایت در کار است (مثلا برخی افزونههای کش یا امنیتی قدیمی) باید نسخهٔ Network-aware داشته باشند یا جایگزین شوند. قبل از فعال کردن روی شبکه، در یک زیرسایت تست کنید.
راهاندازی وردپرس مولتیسایت یک بار زمان میبرد، اما بعد از آن آپدیت و مدیریت چند سایت از یک پنل انجام میشود. اگر هنوز روی هاست اشتراکی هستید یا به منابع بیشتری برای این شبکه نیاز دارید، سرور مجازی آریانت دسترسی root و منابع کافی برای این کار را میدهد.




