סטיית שעון בשרת וורדפרס: גורמים, השלכות ותיקון NTP

כששעון השרת לא מסונכרן, פוסטים מתוזמנים מתפרסמים בזמן הלא נכון, חתימות API נופלות ולוגים מטעים. כך מתקנים.

שעון לא מדויק בשרת הוא אחת התקלות הכי שקטות וכי משבשות שיכולות לקרות לאתר וורדפרס. הוא לא מפיל את האתר באופן ברור, אבל הוא שובר בשקט מערכות שמסתמכות על הזמן: cron, חתימות, אבטחה, רפליקציה ולוגים.

למה זה משנה

וורדפרס בעצמו, וכמעט כל תוסף רציני שיושב עליו, מסתמך על שעון השרת בכמה מקומות קריטיים. WP-Cron מחליט מתי להריץ משימה לפי time() של PHP. כששעון השרת מקדים בעשר דקות, גיבוי מתוזמן ל-03:00 רץ ב-02:50; כשהוא מאחר בשעה, פוסט שתוזמן ל-09:00 לא ייצא לפני 10:00. מעבר לזה, OAuth ו-JWT מגדירים את ה-timestamp בתוך החתימה ודוחים בקשה ששעונה סוטה ביותר מ-300 שניות מהשרת השני - זו הסיבה הראשית לשגיאות "Invalid signature" מ-Stripe, Google APIs ו-Facebook Graph. תעודות SSL חדשות שיוצרות עם certbot עלולות להיכשל בולידציה אם ה-clock skew עצום. Multisite עם DB replication סובל מ-MySQL replication lag מעוות. ולבסוף, חקר תקלות נהיה כמעט בלתי אפשרי כשלוג אחד אומר 14:32 ולוג אחר באותו רגע אומר 14:38.

איך לזהות

RankPlus מבצע פינג ל-API של RankPlus, מקבל את ה-Date header של ה-HTTPS response (שמסתמך על שעון UTC מדויק) ומשווה ל-time() בשרת הוורדפרס. סטייה של מעל 30 שניות נחשבת drift. ידנית אפשר לבדוק עם הפקודה הבאה דרך SSH:

date -u && curl -sI https://www.google.com | grep -i ^date

שתי השורות צריכות להיות זהות בפחות מ-2 שניות. אם הן מתרחקות, יש drift. אפשרות נוספת: timedatectl status במערכות systemd יראה אם NTP בכלל פעיל ואם השעון מסונכרן.

איך לתקן

  1. אם יש לך SSH והרשאות root, הפעל סנכרון NTP מובנה: sudo timedatectl set-ntp true.
  2. במערכות מודרניות (Ubuntu 18+, Debian 10+) השירות שעובד מאחורי הקלעים הוא systemd-timesyncd. הפעל אותו: sudo systemctl enable --now systemd-timesyncd.
  3. בשרתים שמרניים יותר השתמש ב-chrony - הוא מדויק יותר וטוב יותר ל-VM שעולים וירדים: sudo apt install chrony && sudo systemctl enable --now chronyd.
  4. וודא ש-firewall לא חוסם NTP. הפרוטוקול משתמש ב-UDP פורט 123 outbound. ספקי VPS חדשים לעיתים חוסמים זאת כברירת מחדל ויש לפתוח ידנית.
  5. אם זה shared hosting ללא SSH, פתח כרטיס תמיכה: "שעון השרת אינו מסונכרן עם NTP - יש סטייה של X שניות. אנא תקנו".
  6. אחרי 2-5 דקות הרץ timedatectl - השדה System clock synchronized צריך להראות yes.

טעויות נפוצות

  • בלבול בין timezone לבין clock: וורדפרס מציג זמן לפי הגדרת ה-timezone של האתר (Settings > General). שינוי שלה לא משנה את שעון השרת. תקן את שעון השרת ב-UTC, ואת תצוגת המשתמש בהגדרות וורדפרס בנפרד.
  • שימוש ב-NTP servers ארגוניים שאינם נגישים: בדוק את הקובץ /etc/systemd/timesyncd.conf. אם הוא מצביע ל-NTP פנימי שאין אליו גישה - יוצרים drift לאט.
  • VM ש-suspend ארוך: מכונה וירטואלית ש"קפאה" יכולה לחזור עם שעון שמסטה בדקות. במקרה זה הפעלת ntpd פעם אחת לא מספיקה - וודא שהוא רץ באופן רציף.
  • Docker containers: container יורש את שעון ה-host. אם ה-host מסטה, כל ה-containers מסטים. תקן ב-host, לא בכל container.

בדיקה לאחר תיקון

הרץ שוב date -u והשווה ל-https://time.is או ל-curl -sI https://www.google.com | grep -i date. שתי הזמנים צריכים להיות זהים. ב-RankPlus הרץ ביקורת מחדש - הסטטוס יחזור לירוק תוך מחזור הדגימה הבא. בדוק גם משימת cron שתוזמנה לזמן קרוב - היא צריכה לרוץ בדיוק בזמן שתוזמן.

טיפ: ב-AWS EC2 וב-DigitalOcean Droplets החדשים יש Time Sync service מובנה (169.254.169.123 ב-AWS) שמדויק יותר מ-pool.ntp.org הציבורי. אם אתה על ענן ציבורי, השתמש בו.