כיצד למטמן תוכן ב-NGINX

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

לקריאה נוספת: 10 כלים למטמון תוכן קוד פתוח מובילים עבור Linux

ניתן להשתמש ב NGINX כדי להאיץ שרתי מקור מקומיים על ידי הגדרתו למטמן תגובות משרתים בכיוון וגם כדי ליצור שרתי קצה עבור רשתות מסירת תוכן (CDNs). NGINX מפעיל חלק מה CDN הגדולים ביותר.

כאשר מוגדר כמטמן, NGINX יבצע:

  • מטמן תוכן סטטי ודינמי.
  • שיפור ביצועי תוכן דינמי עם מיקרו-מטמון.
  • שירות תוכן מיושן בזמן שליחה חוזרת לאימות ברקע לשיפור ביצועים.
  • שינוי או הגדרת כותרות Cache-Control, ועוד.

במאמר זה, תלמד איך להגדיר NGINX כ מטמון תוכן ב-Linux כדי להפעיל את שרתי האינטרנט שלך בצורה היעילה ביותר.

דרישות קדם:

עליך להתקין את NGINX בשרת Linux שלך, אם לא נעקב אחרי המדריכים הללו כדי להתקין את Nginx:

אחסון תוכן סטטי ב-Nginx

תוכן סטטי הוא תוכן באתר שנשאר זהה (לא משתנה) בין עמודים. דוגמאות לתוכן סטטי כוללות קבצים כמו תמונות, סרטונים, מסמכים; קבצי CSS וקבצי JavaScript.

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

ההגדרה הדוגמאית הבאה היא טובה ללכת, פשוט החלף www.example.com עם כתובת ה-URL של האתר שלך ובצע שינויים בנתיבים אחרים כפי שנדרש.

server {
    # substitute your web server's URL for www.example.com
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        try_files $uri =404;
        include fastcgi_params;
        # substitute the socket, or address and port, of your WordPress server
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
 	}   

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg
                  |jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid
                  |midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

אחסון תוכן דינמי ב-Nginx

NGINX משתמש במטמון קבוע במערכת הקבצים המקומית. לכן התחל על ידי יצירת ספריית הקובץ המקומית המתאימה לאחסון תוכן מטמון.
# mkdir -p /var/cache/nginx

בשלב הבא, הגדר את הבעלות המתאימה על הספריית המטמון. זה צריך להיות בבעלות המשתמש של NGINX (nginx) והקבוצה (nginx) כך:

# chown nginx:nginx /var/cache/nginx

כעת המשך לראות כיצד לאפשר תוכן דינמי ב-Nginx במקטע הבא.

אפשור FastCGI Cache ב-NGINX

FastCGI (או FCGI) הוא פרוטוקול נפוץ לפריסת יישומים אינטראקטיביים כמו PHP עם שרתי אינטרנט כמו NGINX. זהו הרחבה של CGI (ממשק שער נפוץ).

היתרון העיקרי של FCGI הוא שהוא ניהול מרובה של בקשות CGI בתוך תהליך יחיד. ללא זה, השרת צריך לפתוח תהליך חדש (שחייב להיות מבוקר, לעבד בקשה ולהיסגר) לכל בקשת לקוח עבור שירות.

כדי לעבד סקריפטים PHP באיחסון LEMP, NGINX משתמש ב־FPM (מנהל תהליך FastCGI) או PHP-FPM, יישום FastCGI לאלטרנטיבה פופולרית. לאחר שהתהליך PHP-FPM רץ, NGINX מוגדר לשלוח בקשות אליו לעיבוד. כך NGINX יכולה גם להגדיר למטה מנגנון למטה מטמון מתגלגל מהשרת היישום PHP-FPM.

בתוך NGINX, המטמון של תוכן FastCGI מוכר באמצעות הוראה שנקראת fastcgi_cache_path בהקשר http{} העליון, במבנה התצורה של NGINX. ניתן גם להוסיף את fastcgi_cache_key שמגדיר מפתח (זיהוי בקשה) למטמון.

