كيفية حفظ حركة المرور على خادم الويب



يستهلك مشروع ويب محمل تيرابايت من حركة المرور. بالنسبة للأعداد الكبيرة ، يمكن أن توفر المدخرات بنسبة 10-20٪ بشكل كبير الأموال وتساعد على عدم تجاوز الحصص.
ماذا أفعل إذا اقتربت حركة المرور بشكل خطير من حدود تعريفة الاستضافة الخاصة بك أو حتى تجاوزتها؟

في هذه المقالة ، سنقوم بتحليل التقنيات الأساسية التي تساعد على حفظ حركة المرور على خادم الويب.

اعصره!


أسهل طريقة للتوفير في حركة المرور هي ضغطها. يؤدي ذلك إلى تحميل معالج الخادم ، ولكنه يسمح لك بإرسال البيانات إلى العميل بشكل أسرع ، وتقليل حجمها ، بحيث يمكن إغلاق الاتصالات بشكل أسرع. في الغالب يتم استخدام الخوارزميات المتوافقة مع Deflate ، ولكن هناك أيضًا خوارزميات غريبة.

Gzip


خوارزمية الضغط الأكثر شيوعًا. ضغط بدون فقد ، مع نسبة ضغط جيدة (قابلة للتكوين من 1 إلى 9 ، الافتراضي 6) وتفريغ سريع. بسيطة وفعالة ومناسبة في معظم الحالات.



Nginx

gzip            on;
gzip_min_length 1000;
gzip_proxied    expired no-cache no-store private auth;
gzip_types      text/plain application/xml;

اباتشي

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

Zopfli


البديل الحديث لـ gzip يضغط بنسبة 3-8٪ أفضل ، ولكنه أبطأ بكثير (ينخفض ​​ضغطه على العميل بنفس السرعة). يعمل على Deflate ، وبالتالي فهو متوافق بنسبة 100٪ مع zlib ، كما أن الدعم في المتصفحات ممتلئ أيضًا.

git clone https://code.google.com/p/zopfli/
cd zopfli
make

Nginx

gzip_static     on;

بروتلي


مثل Zopfli ، تم تطويره في أحشاء Google. قادرة على الضغط ليس فقط في الإحصائيات ، ولكن أيضًا على الطاير ، مثل gzip. على عكس الخوارزميات السابقة ، فإنه لا يبحث فقط عن التكرارات في النص ، ولكن أيضًا يعين على الفور قاموسه الخاص ، والذي يحتوي على الكثير من العلامات وعبارات التعليمات البرمجية القياسية ، وهو فعال للغاية لضغط html / css / js: إذا كان Zopfli يعطي ضغطًا بنسبة 8٪ تقريبًا بعد gzip ، ثم Brotli قادر على رمي 10-15 ٪ أخرى ، بينما شخص آخر لديه 23 ٪! ولكن يتم دعمه فقط في https وهو غير متوافق مع zlib / deflate. نظام Caniuse مشجع: يتوفر دعم



Nginx

على شكل وحدة قياسية فقط في Plus ، ويجب بناء Nginx العادي مع وحدة خارجية ( --add-module = / path / to / ngx_brotli ):

git clone https://github.com/google/ngx_brotli.git
git clone https://github.com/bagder/libbrotli.git
./autogen.sh
./configure
make


cd /path/to/nginx
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-stream_geoip_module=dynamic --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed' --add-module=/path/to/ngx_brotli
make

التكوين:

brotli_static	on;

في الوضع الديناميكي:

brotli		on;
brotli_comp_level	6;
brotli_types	text/plain text/css text/xml application/x-javascript;

أباتشي

كل شيء أبسط هنا ، قم بتثبيت mod_brotli وتكوين الوحدة:

<IfModule brotli_module>
 BrotliCompressionLevel 10
 BrotliWindowSize 22
 AddOutputFilterByType BROTLI text/html text/plain text/css text/xml
 AddOutputFilterByType BROTLI text/css
 AddOutputFilterByType BROTLI application/x-javascript application/javascript
 AddOutputFilterByType BROTLI application/rss+xml
 AddOutputFilterByType BROTLI application/xml
 AddOutputFilterByType BROTLI application/json
 </IfModule>

مخبأ ذلك!


