RE:NODE

ვებ ჰოსტინგი10 წუთის საკითხავი

WordPress-ის მედიის გადატანა S3-ში: plugin-ები, URL-ები და კომპრომისები

გადაიტანე WordPress-ის ატვირთვები S3-თავსებად საცავში: რომელი offload plugin უჭერს მხარს მორგებულ endpoint-ს, როგორ მუშაობს URL-ები და საჯარო წვდომა, და როდის არ ღირს.

0 მკითხველი

WordPress-ის მედიის offload ნიშნავს, რომ plugin Media Library-ში ატვირთულ ყოველ ფაილს S3 bucket-ში აკოპირებს და შენს გვერდებში სურათების URL-ებს გადაწერს, რომ wp-content/uploads-ის ნაცვლად bucket-ზე მიუთითებდეს. ეს ვებ სერვერის დისკს პატარად ინახავს, რამდენიმე ვებ სერვერს საშუალებას აძლევს ერთი მედიის ბიბლიოთეკა გაიზიარონ და სერვერის ხელახლა აწყობას გადაურჩება. ის ასევე ამატებს plugin-ს, რომელზეც სამუდამოდ ხარ დამოკიდებული, ცვლის, როგორ მუშაობს backup-ები, და - ნაწილი, რომელსაც გზამკვლევების უმეტესობა გამოტოვებს - მუშაობს მხოლოდ მაშინ, თუ ვიზიტორების ბრაუზერებს ობიექტების წაკითხვა შეუძლიათ, რაც დამოკიდებულია იმაზე, რას უშვებს შენი საცავი. მორგებული S3-თავსებადი endpoint-ისთვის სუფთად მუშაობს Human Made-ის S3 Uploads (კონფიგურირდება კოდში) და Advanced Media Offloader (კონფიგურირდება პარამეტრებში, ზოგადი S3-თავსებადი ოფციით); პოპულარული WP Offload Media ოფიციალურად დასახელებულ პროვაიდერებზეა გათვლილი და მორგებულ endpoint-ებს მხოლოდ ფილტრებით აღწევს. ეს პოსტი განიხილავს დაყენებას, URL-ისა და წვდომის საკითხებს, არსებული ბიბლიოთეკის მიგრაციას და გულწრფელ პასუხს კითხვაზე, გჭირდება თუ არა ეს საერთოდ.

რას ცვლის offload სინამდვილეში#

offload-ის გარეშე ატვირთვა მიდის ვებ სერვერზე wp-content/uploads/2026/10/photo.jpg-ში, WordPress მის გვერდით ზომაშეცვლილ ასლებს აგენერირებს (photo-300x200.jpg, photo-1024x683.jpg და ასე შემდეგ), პოსტის შიგთავსი კი შეიცავს URL-ს თავად სერვერზე.

offload plugin-ით ატვირთვა მაინც ჯერ ვებ სერვერზე ხვდება - WordPress-ს ფაილი ლოკალურად სჭირდება, რომ thumbnail-ები დააგენერიროს და მეტამონაცემები წაიკითხოს. plugin შემდეგ ორიგინალს და ყოველ ზომაშეცვლილ ვერსიას bucket-ში აკოპირებს, აღრიცხავს, სად წავიდა თითოეული, და ფილტრავს ყოველ ადგილს, სადაც WordPress მედიის URL-ს აწარმოებს, რომ გვერდი საცავზე მიუთითებდეს. ზოგი plugin ლოკალურ ასლებს შემდეგ შლის დისკის დასაზოგად; სხვები ინახავს.

ატვირთვაყველა ზომის კოპირებაHTML გვერდისურათების მოთხოვნებირედაქტორიტვირთავს photo.jpg-სვიზიტორიტვირთავს გვერდსWordPressზომას ცვლის, მერე გადაიტანსS3 bucketორიგინალები + ზომები
სურათის ატვირთვა მედიის offload plugin-ით

აქედან ორი შედეგი გამომდინარეობს. სურათებს ახლა ვიზიტორები პირდაპირ საცავის endpoint-იდან იღებენ, ამიტომ ამ endpoint-მა ამ ობიექტებზე ანონიმურ მოთხოვნებს უნდა უპასუხოს. და ფაილები ახლა ვებ სერვერის გარეთაა, ამიტომ ვებ სერვერის backup აღარ შეიცავს შენს მედიას.