בנוסף, כדי לקרוא את מצב המטמון העליון, הוסף את ההוראה add_header X-Cache-Status בתוך הקונטקסט http{} – זה מועיל למטרות ניפוי באגים.

בהנחה שקובץ תצורת בלוק השרת של האתר נמצא בנתיב /etc/nginx/conf.d/testapp.conf או /etc/nginx/sites-available/testapp.conf (באובונטו ונגזרותיה), פתח את קובץ ההגדרות והוסף את השורות הבאות בראש הקובץ.

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHEZONE:10m; inactive=60m max_size=40m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;
Enable FastCGI Cache in NGINX

ההוראה fastcgi_cache_path מגדירה את מספר הפרמטרים שם:

  • /var/cache/nginx – הנתיב לתיקיית הכונן הקשיח המקומית למטמון.
  • levels – מגדיר את רמות ההיררכיה של המטמון, וזה יוצר מבנה של ירושת תיקיות דו-שלבי תחת /var/cache/nginx.
  • keys_zone (name:size) – מאפשר יצירת אזור זיכרון משותף בו נשמרים כל המפתחות הפעילים והמידע על הנתונים (מטא). שים לב ששמירת המפתחות בזיכרון מאיצה את תהליך הבדיקה, על ידי קלות בהגדרה אם זו MISS או HIT, ללא בדיקה בדיסק.
  • inactive – מציין את כמות הזמן לאחריו הנתונים המטמונים שלא נגישו במהלך הזמן המסוים יימחקו מהמטמון ללא קשר לטריותם. ערך של 60m בהגדרת הדוגמה שלנו אומר שקבצים שלא נגישו אחרי 60 דקות יימחקו מהמטמון.
  • גודל_מקסימלי – מציין את הגודל המרבי של המטמון. ישנם פרמטרים נוספים שניתן להשתמש בהם כאן (ניתן לקרוא בתיעוד של NGINX למידע נוסף).

המשתנים בהוראת fastcgi_cache_key מתוארים להלן.

NGINX משתמשת בהם בחישוב המפתח (זיהוי) של בקשה. חשוב לציין, כדי לשלוח תגובה ממוטמנת ללקוח, הבקשה חייבת לכלול את אותו מפתח כמו תגובה מהמטמון.

  • $scheme – סכימת הבקשה, HTTP או HTTPS.
  • $request_method – שיטת הבקשה, בדרך כלל "GET" או "POST".
  • $host – זה יכול להיות שם מארח משורת הבקשה, או שם מארח משדר הבקשה "Host", או שם השרת התואם לבקשה, בסדר עדיפויות.
  • $request_uri – משמעותו המלאה של בקשת ה-URI המקורית (עם ארגומנטים).

כמו כן, המשתנה $upstream_cache_status בהוראת add_header X-Cache-Status מחושב עבור כל בקשה שבה נגיב NGINX, בין אם זו MISS (תגובה לא נמצאה במטמון, נלקחה משרת היישום) או HIT (תגובה ששורתה מהמטמון) או אחת מהערכים הנתמכים האחרים.

בנוסף, בתוך ההוראת location שמעבירה בקשות PHP ל-PHP-FPM, משתמשת בהוראות fastcgi_cache כדי להפעיל את המטמון שהגדרת עתה.

כן ניתן להגדיר זמן מטמון שונה עבור תגובות שונות באמצעות ההוראה fastcgi_cache_valid כפי שמוצג.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;
Define Caching Zone and Time

200, 301, ו-302 ישובים ממוצעים. אך ניתן גם לציין את התשובות באופן ספציפי או להשתמש ב-any (לכל קוד תגובה):

fastcgi_cache CACHEZONE;
fastcgi_cache_valid 200  301 203 60m;
fastcgi_cache_valid 404 10m;
OR
fastcgi_cache CACHEZONE;
fastcgi_cache_valid  any 10m;

כיוון מהיר של ביצועי המטמון FastCGI על Nginx

