Cài đặt triển khai Nginx Caching API A-Z

Mục Lục

Table of Contents

Triển khai Nginx Caching API A-Z FIXLOINHANH2

1./ Tạo server wordpress để test.2

2./ Cài đặt server nginx caching3

2.1/ Tìm hiểu các thông số trong nginx4

3./ Lý thuyết Nginx caching4

3.1.1/ key_zone và max_size và inactive4

3.1.2/ Cache manager5

3.1.3/ Cache loader5

3.3/ Chỉ định ra Cache Request nào5

3.4/ Limit hoặc Disabling Caching6

3.5/ Xoá nội dung từ Cache6

3.5.1/ Cấu hình Cache Purge7

3.5.2/ Gửi lệnh xoá cache sử dụng module ngx_cache_purge7

3.5.3/ Giới hạn được IP được phép gửi lệnh PURGE CACHE8

3.6/ Xoá cache của 1 page sử dụng bypass/recache với set secret_header9

3.7/ Yêu cầu cần giữ được keys quá thời gian inactive.9

3.9/ Các lệnh thường sử dụng12

3.10/ Khi test với web site chạy IIS12

4./ File cấu hình nginx.vhost12

5./ Compile nginx 1.19.2 from source14

6./ Tham khảo:17

 

 

Cài đặt triển khai Nginx Caching API​​ A-Z FIXLOINHANH

Bài Lab này sẽ hướng dẫn chi tiết sử dụng Nginx Caching như 1 CDN server.​​ 

Mô hình

Hướng dẫn cấu hình Reverse Proxy Cache trên Nginx

1./​​ Tạo server wordpress để test.

Các bước tạo 1 web site wordpress khá đơn giản có thể chủ động tìm hiểu

Nên tạo random Salt để sercure site WP​​ 

root@srv022_wordpress:/opt/wordpress# curl -s https://api.wordpress.org/secret-key/1.1/salt/

define('AUTH_KEY',  ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ 'V~&+C@{2G7!_9ubm^|j`w*wj6+#oDJU2jB.S33WYagC9->R<TMQl?4gh](]_]yx(');

define('SECURE_AUTH_KEY', ​​ '~X-J&P9X4uP?.2)S3Eg+U;;2BR+~[isa^/;H$v-tKN<4-)k_|_iIkkO);M|z.CPa');

define('LOGGED_IN_KEY',  ​​ ​​​​ '^!y7B<xl}$K|Z%lq)CI1iaCD3:3#X#$3%Ea_s+}<X%vc{x)SId?t[R|G+dFZ_,+]');

define('NONCE_KEY',  ​​ ​​ ​​ ​​ ​​ ​​​​ '3mj]: 6s-`Yk9|-&G{8n6;f0<^{_~vZSvfXAO9U=l)SWPYb;=EBeaZ~W9:A-si;n');

define('AUTH_SALT',  ​​ ​​ ​​ ​​ ​​ ​​​​ 'k|v23Phi6S-a]W~jJ2bf7A@qBOxqHUBvlGXd:%0I3RoQM<Pr(KiX=7dgB{bY|f.[');

define('SECURE_AUTH_SALT', '.)m`M$q/M_6`V6O0{YeuIXesDcWHb<A=4bU(Xk3PF%GS-}F[(>|Q$>f~9}E+x(%/');

define('LOGGED_IN_SALT',  ​​​​ 'U$f0lF?DVFV)[@Y~^=qAibC=~tV$DcW5NpY,dZnF*}ICxdv;wcb4s.|T q[w_ qY');

define('NONCE_SALT',  ​​ ​​ ​​ ​​ ​​​​ '`dl6|[&LoI&V0{nwCvY;r]32Fj=|[gwz~IC,dF%b3U%bI.zXw/28jec|7&,tf|w7');

Thông tin login

admin/”Your Password”

Kết quả​​ up 1 video lên test, sau này sẽ up các video khác nhau để tiến hành test caching

2./ Cài đặt server nginx caching