როდის ღირს და როდის არა#

offload კონკრეტულ პრობლემებს წყვეტს. თუ არცერთი მათგანი არ გაქვს, ის უაზროდ ამატებს მოძრავ ნაწილებს.

ღირს, როცა:

  • მედიის ბიბლიოთეკა დიდია ვებ გეგმის დისკთან შედარებით - ფოტოგრაფიის საიტი ან მაღაზია ათასობით პროდუქტის სურათით, სადაც ატვირთვები დისკის გამოყენების უდიდეს ნაწილს შეადგენს.
  • საიტს ერთზე მეტი ვებ სერვერი ემსახურება, ამიტომ ყოველ სერვერს ერთი და იგივე ფაილები სჭირდება, მათ შორის საქაღალდეების სინქრონიზაციის გარეშე.
  • ვებ სერვერი ერთჯერადია - მას რეპოზიტორიიდან ხელახლა აწყობ და არ გინდა, მასზე იყოს რამე, რისი ხელახლა შექმნაც შეუძლებელია.
  • ჩამოსატვირთი ფაილები დიდია - პოდკასტები, ვიდეო, პროგრამები - და გინდა, ისინი ვებ სერვერის გამტარუნარიანობასა და დისკს მოაშორო.

არ ღირს, როცა:

  • ეს ჩვეულებრივი ბლოგი ან კომპანიის საიტია რამდენიმე გიგაბაიტი სურათით. ვებ ჰოსტინგის გეგმებს ამისთვის საკმარისი დისკი აქვს, ვებ სერვერი კი სტატიკურ ფაილებს ძალიან ეფექტურად ემსახურება.
  • იმედი გაქვს, რომ ეს საიტს თავისთავად დააჩქარებს. სურათების გადატანა bucket-ში, რომელიც ვებ სერვერის იმავე ლოკაციაშია, ვიზიტორებამდე მანძილს არ ამოკლებს. სისწრაფე მოდის caching header-ებიდან, სურათების ზომებიდან და ფორმატებიდან, და CDN-იდან, თუ შენი აუდიტორია შორსაა. WordPress-ის სისწრაფე და caching განიხილავს, რა ეხმარება სინამდვილეში.
  • ეყრდნობი plugin-ებს, რომლებიც ლოკალურ ფაილებს ელოდებიან - ზოგი სურათის რედაქტორი, PDF-ის thumbnail-ების გენერატორი, უსაფრთხოების სკანერი და backup plugin ვარაუდობს, რომ მედია wp-content/uploads-შია.

არსებობს შუალედური გზაც, რომელსაც ხალხი ვერ ამჩნევს: მედია იქ დატოვე, სადაც არის, და wp-content/uploads ყოველ ღამე bucket-ში backup-ად დააკოპირე. არც plugin, არც URL-ების ცვლილება, და bucket მაინც გიშველის, თუ სერვერი დაიკარგება. rclone-ის მიდგომა სტატიიდან თამაშის სერვერის backup-ები S3-ში WordPress-ის ატვირთვების საქაღალდისთვისაც იგივენაირად მუშაობს.

საჯარო წვდომის საკითხი#

ეს ის ნაწილია, რომელიც რამის დაყენებამდე უნდა გადაწყვიტო. offload-ილ სურათს ვიზიტორის ბრაუზერი ტვირთავს უბრალო GET-ით, ავტორიზაციის მონაცემების გარეშე. ამის სამუშაოდ საცავმა ეს ობიექტები ანონიმურად უნდა მიაწოდოს. AWS-ზე ეს კეთდება bucket-ის პოლიტიკით ან ობიექტის ACL-ებით, დაყენებული public-read-ზე. S3-თავსებადი სერვისები განსხვავდება იმით, ამ მექანიზმებიდან რომელს უჭერენ მხარს, და ყველა საცავის პროდუქტი საჯარო bucket-ებს საერთოდ არ გთავაზობს.