כדי להגדיר את מספר הפעמים המינימלי שבהן יש לבצע בקשה עם אותו מפתח לפני שהתגובה תימון, כלול את ההוראה fastcgi_cache_min_uses, באופן ספציפי בתוך ההקשר http{} או server{} או location{}.

fastcgi_cache_min_uses  3
Set Minimum Cache Usage

כדי לאפשר אימות מחדש של פריטי מטמון שפג תוקפם באמצעות בקשות תנאי עם שדות הכותרת "If-Modified-Since" ו-"If-None-Match", הוסף את ההוראה fastcgi_cache_revalidate, בתוך ההקשר http{} או server{} או location{}.

fastcgi_cache_revalidate on;
Set Cache Re-validation

ניתן גם להורות ל-NGINX למסור תוכן מטמון כאשר שרת המקור או שרת FCGI לא פעיל, באמצעות ההוראה proxy_cache_use_stale, בתוך ההוראת מיקום.

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

proxy_cache_use_stale error timeout http_500;
Enable Serving of Stale Data

אחד ההוראות השימושיות נוספות לכיוון מיצוי ביצועי האחסון המטמון FCGI היא fastcgi_cache_background_update שעובד בשיתוף עם ההוראה proxy_cache_use_stale. כאשר מוגדר כ- on, זה מורה ל-NGINX לספק תוכן מיושן כאשר לקוחות מבקשים קובץ שפג תוקפו או נמצא בתהליך עדכון מהשרת העליון.

fastcgi_cache_background_update on;
Enable Cache Background Update

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

fastcgi_cache_lock on;
Enable Cache Lock

לאחר ביצוע כל השינויים הללו בקובץ התצורה של NGINX, שמור וסגור אותו. לאחר מכן בדוק את מבנה התצורה לאיתור שגיאות תחביר לפני הפעלת שירות ה-NGINX מחדש.

# nginx -t
# systemctl restart nginx
Check and Start Nginx Service

בשלב הבא, בדוק אם המטמון פועל כראוי, נסה לגשת ליישום האינטרנט או האתר שלך באמצעות הפקודת curl הבאה (הפעם הראשונה צריך להצביע על MISS, אך בקשות עתידיות צריכות להצביע על HIT כפי שמוצג בתמונה).

# curl -I http://testapp.tecmint.com
Test FastCGI Cache

הנה תמונת מסך נוספת המציגה את NGINX מספקת נתונים מיושנים.

Test Nginx Serving Stale Data

הוספת יוצאים לעצירת המטמון

ניתן להגדיר תנאים בהם NGINX לא ישלח תגובות מטמונות ללקוחות, באמצעות ההוראה fastcgi_cache_bypass. וכדי להורות ל־NGINX שלא לשמור תגובות מהשרת העליון בכלל, יש להשתמש ב־fastcgi_no_cache.

לדוגמה, אם ברצונך שבקשות POST וכתובות URL עם מחרוזת שאילתה ימשיכו לעבור תמיד אל PHP. ראשית, יש להצהיר על הצהרת if כדי להגדיר את התנאי כך.

set $skip_cache 0; 
if ($request_method = POST) { 
	set $skip_cache 1; 
} 

לאחר מכן להפעיל את היוצא מן הכלל שלמעלה בהוראת location שמעבירה בקשות PHP אל PHP-FPM, באמצעות ההוראות fastcgi_cache_bypass ו־fastcgi_no_cache.

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

ישנם חלקים רבים אחרים באתר שלך שאולי לא תרצה לאפשר להם מטמון תוכן. הנה דוגמה להגדרת NGINX לשיפור ביצועי אתר WordPress, המוצגת בבלוג של nginx.com.