cấu hình basic

 ​​ ​​ ​​​​ proxy_cache_path ​​ /opt/nginx/cache ​​ levels=1:2  ​​ ​​​​ keys_zone=STATIC:100m​​ inactive=48h ​​ max_size=10g;

 ​​ ​​ ​​​​ server {

 ​​​​ listen 80;

 ​​​​ listen [::]:80;

 ​​​​ server_name testsite.local;

 ​​​​ access_log  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ /var/log/nginx/testsite.local/access.log;

 ​​​​ error_log  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ /var/log/nginx/testsite.local/error.log;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ location / {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_pass http://10.0.1.22:80/;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_set_header  ​​ ​​ ​​ ​​ ​​​​ Host $host;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_buffering  ​​ ​​ ​​ ​​ ​​ ​​​​ on;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ STATIC;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_valid  ​​ ​​ ​​ ​​​​ 200 ​​ 1d;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_use_stale ​​ error timeout invalid_header updating

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ http_500 http_502 http_503 http_504;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 ​​ ​​ ​​​​ }

 

Sau mỗi lần xem video hoặc xem bài viết có text và ảnh thì dung lượng của folder cache tiếp tục tăng, chứng tỏ cache đã hoạt động

2.1/ Tìm hiểu các thông số trong nginx

keys_zone=STATIC:10m

​​ tên của key_zone và dung lượng file cache.

max_size 

là dung lượng tối đa mà có thể cache​​ proxy_cache_path​​ ở trong folder chỉ định.

levels=1:2

Định nghĩa mức phân cấp của bộ nhớ​​ cache, hay có thể hiểu là có 2 cấp thư mục chứa cache.

 

3./ Lý thuyết Nginx caching

3.1.1/ key_zone​​ và max_size​​ và inactive

keys_zone=STATIC:10m

keys_zone=one:10m

Static hoặc one là tên của keys_zone

có thể đặt tên key_zone ​​ và dung lượng bộ nhớ cấp​​ (cấp ở Disk là Disk, cấp ở Ram là Ram). Những thông tin metadata, keys được lưu tại đây sẽ được truy xuất ngay mà không cần lấy thông tin từ disk​​ của server gốc.

keys_zone sets up a​​ shared memory zone​​ for storing the cache keys and metadata such as usage timers. Having a copy of the keys in memory enables NGINX to quickly determine if a request is a​​ HIT or a MISS without having to go to disk, greatly speeding up the check. A 1MB zone can store data for about 8,000 keys, so the 10MB zone configured in the example can store data for about 80,000 keys.

max_size 

là dung lượng tối đa mà có thể cache​​ proxy_cache_path​​ ở trong folder chỉ định.

inactive:​​ 

là khoảng thời gian định kì cache được lưu trữ hết thời gian thì tất cả cache sẽ bị xoá đi.(bất kể keys là mới hay cũ)

Một số các biến số khác trong nginx

  • $scheme – request scheme, HTTP or HTTPS.

  • $request_method – request method, usually “GET” or “POST”.

  • $host – this can be hostname from the request line, or hostname from the “Host” request header field, or the server name matching a request, in the order of precedence.

  • $request_uri – means the full original request URI (with arguments).

 

3.1.2/​​ Cache manager​​ 

Định kì kiểm tra trạng thái của​​ cache. Nếu cache size vượt quá max_size được giới hạn bởi max_size được cấu hình trong proxy_cache_path folder, thì cache manager sẽ xoá nhưng dữ liệu cũ​​ nhất đi.​​ Dữ liệu cache có thể vượt qua giới hạn limit trong khoảng thời gian mà cache manager hoạt động.

3.1.3/​​ Cache loader​​ 

chỉ chạy 1 lần duy nhất khi khởi động của nginx. Nó loads metadata về dữ liệu đã cache trước đó để shared memmory zone.​​ Việc tải toàn bộ bộ nhớ đệm cùng một lúc có thể tiêu tốn đủ tài nguyên để làm chậm hiệu suất NGINX trong vài phút đầu tiên sau khi khởi động. Để tránh điều này xảy ra có thể cấu hình​​ chỉ thị​​ proxy_cache_path như sau:

  • loader_threshold – Duration of an iteration, in milliseconds (by default, 200)

  • loader_files – Maximum number of items loaded during one iteration (by default, 100)

  • loader_sleeps – Delay between iterations, in milliseconds (by default, 50)

 

In the following example, iterations last 300 milliseconds or until 200 items have been loaded:

proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;

3.3/ Chỉ định ra Cache Request nào

Mặc định nginx plus cache tất cả mọi thứ với HTTP GET và HEAD

By default, NGINX Plus caches all responses to requests made with the HTTP GET and HEAD methods the first time such responses are received from a proxied server. As the key (identifier) for a request, NGINX Plus uses the request string. If a request has the same key as a cached response, NGINX Plus sends the cached response to the client. You can include various directives in the http {}server {}, or location {} context to control which responses are cached.

To change the request characteristics used in calculating the key, include the proxy_cache_key directive:

proxy_cache_key​​ "$host$request_uri$cookie_user";

Định nghĩa số lần request cùng 1 keys nhỏ nhất để keys được cache.

To define the minimum number of times that a request with the same key must be made before the response is cached, include the proxy_cache_min_uses directive:

proxy_cache_min_uses​​ 5;

To cache responses to requests with methods other than GET and HEAD, list them along with GET and HEAD as parameters to the proxy_cache_methods directive:

proxy_cache_methods​​ GET​​ HEAD​​ POST;

3.4/ Limit hoặc Disabling Caching

By default, responses remain in the cache indefinitely. They are removed only when the cache exceeds the maximum configured size, and then in order by length of time since they were last requested. You can set how long cached responses are considered valid, or even whether they are used at all, by including directives in the http {}server {}, or location {} context:

To limit how long cached responses with specific status codes are considered valid, include the proxy_cache_valid directive:

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404  ​​ ​​ ​​ ​​​​ 1m;

In this example, responses with the code 200 or 302 are considered valid for 10 minutes, and responses with code 404 are valid for 1 minute. To define the validity time for responses with all status codes, specify any as the first parameter:

proxy_cache_valid any 5m;

Định nghĩa điều kiện với NGINX Plus không gửi phản hồi cache đến clients, chỉ thị​​ proxy_cache_bypass, mỗi tham số định nghĩa 1 điều kiện và bao gồm 1 biến số. Nếu ít nhất 1 tham số không trống và không bằng 0, NGINX Plus​​ không tìm kiếm trong bộ nhớ cache mà thay vào đó sẽ chuyển tiếp yêu cầu đến​​ backend server​​ ngay lập tức.​​ Ví dụ trường hợp cần update ngay lập tức như xác nhận thanh toán, xác nhận đã mua, bán…

To define conditions under which NGINX Plus does not send cached responses to clients, include the proxy_cache_bypass directive. Each parameter defines a condition and consists of a number of variables. If at least one parameter is not empty and does not equal “0” (zero), NGINX Plus does not look up the response in the cache, but instead forwards the request to the backend server immediately.

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

Để định nghĩa điều kiện dưới NGINX Plus không cache 1 respond at all. bao gồm chỉ thị proxy_no_cache. Định nghĩa tham số gióng như proxy_cache_bypass

To define conditions under which NGINX Plus does not cache a response at all, include the proxy_no_cache directive, defining parameters in the same way as for the proxy_cache_bypass directive.

proxy_no_cache $http_pragma $http_authorization;

3.5/ Xoá nội dung từ Cache

Nginx cho phép xoá các file cache cũ. Điều này là cần thiết để ngăn không cho cả dữ liệu cũ và mới được phép cùng tồn tại.​​ Cache bị xoá khi nhận tín hiệu “purge” từ custum HTTP header, hoặc phương thức HTTP PURGE.

Tuy nhiên chỉ thị nginx_cache_purge chỉ có sẵn trong phiên bản NGINX Plus, ở bản trial cần cài thêm module ngx_cache_purge

https://github.com/FRiCKLE/ngx_cache_purge

3.5.1/ Cấu hình Cache Purge

Cấu hình với request sử dụng ​​ phương thức HTTP PURGE xoá matching URLs.

In the http {} context, create a new variable, for example, $purge_method, that depends on the $request_method variable:

http {

 ​​ ​​ ​​​​ ...

 ​​ ​​ ​​​​ map $request_method $purge_method {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ PURGE 1;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ default 0;

 ​​ ​​ ​​​​ }

}

In the location {} block where caching is configured, include the proxy_cache_purge directive to specify a condition for cache‑purge requests. In our example, it is the $purge_method configured in the previous step:

server {

 ​​ ​​ ​​​​ listen  ​​ ​​ ​​ ​​​​ 80;

 ​​ ​​ ​​​​ server_name www.example.com;

 

 ​​ ​​ ​​​​ location / {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_pass ​​ https://localhost:8002;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache mycache;

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_purge $purge_method;

 ​​ ​​ ​​​​ }

}

3.5.2/ Gửi lệnh xoá cache sử dụng module ngx_cache_purge

When the proxy_cache_purge directive is configured, you need to send a special cache‑purge request to purge the cache. You can issue purge requests using a range of tools, including the curl command as in this example:

$ curl -X PURGE -D – "https://www.example.com/*"

HTTP/1.1 204 No Content

Server: nginx/1.15.0

Date: Sat, 19 May 2018 16:33:04 GMT

Connection: keep-alive

Tuy nhiên làm theo mà bị lỗi

root@srv023_nginx_cache:~# curl -X PURGE -IL ​​ testsite.local/wp-content/uploads/2021/01/2.mp4

curl: (52) Empty reply from server

Nguyên nhân lỗi là do module ngx_cache_purge của​​ FRiCKLE​​ đã outdate không phù hợp cho các version cao.

https://github.com/FRiCKLE/ngx_cache_purge

Chuyển sang sử dụng Module ngx_cache_purge của​​ torden​​ có tại link:

https://github.com/torden/ngx_cache_purge

Sau khi download module về và complie lại thì cấu hình để xoá keys rất đơn giản như sau:

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_purge ​​ PURGE ​​ from 127.0.0.1 10.0.1.23;

Thêm IP được phép xoá keys.

Câu lệnh xoá Keys

curl -X PURGE http://testsite.local/wp-content/uploads/2021/01/1.mp4

Kết quả

root@srv023_nginx_cache:~# curl -X PURGE http://testsite.local/wp-content/uploads/2021/01/1.mp4

Warning: Binary output can mess up your terminal. Use "--output -" to tell​​ 

Warning: curl to output it to your terminal anyway, or consider "--output​​ 

Warning: <FILE>" to save to a file.

  • Keys đã bị xoá trên server, dung lượng bị xoá bằng đúng dung lượng keys được cache.

hoặc có thể sử dụng lệnh xoá bên dưới kết quả không thay đổi

curl -X PURGE -D - ​​ http://testsite.local/wp-content/uploads/2021/01/1.mp4

Với client không được phép xoá keys

Keys sẽ không bị xoá trên server.

=> Như vậy đã​​ Lab xong, không cần thực hiện bước 3.5.3 nữa. Phần đó chỉ giành cho nginx plus trả phí.

3.5.3/​​ Giới hạn được IP được phép gửi lệnh PURGE CACHE

cấu hình ở trong http{}

we recommend that you limit the number of IP addresses that are allowed to send a cache‑purge request:

geo​​ $purge_allowed​​ {

 ​​ ​​​​ default ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ 0; ​​​​ # deny from other

 ​​ ​​​​ 10.0.0.1 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ 1; ​​​​ # allow from localhost

 ​​ ​​​​ 192.168.0.0/24 ​​​​ 1; ​​​​ # allow from 10.0.0.0/24

}

 

map​​ $request_method​​ $purge_method​​ {

 ​​ ​​​​ PURGE ​​ ​​​​ $purge_allowed;

 ​​ ​​​​ default​​ 0;

}

Phần xoá cache không làm việc được với nginx bản thường. với nginx plus thì rất đơn giản.

3.6/ Xoá cache​​ của 1 page sử dụng bypass/recache với set secret_header

Thêm proxy_cache_bypass có giá trị

proxy_cache_bypass $http_secret_header;

add_header X-Cache-Status $upstream_cache_status;

Để exprixe/bypass the cached file, sử dụng curl​​ 

curl http://testsite.com/mypage.html -s -I -H "secret-header:true"

Test với link trang chủ

Ngay sau đó thì cache được bypass chỉ cho link đó các link khác vẫn cache

#https://stackoverflow.com/questions/6236078/how-to-clear-the-cache-of-nginx

3.7/ Yêu cầu cần giữ được keys quá thời gian inactive.

Hướng xử lý cho thời gian inactive trong thời gian dài 10 năm​​ để không bị​​ hết hạn keys, keys mới vào sẽ đẩy keys cũ và dữ liệu cũ ra khi tràn bộ nhớ được cấp trong max_size

Sau khi xem 1 video dung lượng lớn 194Mb mà dung lượng cấp 200Mb, dữ liệu cũ liền bị xoá đi

sau khi xem 1 video nữa dung lượng vượt quá 200Mb thì dung lượng được cache lưu trữ thay đổi. (dữ liệu không quay về 0 zero)

3.8/ Chủ động cache 1 link video hoặc ảnh bất kì​​ 

Mục đích: có thể chủ động cache 1 link, keys bất kì trước khi client truy cập, hoặc​​ cache lại link, keys sau khi expire time hoặc quá dung lượng max_size.

3.8.1​​ / Enable Debug by X-Cache-Status

Mục đích: show ra mã cache status để kiểm tra trạng thái của cache. Thường thì kiểm tra các trạng thái cơ bản như:

Miss: chưa được cache

Hit: dữ liệu đã được cache.

Nên giới hạn chỉ cho 1 vài IP có thể show ra trạng thái X-Cache-Status

trên server local thấy trạng thái X-Cache-Status

trên client bất kì sẽ không thấy trạng thái của X-Cache-Status

Cấu hình​​ 

map $remote_addr $cache_status {

 ​​ ​​ ​​​​ 127.0.0.1 $upstream_cache_status;

 ​​ ​​ ​​​​ 10.0.1.23 $upstream_cache_status;

 ​​ ​​ ​​​​ default "";

}

#######################

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ add_header X-Cache-Status $cache_status;

Bảng mã X-Cache-Status

By debugging the X-Cache-Status header you will appreciate the following table:

MISS

Object was not found in the cache. Response was served from the origin. Response may have been saved to cache.

BYPASS

Got response from upstream. Response may have been saved to cache.

EXPIRED

Cached object has expired. Response was served from the upstream.

STALE

Object served from cache because of issues with origin server response

UPDATING

Serve stale content from cache because proxy_cache_lock has timed out and proxy_use_stale takes controll

REVALIDATED

proxy_cache_revalidate verified that the current cached content was still valid

HIT

The object was found in the cache and it is served from there

3.8.2/ Cache 1 link, 1 keys bất kì

Cache video​​ 

curl -I​​ http://testsite.local/wp-content/uploads/2021/01/4.mp4

số lần Miss sẽ phụ thuộc vào cấu hình​​ proxy_cache_min_uses​​ hiện đang để là 2 lần, đến lần thứ 3 truy cập thì cache sẽ được load​​ trên server cache.

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_min_uses 2;

Cache text file​​ và image

hoàn toàn tương tự

Lưu ý: sau khi curl -I 1 link bất kì và trạng thái trả về của X-Cache-Status là HIT thì dung lượng cache sẽ tăng lên.

3.9/ Các lệnh thường sử dụng

Check md5 của 1 keys

echo -n testsite.local/2021/02/18/bai-viet-20210218-09h32 | md5sum

 

3.10/ Khi test với web site chạy IIS

Test nginx cache với web chạy IIS thì kết quả vẫn như khi dùng web server nginx.

Vẫn hoạt động đúng vả đủ các chức năng, Purge, bypass header, cache dynamic, cache all content of page.

Đoạn mã html hoặc aspx đơn giản như sau

<header><title>Hello World Page</title></header>

<div>

 ​​​​ <img src="/images/hinh1-22.jpg">

 ​​​​ <img src="/images/hinh2-21.jpg">

 ​​​​ <img src="/images/lay-net-01.png">

</div>

<div>

 ​​ ​​​​ Hello world! ​​ Hello world! Hello world! ​​ Hello world!

</div>

Cần cấu hình Add Virtual Directory chứa ảnh để có thể hiển thị được ảnh.

Lưu ý: khi dựng 1 website IIS chứa ảnh, nếu view qua browser mà ảnh không hiển thị được là do chưa cài đủ các features lên.

4./ File cấu hình nginx.vhost

proxy_cache_path ​​ /opt/nginx/cache ​​ levels=1:2  ​​ ​​​​ keys_zone=STATIC:10m inactive=3650d ​​ max_size=200m loader_threshold=300 loader_files=200;

#############

# lua_package_path "/opt/setup/nginx-1.19.2/lua-resty-corelib/?.lua;;"

​​ # init_by_lua_block {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # require "resty.core"

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # collectgarbage("collect") ​​ -- just to collect any garbage

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # }

#############

# proxy_cache_path ​​ /opt/nginx/cache  ​​ ​​​​ keys_zone=STATIC:1m inactive=365d ​​ max_size=10g loader_threshold=300 loader_files=200;

# proxy_cache_path /opt/nginx/cache keys_zone=STATIC:10m loader_threshold=300 loader_files=200;

###################PURGE BEGIN

​​ # map $request_method $purge_method { ​​ 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # PURGE 1; ​​ 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # default 0; ​​ 

 ​​ ​​ ​​​​ # } ​​ 

###################PURGE END

 

server {

 ​​​​ listen 80;

# ​​ listen [::]:80;

 ​​​​ server_name testsite.local;

# ​​ access_log  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ /var/log/nginx/testsite.local/access.log;

 ​​​​ error_log  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ /var/log/nginx/testsite.local/error.log;

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ location / {

#  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ index ​​ index.html index.htm;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_set_header  ​​ ​​ ​​ ​​ ​​​​ Host $host;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_buffering  ​​ ​​ ​​ ​​ ​​ ​​​​ on;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ STATIC;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_valid  ​​ ​​ ​​ ​​​​ 200 302 1d;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_valid 404  ​​ ​​ ​​ ​​ ​​​​ 10m;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ more_set_headers "Server: TEST_CACHE_23_NGINX";

#  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_use_stale ​​ error timeout invalid_header updating http_500 http_502 http_503 http_504;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_key "$host$uri$is_args$args$request_uri$cookie_user$scheme";

#  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_key  ​​ ​​​​ $uri$is_args$args;

##############

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ add_header X-Cache-Status $upstream_cache_status;

#  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ add_header X-Cache-Status $cache_status;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_min_uses 2;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_methods GET HEAD POST;

#  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_bypass $http_cache_bypass;

   proxy_cache_bypass $http_secret_header$http_cache_bypass;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_no_cache $http_pragma $http_authorization;

#  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_purge $purge_method;

#  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_purge ​​ STATIC $1$is_args$args;

#delete cache use curl PURGE

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_cache_purge ​​ PURGE ​​ from 127.0.0.1 10.0.1.23;

##################

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ proxy_pass http://10.0.1.22:80/;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # location ~ /purge(/.*) {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # # allow  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ 0.0.0.0;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # # deny  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ all;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # proxy_cache_purge ​​ STATIC $1$is_args$args;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ # }

}

#############################################################################

 

# location / {

 

# if ($request_method = PURGE) {

 

  # set $lua_purge_path "/opt/nginx/cache";

  # set $lua_purge_levels "1:2";

  # set $lua_purge_upstream "http://10.0.1.22:80";

# #  set $lua_package_path "/opt/setup/nginx-1.19.2/lua-resty-core";

 

  # content_by_lua_file /lua/purge.lua;

# }

# proxy_pass http://10.0.1.22:80/;

# proxy_cache STATIC;

 

# }

# }​​ 

5./ Compile nginx 1.19.2 from source

Với nginx plus đơn giản là chỉ cần enable tính năng nào đó lên, nhưng với nginx bản miễn phí cần compile để lấy được thêm các tính năng addon chỉ có ở bản trả phí.

Script​​ chạy trên Ubuntu 20.04LTS như sau:

#!/bin/bash

# Build NGINX 1.19.2 From source

#/opt/setup/build-nginx-1.9.9-from-source.sh

echo "Install Pakage Dependency"

sudo apt update && sudo apt upgrade -y

sudo apt install -y build-essential git tree

sudo add-apt-repository -y ppa:maxmind/ppa

sudo apt install -y build-essential libpcre3-dev zlib1g-dev libssl-dev libatomic-ops-dev libxml2-dev libxslt1-dev libgeoip1 libgeoip-dev libgd-dev google-perftools libgoogle-perftools-dev libperl-dev

cd /opt/setup

###################Download Pakage Dependency

wget https://nginx.org/download/nginx-1.19.2.tar.gz && tar zxvf nginx-1.19.2.tar.gz

# PCRE version 8.44

wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz && tar xzvf pcre-8.44.tar.gz

# zlib version 1.2.11

wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz

# OpenSSL version 1.1.1g

wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz && tar xzvf openssl-1.1.1g.tar.gz

###################Download Pakage Dependency

cd nginx-1.19.2

############ Copy Nginx manual page to /usr/share/man/man8/ directory BEGIN

cp man/nginx.8 /usr/share/man/man8

sudo gzip /usr/share/man/man8/nginx.8

ls /usr/share/man/man8/ | grep nginx.8.gz

# Check that man page for Nginx is working

#man nginx

############ Copy Nginx manual page to /usr/share/man/man8/ directory END

 

##########Create user, group nginx BEGIN

#sudo useradd -s /sbin/nologin nginx

groupadd -g 2002 nginx

useradd ​​ -u 2002 -s /bin/false -d /bin/null -c "pureftpd user" -g nginx nginx

##########Create user, group nginx END

 

##############

#add module headers-more-nginx-module

git clone https://github.com/openresty/headers-more-nginx-module.git

git clone https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng.git

git clone https://github.com/AirisX/nginx_cookie_flag_module.git

git clone https://github.com/kyprizel/testcookie-nginx-module.git

git clone https://github.com/FRiCKLE/ngx_cache_purge.git

 

##############

echo "################################################"

./configure \--prefix=/etc/nginx \

--add-module=headers-more-nginx-module ​​ \

--add-module=nginx-sticky-module-ng ​​ \

--add-module=nginx_cookie_flag_module ​​ \

--add-module=testcookie-nginx-module ​​ \

--add-module=ngx_cache_purge \

--sbin-path=/usr/sbin/nginx ​​ \

--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 ​​ \

--with-stream=dynamic \

--with-stream_ssl_module \

--with-stream_realip_module \

--with-stream_geoip_module=dynamic \

--with-stream_ssl_preread_module \

--with-compat \

--with-pcre=../pcre-8.44 \

--with-pcre-jit \

--with-zlib=../zlib-1.2.11 \

--with-openssl=../openssl-1.1.1g \

--with-openssl-opt=no-nextprotoneg \

--user=nginx ​​ \

--group=nginx ​​ \

--with-http_ssl_module ​​ \

--with-threads ​​ \

--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_ssl_module \

--with-http_image_filter_module \

--with-mail ​​ \

--with-mail_ssl_module ​​ \

--with-file-aio ​​ \

--with-debug ​​ \

--with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

 

echo "################################################"

#chạy lệnh này để tạo file binary nginx trong objs

sudo make

# chạy lệnh này sẽ copy hết tất cả file cài đặt vào đúng đường dẫn (file nginx dạng binary sẽ được copy vào /usr/sbin/ ).

sudo make install

############

 

#

mkdir -p /etc/nginx/sites-enabled/

mkdir -p /etc/nginx/sites-available/

ln -s /etc/nginx/sites-available/* /etc/nginx/sites-enabled/

mkdir -p /data/www/cache/tmp

chown -R nginx.nginx /data/www/cache*

# Create NGINX cache directories and set proper permissions

sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp

sudo chmod 700 /var/cache/nginx/*

sudo chown nginx:root /var/cache/nginx/*

#

echo "################################################"

netstat -ntlup | egrep "Proto|nginx|haproxy|php" | sort -n

echo "################################################"

ps aux | egrep "USER|nginx|php" | awk '{print $1"\t"$2"|"$3"|"$4"|"$11"\t"$12 "\t" $13 "\t" $14 "# " $15 " " $16}'

echo "################################################"

#

echo "################################################"

#DONE

#####################################

 

 

 

 

 

 

6./​​ Tham khảo:

https://fixloinhanh.com

https://www.nginx.com/blog/nginx-high-performance-caching/#CacheDontCache

https://www.nginx.com/resources/wiki/start/topics/examples/reverseproxycachingexample/

https://github.com/FRiCKLE/ngx_cache_purge

https://www.fatalerrors.org/a/nginx-compiling-and-installing-lua-nginx-module.html

https://github.com/openresty/lua-nginx-module

https://stackoverflow.com/questions/6236078/how-to-clear-the-cache-of-nginx

https://docs.nginx.com/nginx/admin-guide/content-cache/content-caching/

 

 

 

 

 

 

 

 

 

19​​ |​​ Page

SaKuRai

Xin chào, Mình là Sakurai. Blog này là nơi để note lại và chia sẻ những kiến thức, kinh nghiệm mà mình và anh em trong Team. Cảm ơn các bạn đã quan tâm theo dõi!

You may also like...

Leave a Reply