მაგალითად, RE:NODE-ის S3 საცავი იყიდება როგორც კერძო საცავი შენი სერვერისთვის გენერირებული access key-ითა და secret-ით; საჯარო bucket-ები და bucket-ის პოლიტიკები მის დაპირებაში არ შედის. ამიტომ, სანამ მასზე რამეს ააშენებ, გამოსცადე. ატვირთე სატესტო ობიექტი ისე, როგორც შენი plugin ატვირთავს, შემდეგ კი ავტორიზაციის გარეშე მოითხოვე:

bash
$ aws s3 cp test.jpg s3://media/test.jpg --acl public-read --profile store$ curl -I https://s3.example.com/media/test.jpg

200 Content-Type: image/jpeg-ით ნიშნავს, რომ ანონიმური წაკითხვა მუშაობს და საჯარო offload-ის დაყენებაც იმუშავებს. 403 AccessDenied ნიშნავს, რომ ობიექტები კერძოა, და გაქვს სამი გულწრფელი ვარიანტი:

  1. ხელმოწერილი URL-ები. ზოგ plugin-ს შეუძლია მედია მიაწოდოს presigned URL-ებით, რომლებსაც ვადა გასდით. S3 Uploads ამას აკეთებს კერძოდ მონიშნული attachment-ებისთვის. ეს მუშაობს, მაგრამ გვერდის ყოველი რენდერი სურათების სხვა URL-ებს აწარმოებს, რაც გვერდის caching-სა და ბრაუზერის caching-ს აზრს უკარგავს - კარგია წევრებისთვის განკუთვნილ ზონაში, ცუდია საჯარო საიტისთვის. Presigned URL-ები ხსნის მექანიკას და მის საზღვრებს.
  2. მიაწოდე მედია შენს კონტროლქვეშ მყოფი სერვერით, რომელიც გასაღებებს ინახავს და bucket-იდან იღებს - reverse proxy ან პატარა აპლიკაცია, რომელიც მოთხოვნებს ხელს აწერს. ეს ნამდვილი სამუშაოა და დამატებით ნახტომს ამატებს; აზრი ძირითადად მაშინ აქვს, როცა წვდომის კონტროლი ისედაც გჭირდება.
  3. გამოიყენე bucket როგორც backup-ის ასლი და არა როგორც მიწოდების ასლი. მედია ვებ სერვერზე შეინახე და ყოველ ღამე bucket-თან დაასინქრონე. მარტივი, საიმედო და URL-ების გადაწერის გარეშე.

კერძო საცავზე WordPress-ის საიტების უმეტესობისთვის მესამე ვარიანტია სწორი.

plugin-ები და მათი მორგებული endpoint-ის მხარდაჭერა#

ყოველ განხილვაში სამი plugin ჩნდება. ისინი ძირითადად იმით განსხვავდება, როგორ ექცევიან არა-AWS endpoint-ს.

Pluginსად კონფიგურირდებამორგებული S3 endpointPath-styleარსებული მედია
S3 Uploads (Human Made)wp-config.php და ფილტრიკი, s3_uploads_s3_client_params-ითკი, use_path_style_endpointWP-CLI ბრძანება
Advanced Media Offloaderკონსტანტები ან პარამეტრების გვერდიკი, ზოგადი S3-თავსებადი ოფციაკი, კონსტანტამასობრივი ხელსაწყო და WP-CLI
WP Offload Media (Lite/Pro)პარამეტრების გვერდი ან AS3CF_SETTINGSოფიციალურად არა; ფილტრებითიმავე ფილტრებითPro-ს მასობრივი ხელსაწყო

