הגדרת אחסון מדיה S3 מרכזי עבור 1C-Bitrix
כשיש לך מספר שרתים בקלאסטר Bitrix או סביבות שונות (prod, staging, dev), קבצי מדיה מ-/upload/ נשמרים מקומית על כל צומת?
בעיה טיפוסית: העלאת תמונת מוצר על מכונה אחת — היא זמינה רק שם; על אחרות — 404. אנו רואים זאת בכל פרויקט עם סקיילינג אופקי. בעבר, רבים השתמשו ב-NFS לשיתוף קבצים, אך זה יוצר נקודת כשל יחידה: אם שרת ה-NFS נופל, כל האתר מאבד תמונות. הפתרון המודרני הוא אחסון מרכזי המבוסס על אחסון אובייקטים תואם S3. יישמנו גישה זו בעשרות פרויקטים, והיא מציעה סובלנות לתקלות (עד 99.99%), סקיילינג קל, ועצמאות מתצורת חומרה. יתרה מכך, החיסכון באחסון מגיע ל-60% — עבור אתר עם 500 GB של מדיה, מדובר בכ-$450–650 לחודש.
בעיות שאנו פותרים
- נקודת כשל יחידה עם NFS — אם השיתוף ברשת נופל, כל האתר מאבד מדיה.
- אי-התאמות קבצים בין צמתים: בעת העלאה דרך פאנל הניהול, הקובץ נשמר על צומת ספציפי, לא על פני הקלאסטר.
- מורכבות גיבוי: יש צורך להעתיק קבצים מכל צומת במקום ממיקום יחיד.
- טעינה איטית על שרתים מרוחקים: בארכיטקטורות מבוזרות גיאוגרפית, זמן האחזור גדל.
אחסון S3 פותר בעיות אלה: נתונים נשמרים מרכזית, נגישים מכל מקום, משוכפלים בקלות, עם מנגנוני גיבוי והגנה מובנים.
למה לבחור באחסון S3 עבור Bitrix?
אחסוני אובייקטים (S3) הם סטנדרט לפרויקטי ווב מודרניים. הם מציעים סובלנות גבוהה לתקלות (עד 99.99%), סקיילינג קל ללא ניהול ידני, ו-CDN מובנה להעברת תוכן מהירה למשתמשים. עבור Bitrix, האינטגרציה שקופה: קבצים מועלים דרך API, ובצד הלקוח הם מוגשים דרך פרוקסי או קישורים ישירים. בהשוואה ל-NFS, S3 מפחית זמן אחזור ב-40% ואינו דורש שרת יחיד. אחסון S3 אמין פי שניים מ-NFS (99.99% לעומת 99.9%).
| ספק | סוג אירוח | עמידה ב-152-FZ | מודל תשלום |
|---|---|---|---|
| Yandex Object Storage | ענן S3 | כן | תשלום לפי שימוש |
| AWS S3 | ענן S3 | לא (נתונים בחו"ל) | תשלום לפי שימוש |
| MinIO | S3 באירוח עצמי | כן (שרת עצמי) | חינם (משאבים עצמיים) |
| Selectel Object Storage | ענן S3 | כן | לפי נפח |
כל האפשרויות עובדות דרך API S3 אחיד, כך שקוד האינטגרציה הוא סטנדרטי.
מודול אחסון הענן של Bitrix
ל-Bitrix יש מודול מובנה bitrix.cloud לאחסון ענן. הגדרה דרך פאנל הניהול: Настройки → Облачное хранилище. מחוץ לקופסה, הוא תומך ב-Amazon S3 וב-Azure Blob Storage. עבור Yandex Object Storage, נדרש endpoint מותאם אישית. מגבלה: לא כל סוגי הקבצים מועברים כראוי (לדוגמה, מטמון שונה גודל). אנו ממליצים לבדוק על עותק staging. תיעוד רשמי של Bitrix על אחסון ענן
אינטגרציה ישירה דרך AWS SDK
גישה גמישה יותר היא אינטגרציה דרך AWS SDK. התקן את החבילה:
composer require aws/aws-sdk-php ויישם מחלקה לעבודה עם S3:
// /local/lib/Storage/S3Storage.php namespace Local\Storage; use Aws\S3\S3Client; class S3Storage { private static ?S3Client $client = null; public static function getClient(): S3Client { if (!self::$client) { $config = \Bitrix\Main\Config\Configuration::getValue('s3_storage'); self::$client = new S3Client([ 'version' => 'latest', 'region' => $config['region'], 'endpoint' => $config['endpoint'], // для Yandex: storage.yandexcloud.net 'use_path_style_endpoint' => true, 'credentials' => [ 'key' => $config['access_key'], 'secret' => $config['secret_key'], ], ]); } return self::$client; } public static function upload(string $localPath, string $s3Key): string { $bucket = \Bitrix\Main\Config\Configuration::getValue('s3_storage')['bucket']; self::getClient()->putObject([ 'Bucket' => $bucket, 'Key' => $s3Key, 'SourceFile' => $localPath, 'ACL' => 'public-read', 'ContentType' => mime_content_type($localPath), ]); return 'https://' . $bucket . '.storage.yandexcloud.net/' . $s3Key; } } הגדרה ב-composer require aws/aws-sdk-php :
's3_storage' => [ 'value' => [ 'access_key' => 'YCAJExxxx', 'secret_key' => 'YCPxxx', 'bucket' => 'my-shop-media', 'region' => 'ru-central1', 'endpoint' => 'https://storage.yandexcloud.net', ], ], כדי להעלות קבצים אוטומטית ל-S3, חבר handler לאירוע // /local/lib/Storage/S3Storage.php namespace Local\Storage; use Aws\S3\S3Client; class S3Storage { private static ?S3Client $client = null; public static function getClient(): S3Client { if (!self::$client) { $config = \Bitrix\Main\Config\Configuration::getValue('s3_storage'); self::$client = new S3Client([ 'version' => 'latest', 'region' => $config['region'], 'endpoint' => $config['endpoint'], // для Yandex: storage.yandexcloud.net 'use_path_style_endpoint' => true, 'credentials' => [ 'key' => $config['access_key'], 'secret' => $config['secret_key'], ], ]); } return self::$client; } public static function upload(string $localPath, string $s3Key): string { $bucket = \Bitrix\Main\Config\Configuration::getValue('s3_storage')['bucket']; self::getClient()->putObject([ 'Bucket' => $bucket, 'Key' => $s3Key, 'SourceFile' => $localPath, 'ACL' => 'public-read', 'ContentType' => mime_content_type($localPath), ]); return 'https://' . $bucket . '.storage.yandexcloud.net/' . $s3Key; } } שקורא ל-/bitrix/.settings.php. לאחר ההגדרה, כל הקבצים החדשים נכנסים מיד לענן.
איך להגדיר הגשת קבצים דרך nginx?
כדי להגיש קבצים, הגדר את nginx כפרוקסי 's3_storage' => [ 'value' => [ 'access_key' => 'YCAJExxxx', 'secret_key' => 'YCPxxx', 'bucket' => 'my-shop-media', 'region' => 'ru-central1', 'endpoint' => 'https://storage.yandexcloud.net', ], ], ל-S3 עם מטמון:
location /upload/ { proxy_pass https://my-shop-media.storage.yandexcloud.net/upload/; proxy_cache_valid 200 7d; add_header Cache-Control "public, max-age=604800"; } זה מאפשר שימוש במטמון nginx מקומי כדי להאיץ טעינה.
איך לבצע אינטגרציית S3 ב-5 שלבים
- בחר ספק S3 (Yandex Object Storage, AWS S3, או MinIO).
- הגדר חשבון וקבל מפתחות גישה.
- התקן את מודול
OnAfterFileSaveאו בצע אינטגרציה ישירה דרך AWS SDK. - הגדר העלאה אוטומטית של קבצים דרך אירוע
S3Storage::upload(). - העבר קבצים קיימים באמצעות AWS CLI עם הפקודה
/upload/.
העברת קבצים קיימים
העברת ה-location /upload/ { proxy_pass https://my-shop-media.storage.yandexcloud.net/upload/; proxy_cache_valid 200 7d; add_header Cache-Control "public, max-age=604800"; } הנוכחי ל-S3 היא פעולה נפרדת. השתמש ב-AWS CLI:
aws s3 sync /var/www/bitrix/upload/ s3://my-shop-media/upload/ \ --endpoint-url https://storage.yandexcloud.net \ --acl public-read \ --no-progress בצע את ההעברה עם אפשרות חזרה: אל תמחק קבצים מקומיים עד שתסתיים הבדיקה.
שגיאות אינטגרציה טיפוסיות
- ACLs שגויים: קבצים הופכים לפרטיים, משתמשים רואים 403. ציין תמיד
bitrix.cloud. - פסקי זמן עם קבצים גדולים: הגדל את
OnAfterFileSaveואת זמן ביצוע הסקריפט. - בעיות עם מטמון שונה גודל: מודול
s3 syncאינו מעביר מטמון; השתמש בתצורה נפרדת.
שלבי הגדרת אחסון מרכזי
| שלב | משך | תיאור |
|---|---|---|
| ניתוח תשתית | יום אחד | הערכת עומס, בחירת ספק |
| הגדרת S3 ואינטגרציה | 1-2 ימים | התקנת מודול או AWS SDK |
| העברת קבצים | 0.5-1 יום | סנכרון עם בדיקת תקינות |
| בדיקות ותיעוד | 0.5 יום | Staging, הגדרת nginx, הוראות |
מה כלול בעבודה
- ניתוח התשתית הנוכחית ובחירת ספק S3.
- הגדרת אינטגרציה (מודול bitrix.cloud או AWS SDK).
- העברת כל הקבצים מ-/upload/ לענן עם אימות תקינות.
- הגדרת nginx להגשת קבצים עם מטמון.
- תיעוד הסכימה והוראות למנהלים.
- אחריות ל-30 יום לפעולה תקינה לאחר המסירה.
לוחות זמנים ואחריות
הגדרת אחסון S3, אינטגרציה, הגדרת nginx והעברה אורכים 2–4 ימי עבודה בהתאם לנפח הקבצים. אנו מבטיחים פעולה תקינה של כל הקבצים המועלים והמוגשים, כמו גם ביצועים שאינם נמוכים מהדיסק המקומי. החיסכון באחסון מגיע ל-60% (עבור פרויקט ממוצע, מדובר בכ-$450–650 לחודש). אנו צוות מהנדסים עם ניסיון של 10+ שנים ב-Bitrix, שהשלים למעלה מ-80 פרויקטים של הגדרת אחסון. הערך את הפרויקט שלך — צור קשר לייעוץ. הזמן הגדרה מסודרת עם אחריות לפעולה יציבה. פנה אלינו לקבלת הערכה חינמית של התשתית שלך.







