{"id":4384,"date":"2020-03-06T12:09:46","date_gmt":"2020-03-06T05:09:46","guid":{"rendered":"https:\/\/tino.vn\/?post_type=ht_kb&#038;p=4384"},"modified":"2020-03-06T12:10:32","modified_gmt":"2020-03-06T05:10:32","slug":"nginx-advance-caching","status":"publish","type":"ht_kb","link":"https:\/\/tino.vn\/blog\/docs\/nginx-advance-caching\/","title":{"rendered":"Nginx Advance: Caching"},"content":{"rendered":"<p><strong><span style=\"font-size: 24pt;\">Gi\u1edbi thi\u1ec7u<\/span><\/strong><\/p>\n<p>Ch\u00fang ta \u0111\u1ec1u bi\u1ebft r\u1eb1ng performance c\u1ee7a c\u00e1c applications v\u00e0 website l\u00e0 y\u1ebfu t\u1ed1 r\u1ea5t quan tr\u1ecdng trong m\u00f4i tr\u01b0\u1eddng internet hi\u1ec7n t\u1ea1i. Tuy nhi\u00ean, qu\u00e1 tr\u00ecnh l\u00e0m cho applications v\u00e0 website c\u1ee7a b\u1ea1n ho\u1ea1t \u0111\u1ed9ng t\u1ed1t h\u01a1n, kh\u00f4ng ph\u1ea3i l\u00fac n\u00e0o c\u0169ng d\u1ec5 d\u00e0ng. Ch\u1ea5t l\u01b0\u1ee3ng m\u00e3 ngu\u1ed3n v\u00e0 c\u01a1 s\u1edf h\u1ea1 t\u1ea7ng t\u1ea5t nhi\u00ean l\u00e0 r\u1ea5t quan tr\u1ecdng. Nh\u01b0ng trong nhi\u1ec1u tr\u01b0\u1eddng h\u1ee3p, b\u1ea1n c\u00f3 th\u1ec3 c\u1ea3i thi\u1ec7n tr\u1ea3i nghi\u1ec7m ng\u01b0\u1eddi d\u00f9ng cu\u1ed1i c\u1ee7a \u1ee9ng d\u1ee5ng b\u1eb1ng c\u00e1ch t\u1eadp trung v\u00e0o m\u1ed9t s\u1ed1 k\u1ef9 thu\u1eadt r\u1ea5t c\u01a1 b\u1ea3n nh\u01b0 caching. B\u00e0i vi\u1ebft n\u00e0y s\u1ebd gi\u1edbi thi\u1ec7u v\u00e0 h\u01b0\u1edbng d\u1eabn b\u1ea1n s\u1eed d\u1ee5ng k\u1ef9 thu\u1eadt caching tr\u00ean Nginx \u0111\u1ec3 n\u00e2ng cao performance h\u1ec7 th\u1ed1ng v\u00e0 tr\u1ea3i nghi\u1ec7m ng\u01b0\u1eddi d\u00f9ng t\u1ed1t h\u01a1n.<\/p>\n<p><em><strong>Kh\u00e1i ni\u1ec7m Caching<\/strong><\/em><\/p>\n<p>Ch\u00fang ta x\u00e9t \u0111\u1ebfn v\u00ed d\u1ee5 v\u1ec1 qu\u00e1 tr\u00ecnh d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c trao \u0111\u1ed5i gi\u1eefa client v\u00e0 server\u00a0 v\u1edbi c\u00e1c ph\u1ea3n h\u1ed3i HTTP nh\u01b0 sau. H\u00e3y b\u1eaft \u0111\u1ea7u v\u1edbi t\u00ecnh hu\u1ed1ng\u00a0 kh\u00f4ng c\u00f3 b\u1ed9 nh\u1edb cache, tr\u00f4ng gi\u1ed1ng nh\u01b0 th\u1ebf n\u00e0y.<\/p>\n<p><img decoding=\"async\" class=\"post__image--spacy aligncenter\" src=\"https:\/\/tino.vn\/blog\/wp-content\/uploads\/2020\/03\/initial-situation-request.png\" alt=\"Nginx Cache: y\u00eau c\u1ea7u \u1ee9ng d\u1ee5ng t\u00ecnh hu\u1ed1ng ban \u0111\u1ea7u\" width=\"301\" height=\"60\" title=\"\"><\/p>\n<p>Ng\u01b0\u1eddi d\u00f9ng th\u1ef1c hi\u1ec7n m\u1ed9t request cho \u1ee9ng d\u1ee5ng v\u00e0 nh\u1eadn \u0111\u01b0\u1ee3c respone.<\/p>\n<p><img decoding=\"async\" class=\"post__image--spacy aligncenter\" src=\"https:\/\/tino.vn\/blog\/wp-content\/uploads\/2020\/03\/initial-situation-response.png\" alt=\"Nginx Cache: ph\u1ea3n \u1ee9ng \u1ee9ng d\u1ee5ng t\u00ecnh hu\u1ed1ng ban \u0111\u1ea7u\" width=\"301\" height=\"60\" title=\"\"><\/p>\n<p>Th\u00eam cache v\u00e0o k\u1ecbch b\u1ea3n n\u00e0y l\u00e0 m\u1ed9t c\u00e1ch \u0111\u01a1n gi\u1ea3n \u0111\u1ec3 c\u1ea3i thi\u1ec7n hi\u1ec7u su\u1ea5t, t\u00ednh \u0111\u00e1p \u1ee9ng cao h\u01a1n. N\u00f3 ho\u1ea1t \u0111\u1ed9ng b\u1eb1ng c\u00e1ch l\u01b0u c\u00e1c respone t\u1eeb m\u00e1y ch\u1ee7 ho\u1eb7c \u1ee9ng d\u1ee5ng v\u00e0o ram ho\u1eb7c disk.<\/p>\n<p>H\u00e3y xem x\u00e9t t\u00ecnh hu\u1ed1ng \u0111\u01a1n gi\u1ea3n n\u00e0y.\u00a0M\u00e1y kh\u00e1ch th\u1ef1c hi\u1ec7n m\u1ed9t request cho App nh\u01b0 trong v\u00ed d\u1ee5 tr\u01b0\u1edbc nh\u01b0ng l\u1ea7n n\u00e0y\u00a0 \u0111i qua cache.<\/p>\n<p><img decoding=\"async\" class=\"post__image--spacy aligncenter\" src=\"https:\/\/tino.vn\/blog\/wp-content\/uploads\/2020\/03\/caching-intro-first-request.png\" alt=\"Nginx Cache: y\u00eau c\u1ea7u gi\u1edbi thi\u1ec7u b\u1ed9 nh\u1edb \u0111\u1ec7m\" width=\"466\" height=\"60\" title=\"\"><\/p>\n<p>App tr\u1ea3 v\u1ec1 respone \u00a0\u0111\u1ebfn m\u00e1y kh\u00e1ch nh\u01b0ng n\u00f3 c\u0169ng l\u01b0u respone tr\u00ean disk.<\/p>\n<p><img decoding=\"async\" class=\"post__image--spacy aligncenter\" src=\"https:\/\/tino.vn\/blog\/wp-content\/uploads\/2020\/03\/caching-intro-first-response.png\" alt=\"Nginx Cache: ph\u1ea3n h\u1ed3i gi\u1edbi thi\u1ec7u b\u1ed9 nh\u1edb \u0111\u1ec7m\" width=\"466\" height=\"200\" title=\"\"><\/p>\n<p>L\u1ea7n t\u1edbi, ng\u01b0\u1eddi d\u00f9ng th\u1ef1c hi\u1ec7n c\u00f9ng m\u1ed9t request v\u00e0 h\u1ec7 th\u1ed1ng\u00a0 ki\u1ec3m tra cache c\u00f3 respone t\u01b0\u01a1ng \u1ee9ng kh\u00f4ng.<\/p>\n<p><img decoding=\"async\" class=\"post__image--spacy aligncenter\" src=\"https:\/\/tino.vn\/blog\/wp-content\/uploads\/2020\/03\/caching-intro-second-request.png\" alt=\"Nginx Cache: y\u00eau c\u1ea7u gi\u1edbi thi\u1ec7u b\u1ed9 nh\u1edb \u0111\u1ec7m\" width=\"466\" height=\"200\" title=\"\"><\/p>\n<p>V\u00e0 n\u1ebfu \u0111\u00f3 l\u00e0 tr\u01b0\u1eddng h\u1ee3p request \u0111\u00e3 \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n tr\u01b0\u1edbc \u0111\u00f3 v\u00e0 h\u1ec7 th\u1ed1ng c\u00f3 l\u01b0u respone \u0111\u00e3 x\u01b0 l\u00fd, n\u00f3 s\u1ebd ph\u1ea3n h\u1ed3i ngay l\u1eadp t\u1ee9c cho ng\u01b0\u1eddi d\u00f9ng, b\u1eb1ng c\u00e1ch ph\u1ee5c v\u1ee5 n\u1ed9i dung \u0111\u01b0\u1ee3c l\u01b0u trong b\u1ed9 nh\u1edb cache n\u00e0y.<\/p>\n<p><img decoding=\"async\" class=\"post__image--spacy aligncenter\" src=\"https:\/\/tino.vn\/blog\/wp-content\/uploads\/2020\/03\/caching-intro-second-response.png\" alt=\"Nginx Cache: ph\u1ea3n h\u1ed3i gi\u1edbi thi\u1ec7u b\u1ed9 nh\u1edb \u0111\u1ec7m\" width=\"466\" height=\"200\" title=\"\"><\/p>\n<p>L\u01b0u \u00fd l\u00e0 \u0111\u1ed1i v\u1edbi request \u0111\u01b0\u1ee3c m\u00e1y ch\u1ee7 ph\u1ee5c v\u1ee5 tr\u1ef1c ti\u1ebfp t\u1eeb cache m\u00e0 kh\u00f4ng c\u1ea7n ph\u1ea3i th\u00f4ng qua App.<\/p>\n<p>Caching s\u1ebd th\u00eam ph\u1ee9c t\u1ea1p cho h\u1ec7 th\u1ed1ng nh\u01b0ng n\u00f3 \u0111i k\u00e8m v\u1edbi nh\u1eefng <strong>l\u1ee3i \u00edch<\/strong>\u00a0tuy\u1ec7t v\u1eddi\u00a0:<\/p>\n<ul>\n<li><strong>C\u1ea3i thi\u1ec7n hi\u1ec7u su\u1ea5t trang web<\/strong> &#8211; c\u00e1c y\u00eau c\u1ea7u kh\u00f4ng ph\u1ea3i tr\u1ea3i qua to\u00e0n b\u1ed9 qu\u00e1 tr\u00ecnh x\u1eed l\u00fd t\u1eeb \u0111\u1ea7u.<\/li>\n<li><strong>T\u0103ng kh\u1ea3n n\u0103ng ch\u1ecbu t\u1ea3i<\/strong> &#8211; b\u1eb1ng c\u00e1ch gi\u1ea3m t\u1ea3i tr\u00ean c\u00e1c m\u00e1y ch\u1ee7 g\u1ed1c khi kh\u00f4ng ph\u1ea3i x\u1eed l\u00fd nhi\u1ec1u request gi\u1ed1ng nhau.<\/li>\n<li><strong>Mang l\u1ea1i t\u00ednh kh\u1ea3 d\u1ee5ng cao h\u01a1n<\/strong> &#8211; b\u1eb1ng c\u00e1ch ph\u1ee5c v\u1ee5 n\u1ed9i dung c\u0169(\u0111\u01b0\u1ee3c cache) khi m\u00e1y ch\u1ee7 kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong><span style=\"font-size: 24pt;\">Cache v\u1edbi Nginx<\/span><\/strong><\/p>\n<p>Nginx l\u00e0 m\u1ed9t m\u00e1y ch\u1ee7 HTTP v\u00e0 th\u1eadt tuy\u1ec7t v\u1eddi khi ph\u1ee5c v\u1ee5 c\u00e1c t\u1ec7p t\u0129nh v\u00e0 y\u00eau c\u1ea7u \u1ee7y quy\u1ec1n.\u00a0Do t\u00ednh ch\u1ea5t kh\u00f4ng \u0111\u1ed3ng b\u1ed9 c\u1ee7a n\u00f3, n\u00f3 n\u1ed5i b\u1eadt v\u1edbi vi\u1ec7c s\u1eed d\u1ee5ng t\u00e0i nguy\u00ean tr\u1ecdng l\u01b0\u1ee3ng nh\u1eb9.<\/p>\n<p>Cache tr\u00ean Nginx h\u1ed7 tr\u1ee3 cho<\/p>\n<ul>\n<li>M\u00e1y ch\u1ee7 HTTP<\/li>\n<li>FastCGI<\/li>\n<li>uwsgi<\/li>\n<li>SCGI<\/li>\n<\/ul>\n<p>\u0110\u1ec3 b\u1eadt c\u01a1 ch\u1ebf caching, ta c\u1ea7n ph\u1ea3i th\u00eam ch\u1ec9 th\u1ecb\u00a0<strong><em>proxy_cache_path<\/em><\/strong>\u00a0trong block\u00a0<strong><em>http { }<\/em><\/strong><\/p>\n<div id=\"crayon-5e604c3526afc960285747\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">http {\r\n    ...\r\n    proxy_cache_path \/data\/nginx\/cache keys_zone=one:10m;\r\n}<\/pre>\n<p>\u0111\u1ec3 k\u00edch ho\u1ea1t ch\u00fang ta c\u1ea7n c\u1ea5u h\u00ecnh th\u00eam ch\u1ec9 th\u1ecb cache <strong><em>proxy_cache<\/em><\/strong><\/p>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">http {\r\n    ...\r\n    proxy_cache_path \/data\/nginx\/cache keys_zone=one:10m;\r\n    server {\r\n        proxy_cache mycache;\r\n        location \/ {\r\n            proxy_pass http:\/\/localhost:8000;\r\n        }\r\n    }\r\n}<\/pre>\n<p><span style=\"font-size: 18pt;\"><strong>Nginx qu\u1ea3n l\u00fd cache nh\u01b0 th\u1ebf n\u00e0o<\/strong><\/span><\/p>\n<p>C\u00f3 2 ti\u1ebfn tr\u00ecnh c\u1ee7a Nginx qu\u1ea3n l\u00fd b\u1ed9 nh\u1edb cache(cache load):<\/p>\n<ul>\n<li><strong>Cache manager<\/strong>: \u0111\u01b0\u1ee3c k\u00edch ho\u1ea1t \u0111\u1ecbnh k\u1ef3 \u0111\u1ec3 ki\u1ec3m tra tr\u1ea1ng th\u00e1i c\u1ee7a cache. N\u1ebfu k\u00edch th\u01b0\u1edbc c\u1ee7a cache v\u01b0\u1ee3t qu\u00e1 gi\u00e1 tr\u1ecb\u00a0<strong><em>max_size<\/em>\u00a0<\/strong>th\u00ec cache manager s\u1ebd x\u00f3a b\u1ecf ph\u1ea7n d\u1eef li\u1ec7u \u00edt \u0111\u01b0\u1ee3c truy c\u1eadp nh\u1ea5t.<\/li>\n<li><strong>Cache loader<\/strong>: ti\u1ebfn tr\u00ecnh n\u00e0y ch\u1ec9 ho\u1ea1t \u0111\u1ed9ng duy nh\u1ea5t m\u1ed9t l\u1ea7n ngay khi Nginx kh\u1edfi \u0111\u1ed9ng. N\u00f3 c\u00f3 nhi\u1ec7m v\u1ee5 n\u1ea1p\u00a0<strong>metadata<\/strong>\u00a0c\u1ee7a d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c cache tr\u01b0\u1edbc \u0111\u00f3 v\u00e0o b\u1ed9 nh\u1edb chung. N\u1ea1p l\u1ea1i to\u00e0n b\u1ed9 cache khi nginx kh\u1edfi \u0111\u1ed9ng s\u1ebd l\u00e0m ch\u1eadm Nginx, \u0111\u1ec3 gi\u1ea3m thi\u1ec3u vi\u1ec7c n\u00e0y, ta c\u00f3 th\u1ec3 c\u1ea5u h\u00ecnh load cache tu\u1ea7n t\u1ef1 theo th\u1eddi gian, m\u1ed7i l\u1ea7n s\u1ebd load m\u1ed9t ph\u1ea7n cache l\u00ean.<\/li>\n<\/ul>\n<p>C\u00e1c th\u00f4ng s\u1ed1 \u0111\u1ec3 c\u1ea5u h\u00ecnh vi\u1ec7c cache load trong nginx<\/p>\n<ul>\n<li><strong>loader_threshold<\/strong>\u00a0\u2013 Th\u1eddi gian m\u1ed7i l\u1ea7n n\u1ea1p cache (miliseconds)<\/li>\n<li><strong>loader_files<\/strong>\u00a0\u2013 S\u1ed1 l\u01b0\u1ee3ng file t\u1ed1i \u0111a nginx n\u1ea1p trong m\u1ed7i l\u1ea7n (m\u1eb7c \u0111\u1ecbnh l\u00e0 100).<\/li>\n<li><strong>loader_sleeps<\/strong>\u00a0\u2013 Th\u1eddi gian gi\u1eefa m\u1ed7i l\u1ea7n n\u1ea1p cache (miliseconds), m\u1eb7c \u0111\u1ecbnh l\u00e0 50ms.<\/li>\n<\/ul>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">Trong v\u00ed d\u1ee5 sau, nginx s\u1ebd l\u1eb7p l\u1ea1i vi\u1ec7c load cache m\u1ed7i 300 mili gi\u00e2y ho\u1eb7c cho \u0111\u1ebfn khi 200 m\u1ee5c \u0111\u01b0\u1ee3c t\u1ea3i:<\/p>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_path \/data\/nginx\/cache keys_zone=one:10m loader_threshold=300 loader_files=200;<\/pre>\n<p><strong><span style=\"font-size: 18pt;\">What\/When\u00a0 to\u00a0cache?<\/span><\/strong><\/p>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">Theo m\u1eb7c \u0111\u1ecbnh, Nginx ch\u1ec9 l\u01b0u tr\u1eef c\u00e1c y\u00eau c\u1ea7u GET v\u00e0 HEAD. B\u1ea1n c\u00f3 th\u1ec3 thay \u0111\u1ed5i \u0111i\u1ec1u n\u00e0y b\u1eb1ng ch\u1ec9 th\u1ecb proxy_cache_methods<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_methods GET HEAD POST;<\/pre>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">B\u1ea1n c\u0169ng c\u00f3 th\u1ec3 h\u01b0\u1edbng d\u1eabn Nginx l\u01b0u tr\u1eef ph\u1ea3n h\u1ed3i ch\u1ec9 sau khi \u0111\u01b0\u1ee3c y\u00eau c\u1ea7u \u00edt nh\u1ea5t 5 l\u1ea7n.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_min_uses 5;<\/pre>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">\u0110i\u1ec1u n\u00e0y s\u1ebd h\u1eefu \u00edch trong tr\u01b0\u1eddng h\u1ee3p b\u1ea1n c\u00f3 nhi\u1ec1u n\u1ed9i dung, nh\u01b0ng b\u1ea1n ch\u1ec9 mu\u1ed1n l\u01b0u tr\u1eef nh\u1eefng y\u00eau c\u1ea7u th\u1ef1c s\u1ef1 ph\u1ed5 bi\u1ebfn.<\/p>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">Nginx c\u00f3 th\u1ec3 ti\u1ebft ki\u1ec7m b\u0103ng th\u00f4ng disk I\/O. B\u1eb1ng c\u00e1ch t\u00f4n tr\u1ecdng c\u00e1c cache headers v\u00e0 m\u00e3 http 304, c\u00e1c ph\u1ea3n h\u1ed3i kh\u00f4ng \u0111\u01b0\u1ee3c s\u1eeda \u0111\u1ed5i, Nginx s\u1ebd kh\u00f4ng t\u1ea3i l\u1ea1i n\u1ed9i dung n\u1ebfu ch\u1ec9 th\u1ecb sau \u0111\u01b0\u1ee3c b\u1eadt:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_revalidate on;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><strong><span style=\"font-size: 18pt;\">C\u00e1ch ch\u1ec9 \u0111\u1ecbnh nh\u1eefng y\u00eau c\u1ea7u \u0111\u1ec3 l\u01b0u tr\u1eef<\/span><\/strong><\/p>\n<div class=\"ddict_div\">\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">V\u1edbi Nginx, ch\u00fang t\u00f4i kh\u00f4ng gi\u1edbi h\u1ea1n b\u1ed9 nh\u1edb cache m\u1ecdi th\u1ee9 theo c\u00f9ng m\u1ed9t quy t\u1eafc. Thay v\u00e0o \u0111\u00f3, ch\u00fang ta c\u00f3 th\u1ec3 cho Nginx bi\u1ebft th\u00f4ng tin n\u00e0o s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o kh\u00f3a b\u0103m. V\u00e0 ch\u00fang t\u00f4i c\u00f3 th\u1ec3 l\u00e0m \u0111i\u1ec1u \u0111\u00f3 \u1edf c\u1ea5p \u0111\u1ed9 http, m\u00e1y ch\u1ee7 ho\u1eb7c v\u1ecb tr\u00ed. \u0110\u00e2y l\u00e0 hai v\u00ed d\u1ee5:<\/p>\n<\/div>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_key \"$host$request_uri$cookie_user\";<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_key \"$scheme$proxy_host$uri$is_args$args\";<\/pre>\n<p>Ho\u0103c c\u0169ng c\u00f3 th\u1ec3 n\u00f3i v\u1edbi Nginx, trong nh\u1eefng \u0111i\u1ec1u ki\u1ec7n n\u00e0o th\u00ec y\u00eau c\u1ea7u kh\u00f4ng n\u00ean \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef trong b\u1ed9 \u0111\u1ec7m.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_no_cache $http_pragma $http_authorization $cookie_nocache $arg_nocache;<\/pre>\n<h3 id=\"How_long_to_cache?\"><span style=\"font-size: 18pt;\"><strong>How long to cache?<\/strong><\/span><\/h3>\n<p>C\u00f3 m\u1ed9t v\u00e0i ch\u1ec9 th\u1ecb \u0111\u01a1n gi\u1ea3n cho Nginx bi\u1ebft th\u1eddi gian l\u01b0u tr\u1eef c\u00e1c ph\u1ea3n h\u1ed3i c\u1ee7a m\u1ed9t lo\u1ea1i nh\u1ea5t \u0111\u1ecbnh:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_valid any      1m;\r\nproxy_cache_valid 200 302 10m;<\/pre>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">Nh\u01b0ng ch\u1ee7 y\u1ebfu l\u00e0 c\u00e1c header c\u1ee7a m\u00e1y ch\u1ee7 g\u1ed1c x\u00e1c \u0111\u1ecbnh kh\u1ea3 n\u0103ng l\u01b0u tr\u1eef c\u1ee7a n\u1ed9i dung:<\/p>\n<\/div>\n<ul>\n<li>Expires<\/li>\n<li>Cache-Control<\/li>\n<li>X-Accel-Expires &#8211; Nginx special header.<br \/>\n<strong>Overrides other headers<\/strong>. Used when you need to serve different headers to the client.<\/li>\n<\/ul>\n<p>M\u1ee9c \u0111\u1ed9 \u01b0u ti\u00ean c\u1ee7a c\u00e1c t\u00f9y ch\u1ecdn \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp \u0111\u01b0\u1ee3c tr\u00ecnh b\u00e0y tr\u00ean bi\u1ec3u \u0111\u1ed3 b\u00ean d\u01b0\u1edbi, v\u1edbi m\u1ee9c \u0111\u1ed9 \u01b0u ti\u00ean m\u1ea1nh nh\u1ea5t \u1edf tr\u00ean c\u00f9ng:<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/tino.vn\/blog\/wp-content\/uploads\/2020\/03\/nginx-cache-priority.png\" alt=\"Nginx Caching: caching headers priority\" title=\"\"><\/p>\n<p><em><strong>M\u1ed9t s\u1ed1 ch\u1ec9 th\u1ecb kh\u00e1c<\/strong><\/em><\/p>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">C\u00e1c t\u00f9y ch\u1ecdn sau \u0111\u00e2y th\u00eam r\u1ea5t nhi\u1ec1u v\u00e0o c\u00e1c y\u1ebfu t\u1ed1 s\u1eb5n c\u00f3. N\u00f3 cho ph\u00e9p Nginx ph\u1ee5c v\u1ee5 n\u1ed9i dung c\u0169 (c\u0169, h\u1ebft h\u1ea1n) khi ph\u1ea3n h\u1ed3i c\u1ee7a \u1ee9ng d\u1ee5ng h\u1ebft th\u1eddi gian ho\u1eb7c tr\u1ea3 v\u1ec1 m\u00e3 tr\u1ea1ng th\u00e1i 50x:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_use_stale error timeout;<\/pre>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">V\u1edbi proxy_cache_lock \u0111\u01b0\u1ee3c b\u1eadt, n\u1ebfu nhi\u1ec1u m\u00e1y kh\u00e1ch y\u00eau c\u1ea7u m\u1ed9t t\u1ec7p kh\u00f4ng c\u00f3 trong b\u1ed9 \u0111\u1ec7m (MISS), ch\u1ec9 nh\u1eefng y\u00eau c\u1ea7u \u0111\u1ea7u ti\u00ean trong s\u1ed1 \u0111\u00f3 m\u1edbi \u0111\u01b0\u1ee3c ph\u00e9p th\u00f4ng qua m\u00e1y ch\u1ee7 g\u1ed1c. C\u00e1c y\u00eau c\u1ea7u c\u00f2n l\u1ea1i ch\u1edd y\u00eau c\u1ea7u \u0111\u00f3 \u0111\u01b0\u1ee3c th\u1ecfa m\u00e3n v\u00e0 sau \u0111\u00f3 k\u00e9o t\u1ec7p t\u1eeb b\u1ed9 \u0111\u1ec7m. N\u1ebfu kh\u00f4ng b\u1eadt proxy_cache_lock, t\u1ea5t c\u1ea3 c\u00e1c y\u00eau c\u1ea7u d\u1eabn \u0111\u1ebfn l\u1ed7i b\u1ed9 nh\u1edb cache s\u1ebd chuy\u1ec3n th\u1eb3ng \u0111\u1ebfn m\u00e1y ch\u1ee7 g\u1ed1c.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_lock on;<\/pre>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p><strong><span style=\"font-size: 18pt;\">Purge cache.<\/span><\/strong><\/p>\n<p><strong>Ch\u00fang ta s\u1ebd c\u1ea5u h\u00ecnh HTTP PURGE \u0111\u1ec3 th\u1ef1c hi\u1ec7n x\u00f3a theo URLs<\/strong><\/p>\n<ol>\n<li>Trong block http{} ch\u00fang ta t\u1ea1o ra m\u1ed9t bi\u1ebfn m\u1edbi, v\u00ed d\u1ee5: $ purge_method, ph\u1ee5 thu\u1ed9c v\u00e0o bi\u1ebfn $ request_method:\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">http {\r\n    ...\r\n    map $request_method $purge_method {\r\n        PURGE 1;\r\n        default 0;\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/li>\n<li>Trong block location{} n\u01a1i cache \u0111\u01b0\u1ee3c \u0111\u1ecbnh c\u1ea5u h\u00ecnh, h\u00e3y th\u00eam proxy_cache_purge \u0111\u1ec3 ch\u1ec9 \u0111\u1ecbnh m\u1ed9t \u0111i\u1ec1u ki\u1ec7n cho c\u00e1c y\u00eau c\u1ea7u x\u00f3a b\u1ed9 \u0111\u1ec7m. Trong v\u00ed d\u1ee5 n\u00e0y, \u0111\u00f3 l\u00e0 $ purge_method \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh \u1edf b\u01b0\u1edbc tr\u01b0\u1edbc:\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">server {\r\n    listen      80;\r\n    server_name www.example.com;\r\n\r\n    location \/ {\r\n        proxy_pass  https:\/\/localhost:8002;\r\n        proxy_cache mycache;\r\n\r\n        proxy_cache_purge $purge_method;\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/li>\n<\/ol>\n<p><strong><span style=\"font-size: 12pt;\">G\u1ee7i l\u1ec7nh Purge cache<\/span><\/strong><\/p>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">Khi ch\u1ec9 th\u1ecb proxy_cache_purge \u0111\u01b0\u1ee3c \u0111\u1ecbnh c\u1ea5u h\u00ecnh, b\u1ea1n c\u1ea7n g\u1eedi y\u00eau c\u1ea7u purge cache \u0111\u1ec3 x\u00f3a cache. B\u1ea1n c\u00f3 th\u1ec3 \u0111\u01b0a ra c\u00e1c y\u00eau c\u1ea7u purge b\u1eb1ng nhi\u1ec1u c\u00f4ng c\u1ee5, bao g\u1ed3m l\u1ec7nh curl nh\u01b0 trong v\u00ed d\u1ee5 n\u00e0y:<\/p>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">$ curl -X PURGE -D \u2013 \"https:\/\/www.example.com\/*\"\r\nHTTP\/1.1 204 No Content\r\nServer: nginx\/1.15.0\r\nDate: Sat, 19 May 2018 16:33:04 GMT\r\nConnection: keep-alive<\/pre>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">Trong v\u00ed d\u1ee5 n\u00e0y, c\u00e1c t\u00e0i nguy\u00ean c\u00f3 m\u1ed9t ph\u1ea7n URL chung (\u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh b\u1edfi k\u00fd t\u1ef1 \u0111\u1ea1i di\u1ec7n d\u1ea5u hoa th\u1ecb) s\u1ebd b\u1ecb x\u00f3a. Tuy nhi\u00ean, c\u00e1c m\u1ee5c cache nh\u01b0 v\u1eady kh\u00f4ng b\u1ecb x\u00f3a ho\u00e0n to\u00e0n kh\u1ecfi b\u1ed9 cache: ch\u00fang v\u1eabn c\u00f2n tr\u00ean n\u01a1i l\u01b0u tr\u1eef cho \u0111\u1ebfn khi ch\u00fang b\u1ecb x\u00f3a v\u00ec kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng ( ch\u1ec9 th\u1ecb proxy_cache_path \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh th\u00eam tham s\u1ed1 <strong><em>inactive<\/em><\/strong> ) ho\u1eb7c b\u1edfi b\u1ed9 l\u1ecdc b\u1ed9 \u0111\u1ec7m (\u0111\u01b0\u1ee3c b\u1eadt v\u1edbi tham s\u1ed1 <strong><em>purger<\/em><\/strong>\u00a0 trong c\u1ea5u h\u00ecnh proxy_cache_path) ho\u1eb7c kh\u00e1ch h\u00e0ng c\u1ed1 g\u1eafng truy c\u1eadp ch\u00fang.<\/p>\n<p><strong>H\u1ea1n ch\u1ebf quy\u1ec1n truy c\u1eadp v\u00e0o t\u00ednh n\u0103ng purger cache<\/strong><\/p>\n<p>C\u1ea5u h\u00ecnh sau s\u1ebd ch\u1ec9 cho IP nh\u1ea5t \u0111\u1ecbnh \u0111\u01b0\u1ee3c ph\u00e9p ch\u1ea1y l\u1ec7nh purge cache<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">geo $purge_allowed {\r\n   default         0;  # deny from other\r\n   10.0.0.1        1;  # allow from localhost\r\n   192.168.0.0\/24  1;  # allow from 10.0.0.0\/24\r\n}\r\n\r\nmap $request_method $purge_method {\r\n   PURGE   $purge_allowed;\r\n   default 0;\r\n}<\/pre>\n<p><strong>X\u00f3a ho\u00e0n to\u00e0n c\u00e1c n\u1ed9i dung cache kh\u1ecfi b\u1ed9 nh\u1edb cache<\/strong><\/p>\n<\/div>\n<div class=\"ddict_div\">\n<p class=\"ddict_sentence\">\u0110\u1ec3 x\u00f3a ho\u00e0n to\u00e0n n\u1ed9i dung cache b\u1ea1n c\u00f3 th\u1ec3 th\u00eam ch\u1ec9 th\u1ecb <strong><em>purger <\/em><\/strong>trong ph\u1ea7n c\u1ea5u h\u00ecnh <strong>proxy_cache_path<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">proxy_cache_path \/data\/nginx\/cache levels=1:2 keys_zone=mycache:10m purger=on;\r\n<\/pre>\n<p>D\u01b0\u1edbi \u0111\u00e2y l\u00e0 1 v\u00ed v\u1ee5 v\u1ec1 purge cache<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">http {\r\n    ...\r\n    proxy_cache_path \/data\/nginx\/cache levels=1:2 keys_zone=mycache:10m purger=on;\r\n\r\n    map $request_method $purge_method {\r\n        PURGE 1;\r\n        default 0;\r\n    }\r\n\r\n    server {\r\n        listen      80;\r\n        server_name www.example.com;\r\n\r\n        location \/ {\r\n            proxy_pass        https:\/\/localhost:8002;\r\n            proxy_cache       mycache;\r\n            proxy_cache_purge $purge_method;\r\n        }\r\n    }\r\n\r\n    geo $purge_allowed {\r\n       default         0;\r\n       10.0.0.1        1;\r\n       192.168.0.0\/24  1;\r\n    }\r\n\r\n    map $request_method $purge_method {\r\n       PURGE   $purge_allowed;\r\n       default 0;\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gi\u1edbi thi\u1ec7u Ch\u00fang ta \u0111\u1ec1u bi\u1ebft r\u1eb1ng performance c\u1ee7a c\u00e1c applications v\u00e0 website l\u00e0 y\u1ebfu t\u1ed1 r\u1ea5t quan tr\u1ecdng trong m\u00f4i tr\u01b0\u1eddng internet hi\u1ec7n t\u1ea1i. Tuy nhi\u00ean, qu\u00e1 tr\u00ecnh l\u00e0m cho applications v\u00e0 website c\u1ee7a b\u1ea1n ho\u1ea1t \u0111\u1ed9ng t\u1ed1t h\u01a1n, kh\u00f4ng ph\u1ea3i l\u00fac n\u00e0o c\u0169ng d\u1ec5 d\u00e0ng. Ch\u1ea5t l\u01b0\u1ee3ng m\u00e3 ngu\u1ed3n v\u00e0 c\u01a1 s\u1edf h\u1ea1 [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":16424,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"tags":[],"ht_kb_category":[17],"class_list":["post-4384","ht_kb","type-ht_kb","status-publish","format-standard","has-post-thumbnail","hentry","ht_kb_category-huong-dan-ve-cloud-vps"],"_links":{"self":[{"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/ht_kb\/4384","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/comments?post=4384"}],"version-history":[{"count":0,"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/ht_kb\/4384\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/media\/16424"}],"wp:attachment":[{"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/media?parent=4384"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/tags?post=4384"},{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/tino.vn\/blog\/wp-json\/wp\/v2\/ht_kb_category?post=4384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}