S3 Uploads დეველოპერის plugin-ია: პარამეტრების ეკრანი არ აქვს, ყველაფერი კოდშია, და ყენდება GitHub-იდან ან Composer-ით და არა plugin-ების კატალოგიდან. ის ყველაზე გამჭვირვალეა იმაში, რასაც აკეთებს, რაც მის debug-ს ყველაზე ადვილს ხდის. Advanced Media Offloader WordPress-ის plugin-ების კატალოგშია, აქვს ზოგადი S3-თავსებადი პროვაიდერის ოფცია endpoint-ით, დომენით და path-style-ის გადამრთველით, და შეუძლია ატვირთვის შემდეგ ლოკალური ასლები წაშალოს ("Full Cloud Migration") ან სათადარიგოდ შეინახოს. WP Offload Media ყველაზე ცნობილი სახელია; მისი Lite ვერსია ოფიციალურად უჭერს მხარს Amazon S3-ს, DigitalOcean Spaces-ს და Google Cloud Storage-ს, დეველოპერის საკუთარი პოზიცია სხვა S3-თავსებად სერვისებზე კი ისაა, რომ ისინი ფილტრებით სავარაუდოდ მუშაობს, მაგრამ გატესტილი არ არის. თუ მას უკვე AWS-ისთვის იყენებ, კარგია; მორგებული endpoint-ისთვის დანარჩენი ორიდან ერთი ნაკლებ წვალებას ითხოვს.

S3 Uploads-ის დაყენება მორგებული endpoint-ით#

დააყენე plugin მისი README-ის მიხედვით (Composer: composer require humanmade/s3-uploads, ან ჩამოტვირთე release wp-content/plugins-ში), შემდეგ დაამატე კონსტანტები wp-config.php-ში, "That's all, stop editing" ხაზის ზემოთ:

wp-config.php
define( 'S3_UPLOADS_BUCKET', 'media/wp' );          // bucket, optional prefixdefine( 'S3_UPLOADS_REGION', 'us-east-1' );         // any value the store acceptsdefine( 'S3_UPLOADS_KEY', getenv( 'S3_KEY' ) );define( 'S3_UPLOADS_SECRET', getenv( 'S3_SECRET' ) );define( 'S3_UPLOADS_BUCKET_URL', 'https://s3.example.com/media/wp' );define( 'S3_UPLOADS_HTTP_CACHE_CONTROL', 'public, max-age=31536000' );

endpoint და path-style-ის გადამრთველი პატარა must-use plugin-ში მიდის, რადგან ისინი SDK-ის კლიენტის ოფციებია და არა plugin-ის პარამეტრები:

wp-content/mu-plugins/s3-endpoint.php
<?phpadd_filter( 's3_uploads_s3_client_params', function ( $params ) {    $params['endpoint'] = 'https://s3.example.com';    $params['use_path_style_endpoint'] = true;    $params['request_checksum_calculation'] = 'when_required';    $params['response_checksum_validation'] = 'when_required';    return $params;} );

checksum-ის ორი ხაზი AWS SDK for PHP-ის ბოლო ვერსიებისთვისაა (3.337 და უფრო ახალი), რომლებიც მთლიანობის checksum-ებს ამატებს, რომლებსაც ზოგი S3-თავსებადი სერვერი უარყოფს; plugin-ის საკუთარი README მათ მესამე მხარის endpoint-ებისთვის გირჩევს. S3_UPLOADS_BUCKET_URL აყენებს საბაზისო URL-ს, რომელიც გვერდებში იწერება - path-style-ით ეს არის endpoint პლუს bucket და prefix. თუ შეგიძლია, გასაღები და საიდუმლო თავად ფაილში ნუ შეინახე, როგორც ზემოთ getenv() გამოძახებები აკეთებს; გარემოს ცვლადები და საიდუმლოები ხსნის, რატომ.

S3 Uploads ობიექტებზე ნაგულისხმევად public-read-ს აყენებს (S3_UPLOADS_OBJECT_ACL). საცავზე, რომელიც ACL-ებს არ ითვალისწინებს, ამ პარამეტრს ეფექტი არ აქვს, რაც ზემოთ აღწერილ საჯარო წვდომის ტესტთან გაბრუნებს.

სანამ დაეყრდნობი, დაყენება WP-CLI-ით შეამოწმე: wp s3-uploads verify ამოწმებს, შეუძლია თუ არა plugin-ს bucket-ში ჩაწერა და მისგან წაშლა.

არსებული ბიბლიოთეკის მიგრაცია#

