Trang chủ / VPS / Cấu hình tăng tốc cho NGINX toàn tập
cấu hình tối ưu cho nginx toàn tập

Cấu hình tăng tốc cho NGINX toàn tập

Nhắc tới NGINX chắc các bạn đã quen thuộc rồi, NGINX là một web server hiệu suất cao nhưng hoạt đông rất nhẹ nhàng, tiêu tốn ít tài nguyên. Trong bài này mình sẽ nói về việc cấu hình tăng tốc cho NGINX, có rất nhiều cách để tăng tốc độ tải trang web của bạn thông qua việc cấu hình nginx, sau khi tối ưu, mình đã giảm load time từ 13,04s xuống còn 3,58s, quá ấn tượng phải không ? :D

Tất cả đều thực hiện trong file nginx.conf, bạn mở file nginx.conf theo đường dẫn /etc/nginx/nginx.conf

Cấu hình worker_processes

Mặc định, nội dung của file nginx.conf khi cài đặt như sau:

user nginx;
worker_processes 1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

Bạn mở SSH lên và gõ lệnh cat /proc/cpuinfo, nó sẽ hiện ra thông tin chi tiết về hệ thống của bạn nhưng chúng ta chỉ quan tâm đến dòng cpu cores . Bạn xem nó hiển thị bao nhiêu, trong vps của mình thì là 2 core, chúng ta sửa mục worker_processes bằng số core cpu mà bạn có, như thế này:

worker_processes 2;

Cấu hình worker_connection

Tiếp tục sửa worker_connection, mặc định nó là 1024, bạn lấy số cpu core nhân với 1024, ở mình đây mình có 2 core nên sẽ là 2048

worker_connections  1024;

Bạn thêm dòng sau vào trong cặp events{} để tối ưu xử lí cho nginx, thêm như sau:

events {
    multi_accept on;
    worker_connections  4096;
}

Tắt log

Nếu bạn có dùng các dịch vụ theo dõi như Google Analytics thì sẽ chẳng cần đến cái log của nginx, mặc định nginx sẽ ghi log khi khách truy cập vào tuy nhiên điều đó là không cần, tắt đi dể tối ưu hiệu năng cho nginx

Bạn thêm dòng access_log off; vào trong cặp http{}

http {
....
access_log off;
}

Bật nén gzip

Nếu như bạn không bật nén gzip cho nginx thì website bạn tải sẽ rất chậm, gzip là một module giúp nén dữ liệu tại server rồi sau đó mới trả về cho người dùng, ví dụ trang web của bạn có dung lượng hoảng 1,3MB, sau khi bật nén gzip chỉ còn khoảng 50kb, thật tuyệt phải không, thế thì bật nó lên thôi

Để bật nén gzip, bạn thêm dòng code sau vào giữa cặp http{}, thêm như sau:

http {
....
gzip on;
gzip_disable "MSIE [1-6]\.";
gzip_static on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_buffers 32 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}

Sử dụng FastCGI Cache

Hầu hết các bạn thường sử dụng cache như memcached, xcache, apc được hỗ trợ thông qua các plugin nếu sử dụng các cms như wordpress, magento,…Tuy nhiên ít ai biết đến bản thân nginx cũng có hệ thống cache rất xịn đó là fastcgi cache

Tuy fastcgi không tự xoá cache khi bạn thay đổi cái gì đó cho website như đăng bài chẳng hạn nhưng vẫn có cach đó là chúng ta chỉ định  thư mục cụ thể cho fastcgi lưu cache, khi nào cần xoá bạn chỉ cần vào đó xoá xạch đi là xong.

Để sử dụng fastcgi cache, các bạn tạo một thư mục nào đó để lưu cache cho nginx, ở đây mình chọn lưu trong /var/nginx-cache

Tạo thư mục /var/nginx-cache, chạy lệnh sau trong ssh

mkdir /var/nginx-cache
chown -R www-data /var/nginx-cache

Sau đó thêm đoạn code sau vào file nginx.conf , vẫn đặt trong cặp http{}, nhớ sửa lại đường dẫn cho chính xác với của bạn:

http {
.....
fastcgi_cache_path <span style="color: #ff6600;"><strong>/var/nginx-cache</strong></span> levels=1:2 keys_zone=phpcache:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
}

Lưu lại, thêm tiếp đoạn code sau vào file cấu hình domain của bạn, nằm trong thư mục /etc/nginx/conf.d nếu bạn đang dùng OS Debian như blog Crazytut của mình, hoặc trong thư mục /etc/nginx/site-availables nếu bạn dùng Unbuntu