כדי להשתמש בזה, יש לבצע שינויים (כמו הדומיין, הנתיבים, שמות הקבצים וכו') כדי לשקף את מה שקיים בסביבתך.

fastcgi_cache_path /var/run/NGINX-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m; 
fastcgi_cache_key "$scheme$request_method$host$request_uri"; 
server { 
	server_name example.com www.example.com; 
	root /var/www/example.com; 
	index index.php; 
	access_log /var/log/NGINX/example.com.access.log; 
	error_log /var/log/NGINX/example.com.error.log; 
	set $skip_cache 0; 
	# POST requests and URLs with a query string should always go to PHP 	
	if ($request_method = POST) { 
		set $skip_cache 1; 
	} 
	if ($query_string != "") {
		set $skip_cache 1; 
	} 
	# Don't cache URIs containing the following segments 
	if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php |sitemap(_index)?.xml") { 
		set $skip_cache 1; 
	} 
	# Don't use the cache for logged-in users or recent commenters 
	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass |wordpress_no_cache|wordpress_logged_in") {
		set $skip_cache 1; 
	} 
	location / { 
		try_files $uri $uri/ /index.php?$args; 
	} 
	location ~ .php$ { 
		try_files $uri /index.php; 
		include fastcgi_params; 
		fastcgi_pass unix:/var/run/php5-fpm.sock; 
		fastcgi_cache_bypass $skip_cache; 
		fastcgi_no_cache $skip_cache; 
		fastcgi_cache WORDPRESS; 
		fastcgi_cache_valid 60m; 
	} 
	location ~ /purge(/.*) {
		fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1"; 
	} 
	location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg |gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi |wav|bmp|rtf)$ { 
		access_log off; 
		log_not_found off; 
		expires max; 
	} 
	location = /robots.txt { 
		access_log off; 
		log_not_found off; 
	}
	location ~ /. { 
		deny all; 
		access_log off; 
		log_not_found off; 
	} 
}

הפעלת מטמון פרוקסי ב־NGINX

NGINX תומך גם במטמון של תגובות משרתים פרוקסיים אחרים (הוגדרים על ידי ההוראה proxy_pass). למקרה הניסיון הזה, אנו משתמשים ב־NGINX כפרוקסי הפוך עבור אפליקצית האינטרנט של Node.js, כך שנפעיל את NGINX כמטמון עבור אפליקציית Node.js. כל ההוראות להגדרה המשמשות כאן ישמעו כמו ההוראות המהירות CGI בקטע הקודם, ולכן לא נסביר אותן שוב.

כדי לאפשר אחסון מטמון של תגובות משרת פרוקסי, כלול את ההוראה proxy_cache_path בהקשר העליון http{}. להגדיר איך בקשות מאוחסנות, תוכל גם להוסיף את ההוראה proxy_cache_key כך:

proxy_cache_path /var/cache/nginx app1 keys_zone=PROXYCACHE:100m inactive=60m max_size=500m;
proxy_cache_key  "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_min_uses 3;

לאחר מכן, הפעל את המטמון בהוראת המיקום.

location / {
	proxy_pass http://127.0.0.1:3000;
	proxy_cache        PROXYCACHE;
	proxy_cache_valid 200 302 10m;
	proxy_cache_valid 404      1m;
}

כדי להגדיר תנאים תחת הם NGINX לא שולח בתוכן מהמטמון ולא אחסון תגובה בכלל מהשרת upstream, כלול את ההוראות proxy_cache_bypass ו- proxy_no_cache.

 
proxy_cache_bypass  $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache        $http_pragma $http_authorization;

ייעודף את ביצועי מטמון פרוקסי

ההוראות הבאות שימושיות לצורך כיוונון מופעל על ביצועי המטמון פרוקסי. יש להם אותו משמעות כמו הוראות FastCGI.

proxy_cache_min_uses 3;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500;
proxy_cache_background_update on;
proxy_cache_lock on;

למידע נוסף והוראות תצורת מטמון, ראה את תיעוד המודולים העיקריים שניים ngx_http_fastcgi_module ו- ngx_http_proxy_module.

משאבים נוספים: התקן מטמון התוכן של NGINX ו- טיפים לשיפור ביצועי WordPress.

Source:
https://www.tecmint.com/cache-content-with-nginx/