ახალი ატვირთვები ავტომატურად გადადის. ყველაფერი, რაც plugin-ის ჩართვამდე აიტვირთა, არა, და ის პოსტები კვლავ wp-content/uploads-ზე მიუთითებს. მიგრაციას ორი ნახევარი აქვს: ფაილების კოპირება და URL-ების შეცვლა.

  1. ჯერ backup გააკეთე. მონაცემთა ბაზისა და wp-content/uploads-ის. URL-ის ცვლილება შენს მთელ შიგთავსში ძებნა-ჩანაცვლებაა.
  2. დააკოპირე ფაილები. S3 Uploads-ით: wp s3-uploads upload-directory wp-content/uploads uploads. Advanced Media Offloader-ით: მისი მასობრივი ხელსაწყო, ან wp advmo offload დიდი ბიბლიოთეკებისთვის.
  3. გადაწერე URL-ები შიგთავსში. offload plugin-ები ფილტრავს URL-ებს, რომლებსაც WordPress აგენერირებს, მაგრამ პოსტის შიგთავსში ჩასმული URL-ები უბრალო ტექსტია. მათ WP-CLI-ის search-replace აგვარებს: wp search-replace 'https://example.com/wp-content/uploads' 'https://s3.example.com/media/wp/uploads' --all-tables --dry-run, შემდეგ კი ისევ --dry-run-ის გარეშე. შეამოწმე, რომ სამიზნე გზა ემთხვევა იმას, სადაც შენი plugin ფაილებს სინამდვილეში ინახავს.
  4. შეამოწმე გვერდები. გახსენი რამდენიმე ძველი პოსტი და პროდუქტის გალერეა და ბრაუზერის network პანელში მოძებნე სურათები, რომლებიც კვლავ ძველი გზიდან იტვირთება.
  5. მხოლოდ ამის შემდეგ წაშალე ლოკალური ასლები, თუ დისკის დაბრუნება გინდა. შეინახე ისინი, სანამ დარწმუნებული არ იქნები.

მიგრაციის უკან დაბრუნება იგივე პროცესია საპირისპირო მიმართულებით, და ეს ლოკალური ასლების შენახვის უძლიერესი არგუმენტია: საიტი, რომლის მედიის ერთადერთი ასლი bucket-შია, ამ plugin-სა და ამ საცავზეა მიბმული.

backup-ები offload-ის შემდეგ#

ეს ის ცვლილებაა, რომელსაც ხალხი აღდგენისას აღმოაჩენს. შენი ვებ სერვერის backup-ები - პანელის backup-ები, backup plugin, საიტის tar - ახლა შეიცავს მონაცემთა ბაზას და კოდს, მაგრამ არა მედიას. bucket არის ერთადერთი სახლი ნებისმიერი ფაილისთვის, რომლის ლოკალური ასლიც წაიშალა.

RE:NODE-ზე S3 საცავი ერთ ასლს ინახავს NVMe-ზე ერთ ლოკაციაში, რეპლიკაციის გარეშე, და საცავის გეგმებს პანელის საკუთარი backup-ის სლოტები არ აქვს. ეს მიწოდების ასლისთვის ნორმალურია, თუ მეორე ასლს სხვა რამ ინახავს. მისი შენახვის ორი გზა:

  • შეინახე ლოკალური ასლები ვებ სერვერზე, რომ არსებული ვებ სერვერის backup-ები კვლავ შეიცავდეს მედიას.
  • დაასინქრონე bucket სხვაგან, მაგალითად rclone sync store:media/wp /backups/wp-media შენს კონტროლქვეშ მყოფ მანქანაზე, ან მეორე პროვაიდერთან, განრიგით.

ასევე გააკეთე plugin-ის პარამეტრების backup და, plugin-ებისთვის, რომლებიც გადატანილ ელემენტებს საკუთარ ცხრილში აღრიცხავენ, მონაცემთა ბაზისაც - ფაილების აღდგენა ამ ცხრილის გარეშე plugin-ს ტოვებს ისე, რომ არ იცის, სად არის რა. WordPress-ის ახალ ჰოსტზე გადატანა ღირს ამის გათვალისწინებით წაკითხვა; offload-იან საიტს გადასატანი ერთი ნაწილით მეტი აქვს.

გავრცელებული პრობლემები#

სურათები offload-ის შემდეგ 403-ს აბრუნებს. ობიექტები კერძოა და საცავი ანონიმურ წაკითხვას არ ემსახურება. იხილე საჯარო წვდომის სექცია; ან ხელმოწერილი URL-ები გამოიყენე, ან მედია ლოკალურად შეინახე.

