הגדרת Redis עבור סשנים של Magento 2: מדריך מלא
מבוא
כאשר העומס גדל בחנות מקוונת של Magento 2, הדבר הראשון שמאט הוא סשנים של משתמשים. אחסון סשנים מבוסס קבצים יוצר לחץ על inode במערכת הקבצים ומכניס חסימה במהלך בקשות AJAX מקבילות. אנחנו, מהנדסים עם ניסיון בהטמעת Redis בפרויקטים בעלי עומס גבוה, נתקלנו בבעיה זו עשרות פעמים. פעם אחת, לקוח הגיע עם מצב: עגלות לקוחות נוקו מעת לעת, ולוח הניהול קפא למשך 30 שניות בעומסי שיא. הפתרון — העברת סשנים למופע Redis נפרד עם הגדרה נכונה.
Magento 2 תומך בשני חיבורי Redis עצמאיים: אחד עבור מטמון יישומים (בלוקים, תצורה, FPC), ואחר עבור סשנים של משתמשים. הפרדה למסדי נתונים שונים של Redis היא חובה; אחרת, פעולת FLUSHDB במהלך ניקוי מטמון תמחק את כל הסשנים הפעילים של לקוחות. בפרויקט שלנו, השתמשנו בשני מופעים: אחד עם מדיניות var/session/ עבור מטמון, ואחר עם env.php עבור סשנים — זה ביטל לחלוטין אובדן נתונים וחסך משאבי שרת.
בעיות שנפתרות על ידי Redis עבור סשנים של Magento 2
כברירת מחדל, Magento מאחסן סשנים במערכת הקבצים ('session' => [ 'save' => 'redis', 'redis' => [ 'host' => '127.0.0.1', 'port' => '6379', 'password' => 'strongpassword', 'timeout' => '2.5', 'persistent_identifier' => '', 'database' => '2', // отдельная БД от кэша 'compression_threshold' => '2048', 'compression_lib' => 'gzip', 'log_level' => '1', 'max_concurrency' => '6', 'break_after_frontend' => '5', 'break_after_adminhtml' => '30', 'first_lifetime' => '600', 'bot_first_lifetime' => '60', 'bot_lifetime' => '7200', 'disable_locking' => '0', 'min_lifetime' => '60', 'max_lifetime' => '29500', 'sentinel_master' => '', 'sentinel_servers' => '', 'sentinel_connect_retries'=> '5', 'sentinel_verify_master' => '0', ], ], 'cache' => [ 'frontend' => [ 'default' => [ 'backend' => 'Cm_Cache_Backend_Redis', 'backend_options' => [ 'server' => '127.0.0.1', 'port' => '6379', 'database' => '0', // БД 0 для кэша 'password' => 'strongpassword', 'compress_data' => '1', 'compress_tags' => '1', 'compression_lib' => 'gzip', 'read_timeout' => '1.5', ], ], 'page_cache' => [ 'backend' => 'Cm_Cache_Backend_Redis', 'backend_options' => [ 'server' => '127.0.0.1', 'port' => '6379', 'database' => '1', // БД 1 для FPC 'password' => 'strongpassword', 'compress_data' => '0', // FPC не сжимаем: больше памяти, быстрее ], ], ], ], ). ככל שהתנועה גדלה, זה גורם ל:
- אלפי קבצים קטנים על מערכת קבצים אחת יוצרים לחץ על inode.
- נעילת קבצים במהלך בקשות AJAX מקבילות מאותו משתמש.
- באשכול, מספר צמתים לא יכולים לראות את הסשנים של זה.
התיעוד הרשמי של Magento ממליץ על Redis עבור סשנים החל מגרסה 2.2, במיוחד עבור הגדרות מרובות אתרים. Redis פותר את כל שלוש הבעיות: פעולות אטומיות ללא נעילה, אחסון מרכזי, ועובד עם Redis Sentinel/Cluster עבור זמינות גבוהה.
השוואה בין אחסון קבצים לעומת Redis עבור סשנים:
| קריטריון | סשנים מבוססי קבצים | סשנים מבוססי Redis |
|---|---|---|
| מהירות כתיבה | 1-5 אלפיות שנייה (עם נעילה) | <0.1 אלפיות שנייה (ללא נעילה) |
| לחץ על inode | גבוה (אלפי קבצים) | אין (הכל בזיכרון) |
| אשכולות | לא נתמך | Sentinel/Cluster |
| סובלנות לתקלות | נמוכה | AOF + שכפול |
| נעילה | כן (נעילת קבצים) | לא (פעולות אטומיות) |
כיצד להגדיר שני מופעי Redis עצמאיים עבור סשנים ומטמון
התצורה ב-/etc/redis/redis.conf דורשת שני בלוקים: עבור מטמון ועבור סשנים. תצורה מלאה:
דוגמה לתצורת env.php
'session' => [ 'save' => 'redis', 'redis' => [ 'host' => '127.0.0.1', 'port' => '6379', 'password' => 'strongpassword', 'timeout' => '2.5', 'persistent_identifier' => '', 'database' => '2', // отдельная БД от кэша 'compression_threshold' => '2048', 'compression_lib' => 'gzip', 'log_level' => '1', 'max_concurrency' => '6', 'break_after_frontend' => '5', 'break_after_adminhtml' => '30', 'first_lifetime' => '600', 'bot_first_lifetime' => '60', 'bot_lifetime' => '7200', 'disable_locking' => '0', 'min_lifetime' => '60', 'max_lifetime' => '29500', 'sentinel_master' => '', 'sentinel_servers' => '', 'sentinel_connect_retries'=> '5', 'sentinel_verify_master' => '0', ], ], 'cache' => [ 'frontend' => [ 'default' => [ 'backend' => 'Cm_Cache_Backend_Redis', 'backend_options' => [ 'server' => '127.0.0.1', 'port' => '6379', 'database' => '0', // БД 0 для кэша 'password' => 'strongpassword', 'compress_data' => '1', 'compress_tags' => '1', 'compression_lib' => 'gzip', 'read_timeout' => '1.5', ], ], 'page_cache' => [ 'backend' => 'Cm_Cache_Backend_Redis', 'backend_options' => [ 'server' => '127.0.0.1', 'port' => '6379', 'database' => '1', // БД 1 для FPC 'password' => 'strongpassword', 'compress_data' => '0', // FPC не сжимаем: больше памяти, быстрее ], ], ], ], בסך הכל, שלושה מסדי נתונים של Redis: 0 — מטמון, 1 — FPC, 2 — סשנים.
הגדרת Redis עבור Magento תחת עומס
maxmemory 2gb maxmemory-policy allkeys-lru # Сессии не должны вытесняться → выделяем отдельный инстанс # Лучше запускать два redis: :6379 для кэша, :6380 для сессий save "" # Для кэша persistence не нужна appendonly no tcp-keepalive 60 timeout 300 (הגדרות ספציפיות ל-Magento):
maxmemory 2gb
maxmemory-policy allkeys-lru
# Сессии не должны вытесняться → выделяем отдельный инстанс
# Лучше запускать два redis: :6379 для кэша, :6380 для сессий
save ""
# Для кэша persistence не нужна
appendonly no
tcp-keepalive 60
timeout 300עבור סשנים על פורט נפרד /etc/redis/redis-sessions.conf:
port 6380
maxmemory 512mb
maxmemory-policy noeviction # сессии нельзя вытеснять
appendonly yes # persistence для сессий
appendfsync everysecלאחר מכן ב-port 6380 maxmemory 512mb maxmemory-policy noeviction # сессии нельзя вытеснять appendonly yes # persistence для сессий appendfsync everysec , שנה את פורט הסשנים ל-env.php ואת 6380 ל-database.
פרמטרים המשפיעים על ביצועי סשנים
טבלת פרמטרים מרכזיים:
| פרמטר | המלצה | השפעה |
|---|---|---|
0 |
6-15 | ערך גבוה יותר מגדיל בקשות מקבילות לכל סשן |
max_concurrency |
5-10 | השהיה לפני ניתוק חיבור בשגיאה |
break_after_frontend |
2048 | סף (בייטים) לדחיסת נתוני סשן |
compression_threshold |
0 או 1 | 0 — נעילה למניעת מצבי מרוץ, 1 — מהיר יותר אך מסוכן |
כיצד לוודא פעולת סשנים תקינה לאחר התצורה
# Убедиться что сессии пишутся в Redis
redis-cli -p 6380 KEYS "sess_*" | wc -l
# Посмотреть содержимое сессии
redis-cli -p 6380 GET "sess_abc123xyz"
# Мониторинг в реальном времени
redis-cli -p 6379 MONITOR | grep -i "sess\|cache"
# Hit rate кэша
redis-cli -p 6379 INFO stats | grep -E "keyspace_hits|keyspace_misses"שיעור פגיעות המטמון צריך להיות מעל 80%. אם נמוך יותר, disable_locking או # Убедиться что сессии пишутся в Redis redis-cli -p 6380 KEYS "sess_*" | wc -l # Посмотреть содержимое сессии redis-cli -p 6380 GET "sess_abc123xyz" # Мониторинг в реальном времени redis-cli -p 6379 MONITOR | grep -i "sess\|cache" # Hit rate кэша redis-cli -p 6379 INFO stats | grep -E "keyspace_hits|keyspace_misses" אינם מספיקים: LRU מסיר ערכים חדשים. עבור סשנים, השתמש במופע נפרד עם max_lifetime כדי למנוע אובדן נתונים תחת לחץ זיכרון.
מה כלול בעבודה שלנו
אנו מציעים הגדרה מקיפה של Redis עבור Magento 2:
- ביקורת של תצורת הסשנים והמטמון הנוכחית.
- התקנה והגדרה של שני מופעי Redis עצמאיים המותאמים לעומס שלך.
- אופטימיזציה של פרמטרי
maxmemoryעבור החנות הספציפית שלך. - בדיקת סשנים ומטמון (שיעור פגיעות, זמן תגובה).
- תיעוד על ניטור וגיבוי.
- הדרכת צוות (כיצד לצפות בלוגים, לאסוף מדדים).
אנו מבטיחים פעולה יציבה של סשנים ומטמון לאחר התצורה. מעל 60 פרויקטים על Magento 2 רצים בהצלחה על התצורה שלנו. הזמינו ביקורת של המערכת שלכם — נעריך את העומס ונכין הצעה.
תהליך העבודה שלנו
- ניתוח — לימוד לוגי nginx, עומס שרת, תצורת סשנים נוכחית.
- עיצוב — בחירת ארכיטקטורה (מופע אחד עם מסדי נתונים שונים או שני מופעים).
-
יישום — הגדרת Redis ו-
env.php, החלת שינויים. - בדיקות — אימות התחברות, עגלה, לוח ניהול תחת עומס.
- פריסה — יישום בסביבת הייצור, ניטור למשך 48 שעות.
לוח זמנים
הגדרת שני מופעי Redis, התקנת env.php, בדיקת סשנים ומטמון: יום אחד. הגדרת Redis Sentinel עבור זמינות גבוהה (אם נדרש): 1-2 ימים נוספים.
אם אתם נתקלים בהאטות בלוח הניהול או באובדן עגלות — צרו קשר. נעריך את העומס שלכם ביום אחד ונציע תצורה. קבלו ייעוץ מהנדס היום.







