GIT – 1. Sơ lược về hoạt cấu hình 

Chắc ai cũng biết sử dụng nginx để làm reverse proxy cho apache nhằm “nâng cao hiệu suất” xử lý web, tuy vậy nhiều người chỉ cài mặc định lên mà không có bất cứ một sự optimize nào cho nó cả, thậm chí còn không tạo các vhost riêng cho các website, việc này có khi làm websitecủa bạn chậm hơn.

Mình xin “translate” một bài viết cũng khá hay của nginx nhằm giúp bạn đọc hiểu rõ hơn về hoạt động của nginxnhằm giúp cho các phần sau đọc dễ hơn. Bài này không nhớ lấy ở đâu nên không trích nguồn

A. Name-based virtual servers
Nginx sẽ quyết định server block nào sẽ xử lý khi một request tới. Chẳng hạn như ta có các dòng config sau:

server { listen       80; server_name  nginx.org  www.nginx.org; ... }
server {
 listen       80;
 server_name  nginx.net  www.nginx.net;
 ...
 }
server { listen       80; server_name  nginx.com  www.nginx.com; ... }

trong những cấu hình trên, nginx sẽ dựa vào trường server_name để để xác định request sẽ được chuyển cho server block nào xử lý. Nếu như trong Host header của request không có trùng với bất cứ một server_name nào thì nó sẽ được đưa cho default_server như sau:

server { listen       80  default_server; server_name  nginx.net  www.nginx.net; ... }

Nếu không có chỉ định trên, default_server sẽ là server block đầu tiên như trong ví dụ thứ 1 thì là :

server { listen       80; server_name  nginx.org  www.nginx.org; ... }

B. Làm thế nào để chặn các request không có Host name trùng với server_name
Ta có thể dùng một đoạn cấu hình ngắn như sau:

server { listen       80; server_name  ""; return       444; }

C. Cấu hình
Chúng ta xem một đoạn cấu hình PHP đơn giản như sau:

server { listen        80; server_name   nginx.org  www.nginx.org; root          /data/www;
location / {
 index     index.html  index.php;
 }
location ~* .(gif|jpg|png)$ {
 expires   30d;
 }
location ~ .php$ { fastcgi_pass   localhost:9000; fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; include        fastcgi_params; } }

trong ví dụ trên bất kể thứ tự ra sao, nginx sẽ xử lý request tới như sau:

+ location “/” phù hợp với mọi request nhưng nó là literal string location nên nó sẽ được sử dụng cuối cùng.
+ Sau đó nginx sẽ tìm các location với regular expression được liệt kê theo thứ tự trong file config, ứng với cái nào thì nginx sẽ dùng lại và dùng
các chỉ thị ở đó.
+ Nếu không có regular expression nào phù hợp nginx sẽ tìm literal string location nào đầu tiên.

Ngoài ra nginx không quan tâm đến các biến chuổi đi theo sau như:
/index.php?user=john&page=1
/index.php?page=1&user=john

Một vài ví dụ

+ Request /logo.gif ứng với literal location “/” và regular expression “.(gif|jpg|png)$” nên nó sẽ được xử lý bởi

location ~* .(gif|jpg|png)$ { expires   30d; }

Ở trên có khai báo
root /data/www nên request trên sẽ ứng với /data/www/logo.gif và nó sẽ được gửi trả lại cho client.

+ Request /index.php ứng với literal string locaiont “/” và regular expression “.(php)$” nên nó sẽ được xử lý bởi

location ~ .php$ { fastcgi_pass   localhost:9000; fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; include        fastcgi_params; }

request trên sẽ được đưa qua FastCGI server ở localhost:9000. Chỉ định fastcgi_param sẽ gán SCRIPT_FILENAME thành “/data/www/index.php” và sau đó
FastCGI sẽ xử lý yêu cầu đó.

Xem thêm $document_root và $fastcgi_script_name trên trang wiki của nginx.

+ Request “/about.html” chỉ ứng với location “/” nên nginx tương tự trả về cho người dùng file“/data/www/about.html”

+ Request “/”. Ứng với location “/”, nó sẽ dựa vào chỉ thị index để tìm file index.php trong /data/www/. Nếu filenày tồn tại, request lúc này sẽ trở
thành “/index.php”, sau đó nginx sẽ tiếp tục quá trình tìm kiếm location phù hợp.

Ghi chú: literal string là một chuỗi đơn

2. Các thông số cơ bản của caching nginx

– Khai báo thư mục lưu cache (nằm trong phân đoạn http):

proxy_cache_path /tmp/nginx_cache levels=2 keys_zone=cache_one:500m inactive=1d max_size=2048m;

/tmp/nginx_cache là thư mục chứa cache, bạn có thể để thư mục này trên RAM nếu cần truy xuất nhanh và RAM dư giả. Sử dụng MD5 để lưu tên cache (key_cache) .

level=2 phân cấp thư mục lưu cache

key_zone=cache_one:500m tên của cache zone là cache_one

inactive=1d: thành phần cache nào không được truy cập trong vòng 1 ngày sẽ bị xóa.

Ngoài ra vì khi cache, nginx tạo ra rất nhiều file tạm và file cache nên bạn cần đặt tham số worker_rlimit_nofile cao cao một chút hoặc sử dụng lệnh ulimit.

– Cấu hình cache cho website ( phần này nằm trong phân đoạn server )

Đây là phần quan trọng nhất của việc cấu hình cache, mình xin giới thiệu sơ qua một số tham số quan trọng:

proxy_cache cache_one : chỉ định cache vào zone cache_one

proxy_cache_valid 200 15m : các request có file tồn tại (200) sẽ có giá trị cache trong vòng 15m.

proxy_cache_key $host$request_uri : chỉ định key cache, giúp nginx lần được cache của một URL ở đâu trong thư mục cache.

proxy_set_header X-Forwarded-For $remote_addr: dùng để thêm một dòng trong header trả về cho client.

proxy_ignore_headers : cái này để thông báo cho nginx bỏ qua những header nào của client. Trong các header của người dùng có thể có những trường để điều khiển cache (cache control) nên chúng ta cần báo cho nginxbiết bỏ qua những thông số này để việc cache được kiểm soát tối đa.

proxy_pass http://210.211.108.138:8081: cái này chắc ai cũng biết rồi.

Ngoài ra còn 2 tham số rất quan trọng nữa là proxy_cache_bypass để bypass cachevà proxy_cache_nocache để bỏ qua việc cache respond của server trả về.

Vậy là xong phần cơ bản, cũng khá đơn giản. Tuy nhiên để cấu hình cache động cho một website thì cần mất rất nhiều công sức để optimize lại dần dần, vì không phải site nào cũng giống site nào

Print Friendly

Comments

comments

Bài viết liên quan