ახალი ატვირთვები ხელმოწერის ან checksum-ის შეცდომით მარცხდება. SDK-ის უფრო ახალი ნაგულისხმევი checksum-ები; დაამატე ორი when_required ოფცია.

ზოგი სურათი კვლავ `wp-content/uploads`-იდან იტვირთება. შიგთავსში ან page builder-ის მონაცემებში ჩაწერილი URL-ები. გააკეთე search-replace, და page builder-ებისთვის, რომლებიც სერიალიზებულ მონაცემებს ინახავენ, გამოიყენე wp search-replace, რომელიც სერიალიზაციას სწორად ამუშავებს - უბრალო SQL REPLACE() მას აფუჭებს.

bucket-ში thumbnail-ები აკლია. ზომები, რომლებიც თემამ ან plugin-მა ორიგინალის ატვირთვის შემდეგ დააგენერირა, ყოველთვის არ გადადის. ხელახლა დააგენერირე thumbnail-ები, შემდეგ ამ ელემენტებისთვის plugin-ის offload თავიდან გაუშვი.

საიტი შენელდა. სურათების მოთხოვნები ახლა მეორე ჰოსტის სახელზე მიდის, საკუთარი კავშირითა და TLS handshake-ით. გრძელი Cache-Control header-ები განმეორებით ვიზიტებს ეხმარება; HTTP caching header-ები მნიშვნელობებს განიხილავს. შორეული ვიზიტორებისთვის ნამდვილი გამოსავალი CDN-ია მედიის ჰოსტის სახელის წინ.

FAQ#

აჩქარებს მედიის offload WordPress-ს?

თავისთავად არა. ვებ სერვერი სტატიკურ სურათებს ისედაც ეფექტურად ემსახურება, და bucket იმავე ლოკაციაში ვიზიტორებიდან იმავე მანძილზეა. offload დისკს ზოგავს და მრავალსერვერიან კონფიგურაციებს ეხმარება; სისწრაფე მოდის caching-იდან, სურათების ოპტიმიზაციიდან და CDN-იდან.

რომელი plugin მუშაობს S3-თავსებად endpoint-თან?

S3 Uploads, ფილტრით, რომელიც endpoint-სა და path-style-ს აყენებს, და Advanced Media Offloader, თავისი ზოგადი S3-თავსებადი ოფციით. WP Offload Media ფილტრებით შეიძლება ამუშავდეს, მაგრამ მორგებულ endpoint-ებს ოფიციალურად მხარს არ უჭერს.

უნდა წავშალო ლოკალური ასლები?

არა, და მათი შენახვა უფრო უსაფრთხოა. ლოკალური ასლები შენი ვებ სერვერის backup-ებს სრულს ტოვებს და შესაძლებელს ხდის plugin-ის გამორთვას სურათების დაკარგვის გარეშე. წაშალე ისინი მხოლოდ მაშინ, თუ დისკის ადგილი იყო offload-ის მიზეზი.

შემიძლია მხოლოდ ზოგიერთი ფაილის გადატანა?

plugin-ების უმეტესობა Media Library-ში ყველაფერს გადაიტანს. თუ bucket-ში მხოლოდ დიდი ჩამოსატვირთი ფაილები გინდა, ატვირთე ისინი პირდაპირ S3 კლიენტით, მიეცი ბმული და ბიბლიოთეკას ნუ შეეხები.

რა მოხდება, თუ plugin-ს გავთიშავ?

URL-ები wp-content/uploads-ს უბრუნდება. თუ ლოკალური ფაილები ისევ იქ არის, საიტი აგრძელებს მუშაობას; თუ წაიშალა, სურათები ფუჭდება, სანამ მათ bucket-იდან უკან არ დააკოპირებ და შიგთავსში შეცვლილ URL-ებს არ გადაწერ.


კომენტარები

სრულიად ანონიმურად: ანგარიშის, ელფოსტის და cookie-ის გარეშე. ინახება მხოლოდ სახელი, ტექსტი და დრო - სხვა არაფერი. ბმულების რაოდენობა ლიმიტირებულია.

0/2000