يمكنك أيضًا إلغاء تحميل القناة بين المستخدم والخادم ، مما يقلل الحاجة إلى إعادة تحميل الموارد. إذا تم تخزين الملف في الذاكرة المخبئية ، فعند الطلب التالي ، سيتلقى المتصفح محتوياته محليًا.

تسمح لك رؤوس HTTP للتحكم في ذاكرة التخزين المؤقت و Expires و Vary بتصميم سياسة تخزين مؤقت مرنة للغاية ، على الرغم من أنه يمكنك وضع حد أقصى للعمر = 2592000 في كل مكان على الجبهة.

Nginx

location ~* ^.+\.(js|css)$ {
	expires max;
}

اباتشي

<ifModule mod_headers.c>
    <FilesMatch "\.(html|htm)$">
        Header set Cache-Control "max-age=43200"
    </FilesMatch>
    <FilesMatch "\.(js|css|txt)$">
        Header set Cache-Control "max-age=604800"
    </FilesMatch>
    <FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
        Header set Cache-Control "max-age=2592000"
    </FilesMatch>
    <FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
        Header unset Cache-Control
    </FilesMatch>
</IfModule>
<ifModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 5 seconds"
    ExpiresByType image/x-icon "access plus 2592000 seconds"
    ExpiresByType image/jpeg "access plus 2592000 seconds"
    ExpiresByType image/png "access plus 2592000 seconds"
    ExpiresByType image/gif "access plus 2592000 seconds"
    ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
    ExpiresByType text/css "access plus 604800 seconds"
    ExpiresByType text/javascript "access plus 604800 seconds"
    ExpiresByType application/javascript "access plus 604800 seconds"
    ExpiresByType application/x-javascript "access plus 604800 seconds"
    ExpiresByType text/html "access plus 43200 seconds"
    ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>

وزعها!


عادة ما تكلف شبكة CDN الجيدة لموقع مزدحم الكثير من المال ، ولكن للمرة الأولى ، يكون الإصدار المجاني كافيًا. يمكن أن يؤدي تنزيل الموارد الثقيلة عبر CDN إلى تقليل عدد الزيارات عدة مرات! لا تهمل هذه الفرصة ، خاصة عندما تكون مجانية. هناك الكثير من المقالات لمرة واحدة مع أعلى الشبكات المجانية على الإنترنت ، ولكن Cloudflare دائمًا ما يأتي أولاً.



ولديهم أيضًا عمال خدمة مجانيون ، يمكنك من خلالهم رفع CDN يدويًا مع التفضيل والمحظيات. هناك أمثلة قليلة ، ولكن البرنامج التعليمي موجود على بوابة SW الرسمية.

استنتاج


إذا كنت لا تستخدم gzip على الأقل ، فمرحباً بك في الإنترنت ، هنا أكثر من 80٪ من المواقع تعمل معها. إذا لم يكن لديك ضغط قياسي كافٍ و -9 ، فاستخدم Brotli مع نسخة احتياطية على شكل Zopfli (نظرًا لأن Brotley ليس لديه تغطية 100٪ حتى الآن). هذا يمكن أن يوفر الكثير من حركة المرور:

  • gzip: ضغط 50-95٪ حسب المحتوى. متوسط ​​الويب 65-80٪
  • Zopfli: + 3-8٪ ضغط نسبة إلى gzip في المتوسط ​​، لكن يحدث 10٪
  • Brotli: ضغط بنسبة 10-15٪ نسبة إلى gzip اعتمادًا على المحتوى الذي يحتوي على لقطات نادرة تصل إلى 20٪ وأعلى

صورة

بيانات ذاكرة التخزين المؤقت على العميل ، وهذا يقلل من حركة المرور أثناء الزيارات المتكررة بنسبة 99٪ أو أقل ، اعتمادًا على سياسة التخزين المؤقت المحددة والتغييرات على الموقع.

استخدم CDN لتقديم المحتوى والموازنة الأساسية. يتحمل خادم التوزيع العبء الأكبر ، بينما سيتم تقليل حركة المرور الرئيسية عدة مرات. كم يعتمد بالضبط على الشبكة والحمل ووضع التشغيل المحدد.

كل ما سبق يحدث في أقصر وقت ممكن ولا يتطلب إعادة هيكلة معقدة لهيكل الخادم ، مما يمنحك الوقت لتصميمه المختص. قم بضغط التكاليف وتخزينها وتوزيعها ومراقبتها حتى لا تحصل على الكثير من المال.


All Articles