set $no_cache 0;
location ~ \.php$ {
fastcgi_cache phpcache;
fastcgi_cache_valid 200 30m;
fastcgi_cache_methods GET HEAD;
add_header X-Fastcgi-Cache $upstream_cache_status; # Thêm header để tiện theo dõi
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache; # Không cache nếu như set $no_cache bằng 1

Để xem fast-cgi có đang  hoạt động không, bạn mở website ra, chuột phải chọn kiểm tra phần tử (nếu dùng Chrome) hoặc Inspect Element (nếu dùng Firefox) chọn tab network sau đó tải lại website, chọn trang web của bạn và chọn tab header, sẽ có phần X-Fastcgi-Cache: HIT, có thể sẽ là HIT (nếu web đang loà từ cache) hoặc MISS (nếu web không load fast-cgi cache) hoặc đơn giản mở SSH gõ, sẽ thấy:

curl -I https://www.crazytut.com
fast-cgi-cache-cho-nginx
Web đang load từ cache thông qua Fast CGI

Updated: Hiện tại các bạn có thể dùng plugin này để tự động xoá Fast CGI cache khi đăng bài hay làm gì đó thay đổi trên trang web của bạn, chỉ cài vào chọn Fast CGI là xong, không cần quan tâm tới nó nữa

Cấu hình nginx để chịu được nhiều người online

Giờ bạn thêm tiếp đoạn sau cũng nằm trong cặp http{}

http {
...
client_body_buffer_size 256k;
client_body_in_file_only off;
client_body_timeout 60s;
client_header_buffer_size 64k;
client_header_timeout 20s;
client_max_body_size 12m;
connection_pool_size 512;
}

Sendfile, tcp_nodelay và tcp_nopush

3 thuộc tính này hơi khó giải thích nên mình không nói ở đây, bạn chỉ cần thêm đoạn sau  vào trong cặp http{}:

sendfile on;
tcp_nopush on;
tcp_nodelay on;

Sử dụng Keep-alive

Bật Keep-alive là một cách tăng tốc hiệu quả cho NGINX, nó giúp giảm được rất nhiều http request và do đó tăng tốc độ tải của trang web, thêm đoạn sau vào trong cặp http{}

keepalive_requests 150;
keepalive_timeout 30;

Bật Browser Cache

Một loại cache nữa mà chắc các bạn rất quen đó là browser cache. Ngoài các loại cache trên server, browser cache sẽ cache các thành phần tĩnh của website tại trình duyệt của người dùng để khi họ truy cập lần thứ hai thì tốc độ sẽ rất nhanh, chỉ 1, 2s là xong

Để bật Browser cache , các bạn lại file cấu hình của domain ra thêm đoạn code sau vào giữa cặp server {} như thế này

server {
....
location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
    }
    location ~*  \.(pdf)$ {
        expires 30d;
    }
}

Nếu như bạn có dùng WordPress mà dùng 2 plugin WP-Super Cache và W3 Total Cache thì chỉ cần vào setting bật lên là nó sẽ tự thêm đoạn code vào cho bạn

Bonus: Nếu dùng cái fast-cgi cache này thì nên làm theo bài này, tốc độ sẽ tăng thêm gấp 3:

Chuyển thư mục lên RAM để tăng tốc website

Đó, làm như thế là bạn đã cấu hình NGINX hoạt động rất nhanh rồi, giờ khởi động lại NGINX để áp dụng thay đổi

systemctl restart nginx.service

Bonus: Trước khi khởi động lại, bạn nên check cấu hình nginx xem đã cấu hình đúng chưa, chạy lệnh nginx -t để kiểm tra, nếu có thông báo như sau thì ok, bạn đã làm đúng rồi đó, ra check tốc độ web thôi :D

cấu hình tăng tốc nginx tối ưu
Thông báo đã cấu hình nginx đúng

Hãy chỉ sử dụng NGINX, đừng dùng nó làm proxy cho Apache

Trước đây, khi NGINX còn chưa phổ biến thì có rất ít các ứng dụng tương thích với nó, mà NGINX không chỉ là một webserver và nó còn là một proxy  server, do đó nếu bạn muốn dùng NGINX với các ứng dụng không tương thích thì buộc phải để NGINX làm proxy, sau đó pass cho Apache xử lí nhưng hiện tại, NGINX đã quá phổ biến rồi, hầu hết các ứng dụng đều đã có thể làm việc tốt với NGINX nên bạn sẽ không cần đến việc này nữa vì nó có thể làm giảm hiệu năng của NGINX và website sẽ load chậm hơn, thay vào đó nếu cần hãy sử dụng các ứng dụng Proxy tốt như HAProxy mà mình đang sử dụng làm Load Balancing cho blog.

Hãy cài đặt NGINX từ source code và chỉ cài đặt các module cần thiết

Nếu có thể, bạn hãy cài đặt hay compile NGINX từ source code của nó và chỉ compile các module cần thiết vì nếu chúng ta cài đặt NGINX từ repository của Linux, mặc định có rất nhiều module mà chúng ta không dùng đến, như thế cũng làm giảm hiệu năng của NGINX, các bạn có thể tham khảo các cài đặt, compile NGINX từ source trong bài viết sau: Cài đặt NGINX từ source và tối ưu hiệu năng, chỉ cài các module cần thiết

Nên xem: Cài đặt HHVM để tăng tốc xử lí PHP lên 50% cho Debian/ Unbuntu/ CentOS

Qua bài viết này các bạn đã viết thêm được nhiều cách tối ưu và tăng tốc cho nginx. Có khó khăn gì thì bình luận bên dưới cho mình biết nhé !

Chúc các bạn thành công!

Nếu bạn thấy có ích, hãy subcribe blog của tôi để nhận thêm nhiều tút hay qua email nữa nhé!