📡 دسترس‌پذیری و قطعی اینترنت

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

🕑 زمان مطالعه: ۶ دقیقه 🔄 آخرین بازبینی: ۲۵ مرداد ۱۴۰۵ 🎓 سطح: پیشرفته
ساخت آینه داخلی سایت با همگام‌سازی خودکار rsync (نسخه فقط خواندنی)

در معماری دومسیره، سخت‌ترین بخش تنظیم DNS نیست؛ همگام نگه داشتن دو نسخه از سایت است. اینجا یک آینه فقط خواندنی می‌سازیم که خودش را به‌روز نگه می‌دارد.

تخفیف‌های امروز۱ از ۳
ایران سرور۲۵٪تخفیفسرور اختصاصی اوپال ۲، پلاتینیوم ۳، آمتیس ۲ایران سرور · بدون تاریخ انقضافقط برای پلن‌های «اوپال 2»، «پلاتینیوم 3» و «آمتیس2» سرور اختصاصی ایران (پلن‌های استاندارد)
IranDedicated
رفتن به سایت و استفاده
همه کدهای تخفیف ←
📋 فهرست مطالب (۱۴ بخش)
  1. اول یک تصمیمِ سخت: آینه نوشتن هم بپذیرد یا نه؟
  2. گام ۱: ارتباطِ بی‌رمز بین دو سرور
  3. گام ۲: همگام‌سازیِ فایل‌ها
  4. گام ۳: همگام‌سازیِ پایگاه داده
  5. گام ۴: قفل کردنِ نوشتن روی آینه
  6. گام ۵: زمان‌بندی
  7. گام ۶: پایش — بخشی که همه فراموش می‌کنند
  8. چه چیزهایی را نباید همگام کرد
  9. تمرینِ بحران — سالی دو بار
  10. رفعِ مشکلاتِ رایج
  11. همگام‌سازی اجرا می‌شود اما چیزی منتقل نمی‌شود
  12. سایتِ آینه خطای اتصال به پایگاه داده می‌دهد
  13. تصاویر روی آینه باز نمی‌شوند
  14. چند نکته دربارهٔ سئو

این آموزش ادامهٔ راهنمای 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/'

تمرینِ بحران — سالی دو بار

معماری‌ای که آزمایش نشده، فقط یک فرض است. یک بار در شش ماه این تمرین را انجام دهید:

  1. در ساعتِ کم‌ترافیک، رکوردِ ایرانی را دستی به آینه ببرید.
  2. سایت را از یک اتصالِ داخلی باز کنید و صفحهٔ اصلی، یک مطلب و جست‌وجو را بیازمایید.
  3. ببینید تاریخِ آخرین مطلب با سرورِ اصلی می‌خواند یا نه.
  4. پیامِ غیرفعال بودنِ خرید و ورود را بررسی کنید.
  5. رکورد را برگردانید و هر اشکالی را که دیدید یادداشت و اصلاح کنید.

نکتهٔ عملی: نتیجهٔ این تمرین را جایی بنویسید. در بحرانِ واقعی وقت و حالِ کشف کردن ندارید و همان یادداشت، دستورِ کارتان می‌شود.

رفعِ مشکلاتِ رایج

همگام‌سازی اجرا می‌شود اما چیزی منتقل نمی‌شود

معمولاً کلیدِ SSH در بافتِ cron پیدا نمی‌شود چون مسیرِ خانه متفاوت است. در اسکریپت مسیرِ کلید را کامل بنویسید و خروجی را در فایلِ لاگ بریزید تا خطای واقعی را ببینید.

سایتِ آینه خطای اتصال به پایگاه داده می‌دهد

یعنی wp-config.phpِ سرورِ اصلی روی آینه کپی شده و مشخصاتِ پایگاه دادهٔ اشتباه را دارد. آن را از فهرستِ همگام‌سازی کنار بگذارید.

تصاویر روی آینه باز نمی‌شوند

پوشهٔ بارگذاری‌ها منتقل نشده یا مالکیتِ فایل‌ها اشتباه است. بعد از هر همگام‌سازی مالکیت را اصلاح کنید: chown -R www-data:www-data /var/www/html

چند نکته دربارهٔ سئو

چون آینه روی همان دامنه سرو می‌شود و کاربر بر اساسِ موقعیت به آن هدایت می‌شود، مسئلهٔ محتوای تکراری پیش نمی‌آید؛ از دیدِ گوگل یک نشانی است با یک محتوا. دو نکته را مراقب باشید: نشانیِ آینه را در نقشهٔ سایت اضافه نکنید، و اگر زیردامنهٔ آزمایشیِ ir.example.com ساخته‌اید، آن را با robots.txt و هدرِ noindex از دسترسِ خزنده بیرون بگذارید تا به‌عنوان نسخهٔ جداگانه ایندکس نشود.

پرسش‌های متداول

چرا آینه نباید نوشتن بپذیرد؟
همگام‌سازی دوطرفه پایگاه داده بدون زیرساخت خوشه‌بندی واقعی، دیر یا زود به تضاد داده می‌رسد: دو سفارش با یک شماره یکسان یا رمزی که روی یک سرور عوض شده و روی دیگری نه. با فقط خواندنی بودن، جریان داده یک‌طرفه و قابل مدیریت می‌شود.
آینه باعث محتوای تکراری و جریمه سئو می‌شود؟
نه، چون آینه روی همان دامنه سرو می‌شود و کاربر بر اساس موقعیت به آن هدایت می‌شود؛ از دید گوگل یک نشانی با یک محتواست. فقط اگر زیردامنه آزمایشی ساخته‌اید، آن را با robots.txt و هدر noindex از دسترس خزنده بیرون بگذارید.
چرا باید زمان‌بند وردپرس روی آینه غیرفعال شود؟
وگرنه آینه هم کارهای زمان‌بندی‌شده را اجرا می‌کند: ایمیل می‌فرستد، افزونه‌ها را به‌روز می‌کند و وظایف تکراری می‌سازد. ثابت DISABLE_WP_CRON جلوی این را می‌گیرد.
هر چند وقت یک بار همگام‌سازی مناسب است؟
فایل‌ها را می‌شود مکرر همگام کرد چون rsync فقط تفاوت‌ها را می‌فرستد؛ هر پانزده دقیقه معمول است. پایگاه داده سنگین‌تر است و برای سایت محتوایی هر دو ساعت کافی است.
اگر همگام‌سازی چند هفته انجام نشود چه می‌شود؟
آینه محتوای قدیمی نشان می‌دهد و در روز بحران از نبودنش بدتر است. برای همین فایل نشانه زمانی بگذارید و با سرویس پایش بیرونی، کهنه شدنش را هشدار بگیرید.
نت افرازدیتاسنتر داخلی، پرداخت ریالینقد و بررسی شرکت مشاهده سایت
لیموهاستدیتاسنتر داخلی، پرداخت ریالینقد و بررسی شرکت مشاهده سایت
این آموزش را بفرستید: ✈ تلگرام 💬 واتس‌اپ
✨
دربارهٔ تهیهٔ این مطلب

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

آموزش‌های مرتبط