ساخت آینه داخلی سایت با همگامسازی خودکار rsync (نسخه فقط خواندنی)

در معماری دومسیره، سختترین بخش تنظیم DNS نیست؛ همگام نگه داشتن دو نسخه از سایت است. اینجا یک آینه فقط خواندنی میسازیم که خودش را بهروز نگه میدارد.
۲۵٪تخفیفسرور اختصاصی اوپال ۲، پلاتینیوم ۳، آمتیس ۲ایران سرور · بدون تاریخ انقضافقط برای پلنهای «اوپال 2»، «پلاتینیوم 3» و «آمتیس2» سرور اختصاصی ایران (پلنهای استاندارد)IranDedicated📋 فهرست مطالب (۱۴ بخش)
- اول یک تصمیمِ سخت: آینه نوشتن هم بپذیرد یا نه؟
- گام ۱: ارتباطِ بیرمز بین دو سرور
- گام ۲: همگامسازیِ فایلها
- گام ۳: همگامسازیِ پایگاه داده
- گام ۴: قفل کردنِ نوشتن روی آینه
- گام ۵: زمانبندی
- گام ۶: پایش — بخشی که همه فراموش میکنند
- چه چیزهایی را نباید همگام کرد
- تمرینِ بحران — سالی دو بار
- رفعِ مشکلاتِ رایج
- همگامسازی اجرا میشود اما چیزی منتقل نمیشود
- سایتِ آینه خطای اتصال به پایگاه داده میدهد
- تصاویر روی آینه باز نمیشوند
- چند نکته دربارهٔ سئو
این آموزش ادامهٔ راهنمای DNS هوشمند است و فرض میگیرد تصمیم گرفتهاید در برابر قطعی اینترنت بینالملل دو نسخه از سایت داشته باشید. در معماریِ دومسیره، سختْترین بخش تنظیمِ DNS نیست؛ همگام نگه داشتنِ دو نسخه از سایت است. این آموزش نشان میدهد چطور یک آینهٔ داخلی بسازید که فایلها و پایگاه دادهٔ سرورِ اصلی را بهصورت خودکار میگیرد، فقط خواندنی است و در قطعیِ اینترنت جای سایت را میگیرد.
اول یک تصمیمِ سخت: آینه نوشتن هم بپذیرد یا نه؟
همگامسازیِ دوطرفهٔ پایگاه داده بین دو سرور، بدونِ زیرساختِ خوشهبندیِ واقعی، دیر یا زود به تضادِ داده میرسد: دو سفارش با یک شمارهٔ یکسان، یا کاربری که رمزش روی یک سرور عوض شده و روی دیگری نه. برای سایتِ تکمدیره تقریباً همیشه پاسخِ درست این است:
آینه فقط خواندنی باشد. بازدیدکننده مطالب را میبیند، جستوجو میکند و صفحهها را میخواند؛ اما ثبتِ سفارش، ورودِ کاربر، ارسالِ نظر و ورود به پیشخوان روی آینه بسته است. با این تصمیم، جریانِ داده یکطرفه میشود و کلِ ماجرا قابل مدیریت.
گام ۱: ارتباطِ بیرمز بین دو سرور
روی سرورِ آینه یک کلید بسازید و کلیدِ عمومیاش را روی سرورِ اصلی بگذارید. برای همگامسازیِ خودکار، این کلید نباید عبارتِ عبور داشته باشد:
ssh-keygen -t ed25519 -f /root/.ssh/mirror -N ""
ssh-copy-id -i /root/.ssh/mirror.pub root@ORIGIN_IP
برای محدود کردنِ خطر، روی سرورِ اصلی در فایل authorized_keys دسترسیِ این کلید را قید بزنید تا فقط از آیپیِ آینه و فقط برای همگامسازی کار کند:
from="MIRROR_IP",no-port-forwarding,no-pty ssh-ed25519 AAAA... mirror
گام ۲: همگامسازیِ فایلها
پوشهٔ بارگذاریها و افزونهها و قالب باید منتقل شوند، اما فایلهای موقت و کش نه:
rsync -az --delete
--exclude 'wp-content/cache/'
--exclude 'wp-content/uploads/cache/'
--exclude '*.log'
-e "ssh -i /root/.ssh/mirror -p 22"
root@ORIGIN_IP:/var/www/html/ /var/www/html/
سوئیچ --delete فایلی را که در مبدأ حذف شده، در مقصد هم حذف میکند. اگر مطمئن نیستید، بار اول با --dry-run اجرا کنید و خروجی را بخوانید.
گام ۳: همگامسازیِ پایگاه داده
سادهترین روشِ پایدار، گرفتنِ خروجی روی سرورِ اصلی و بازگرداندنِ آن روی آینه است:
# روی سرورِ آینه
ssh -i /root/.ssh/mirror root@ORIGIN_IP
"mysqldump --single-transaction --quick --no-tablespaces -u USER -pPASS DBNAME | gzip -1"
| gunzip | mysql -u USER -pPASS DBNAME
سه سوئیچ مهماند: --single-transaction جلوی قفل شدنِ جدولها روی سایتِ اصلی را میگیرد، --quick مصرفِ حافظه را پایین نگه میدارد و gzip حجمِ انتقال را کم میکند.
هشدار: این دستور پایگاه دادهٔ آینه را بازنویسی میکند. هر دادهای که روی آینه نوشته شده باشد از بین میرود — که دقیقاً همان چیزی است که میخواهیم، به شرطی که آینه واقعاً فقط خواندنی باشد.
گام ۴: قفل کردنِ نوشتن روی آینه
سه لایه لازم است. اول، در wp-config.phpِ آینه:
define('DISALLOW_FILE_MODS', true);
define('DISALLOW_FILE_EDIT', true);
define('AUTOMATIC_UPDATER_DISABLED', true);
define('DISABLE_WP_CRON', true);
غیرفعال کردنِ زمانبندِ وردپرس مهم است، وگرنه آینه هم ایمیل میفرستد و کارهای زمانبندیشده را دوباره اجرا میکند.
دوم، در وبسرورِ آینه مسیرِ پیشخوان و ورود را ببندید:
location ~ ^/(wp-admin|wp-login.php) {
return 503;
}
سوم، اگر فروشگاه دارید، دکمهٔ خرید را روی آینه به سرورِ اصلی بفرستید یا با پیامی روشن غیرفعال کنید. کاربری که سبد را پر میکند و در پرداخت خطا میگیرد، ناراضیتر از کاربری است که از ابتدا میداند خرید موقتاً مقدور نیست.
گام ۵: زمانبندی
*/15 * * * * /usr/local/bin/mirror-files.sh >> /var/log/mirror.log 2>&1
7 */2 * * * /usr/local/bin/mirror-db.sh >> /var/log/mirror.log 2>&1
فایلها را میشود مکرر همگام کرد چون rsync فقط تفاوتها را میفرستد. پایگاه داده سنگینتر است؛ هر دو ساعت برای سایتِ محتوایی کافی است. دقیقهٔ ۷ عمداً انتخاب شده تا با پشتیبانگیریِ سرِ ساعت همزمان نشود.
گام ۶: پایش — بخشی که همه فراموش میکنند
آینهای که سه هفته همگام نشده، در روزِ بحران محتوای قدیمی نشان میدهد و از نبودنش بدتر است. یک فایلِ نشانه بسازید که تاریخِ آخرین همگامسازی را نگه دارد:
date +%s > /var/www/html/sync-stamp.txt
سپس یک سرویسِ پایشِ بیرونی این نشانه را بخواند و اگر از چند ساعت قدیمیتر بود به شما هشدار دهد. همچنین ماهی یک بار ir.example.com را دستی باز کنید و ببینید آخرین مطلبِ سایت روی آینه هست یا نه.
چه چیزهایی را نباید همگام کرد
همگامسازیِ کامل، چیزهایی را هم میآورد که روی آینه دردسر میسازند:
| مورد | چرا کنار بگذاریم |
|---|---|
| پوشهٔ کش | حجیم است و روی آینه بیاعتبار |
| فایلهای لاگ | بیفایده و پرحجم |
wp-config.php |
اطلاعاتِ پایگاه دادهٔ دو سرور متفاوت است |
| پوشهٔ نسخههای پشتیبان | پشتیبان باید جدا از هر دو سرور نگهداری شود |
| جدولِ نشستِ کاربران | نشستِ سرورِ اصلی روی آینه معنا ندارد |
برای همین wp-config.php را در فهرستِ کنارگذاشتهها بگذارید و نسخهٔ مخصوصِ آینه را دستی نگه دارید:
--exclude 'wp-config.php'
--exclude 'wp-content/backups/'
تمرینِ بحران — سالی دو بار
معماریای که آزمایش نشده، فقط یک فرض است. یک بار در شش ماه این تمرین را انجام دهید:
- در ساعتِ کمترافیک، رکوردِ ایرانی را دستی به آینه ببرید.
- سایت را از یک اتصالِ داخلی باز کنید و صفحهٔ اصلی، یک مطلب و جستوجو را بیازمایید.
- ببینید تاریخِ آخرین مطلب با سرورِ اصلی میخواند یا نه.
- پیامِ غیرفعال بودنِ خرید و ورود را بررسی کنید.
- رکورد را برگردانید و هر اشکالی را که دیدید یادداشت و اصلاح کنید.
نکتهٔ عملی: نتیجهٔ این تمرین را جایی بنویسید. در بحرانِ واقعی وقت و حالِ کشف کردن ندارید و همان یادداشت، دستورِ کارتان میشود.
رفعِ مشکلاتِ رایج
همگامسازی اجرا میشود اما چیزی منتقل نمیشود
معمولاً کلیدِ SSH در بافتِ cron پیدا نمیشود چون مسیرِ خانه متفاوت است. در اسکریپت مسیرِ کلید را کامل بنویسید و خروجی را در فایلِ لاگ بریزید تا خطای واقعی را ببینید.
سایتِ آینه خطای اتصال به پایگاه داده میدهد
یعنی wp-config.phpِ سرورِ اصلی روی آینه کپی شده و مشخصاتِ پایگاه دادهٔ اشتباه را دارد. آن را از فهرستِ همگامسازی کنار بگذارید.
تصاویر روی آینه باز نمیشوند
پوشهٔ بارگذاریها منتقل نشده یا مالکیتِ فایلها اشتباه است. بعد از هر همگامسازی مالکیت را اصلاح کنید: chown -R www-data:www-data /var/www/html
چند نکته دربارهٔ سئو
چون آینه روی همان دامنه سرو میشود و کاربر بر اساسِ موقعیت به آن هدایت میشود، مسئلهٔ محتوای تکراری پیش نمیآید؛ از دیدِ گوگل یک نشانی است با یک محتوا. دو نکته را مراقب باشید: نشانیِ آینه را در نقشهٔ سایت اضافه نکنید، و اگر زیردامنهٔ آزمایشیِ ir.example.com ساختهاید، آن را با robots.txt و هدرِ noindex از دسترسِ خزنده بیرون بگذارید تا بهعنوان نسخهٔ جداگانه ایندکس نشود.
پرسشهای متداول
چرا آینه نباید نوشتن بپذیرد؟
آینه باعث محتوای تکراری و جریمه سئو میشود؟
چرا باید زمانبند وردپرس روی آینه غیرفعال شود؟
هر چند وقت یک بار همگامسازی مناسب است؟
اگر همگامسازی چند هفته انجام نشود چه میشود؟
آموزشهای مرتبط
دسترسپذیری و قطعی اینترنتمتوسطچطور مطمئن شویم گوگلبات به سایت دسترسی دارد؟ چهار روش بررسیسایت باز میشود و کاربران راضیاند، اما رتبهها پایین میآیند. در بیشتر موارد مشکل از محتوا نیست — خزنده گوگل دسترسی ندارد و شما…🕑 ۶ دقیقه📅 ۲۶ مرداد ۱۴۰۵
دسترسپذیری و قطعی اینترنتپیشرفتهمعماری دومسیره با DNS هوشمند: هدایت کاربر داخلی و خارجی به سرور درستچطور یک دامنه را طوری تنظیم کنیم که کاربر ایرانی به سرور داخلی برود و کاربر خارجی به سرور خارجی — و اگر یکی…🕑 ۶ دقیقه📅 ۲۶ مرداد ۱۴۰۵
دسترسپذیری و قطعی اینترنتمتوسطدر دسترس ماندن سایت هنگام قطعی اینترنت بینالملل (و حفظ ایندکس گوگل)در اختلال اینترنت بینالملل، دو چیز همزمان تهدید میشود: دسترسی کاربر ایرانی و دسترسی خزنده گوگل. اینجا معماریای را میبینید که هر دو را…🕑 ۶ دقیقه📅 ۲۵ مرداد ۱۴۰۵ 