Cấu hình Nginx cơ bản cho người mới: Hướng dẫn từng bước từ A đến Z

Bạn là người mới và muốn tìm hiểu về Nginx? Đừng lo lắng! Bài viết này sẽ cung cấp cho bạn những kiến thức Cấu Hình Nginx Cơ Bản Cho Người Mới một cách dễ hiểu nhất, giúp bạn tự tin triển khai web server của mình. Chúng ta sẽ cùng nhau khám phá từ cài đặt, cấu hình server block, xử lý file tĩnh, đến những mẹo tối ưu hiệu suất, đảm bảo website của bạn hoạt động mượt mà và hiệu quả.

Nginx là gì và tại sao bạn nên sử dụng nó?

Nginx (phát âm là “engine-ex”) là một web server mã nguồn mở, hiệu suất cao, có thể được sử dụng như một reverse proxy, load balancer, HTTP cache và hơn thế nữa. So với Apache, Nginx nổi bật hơn về khả năng xử lý đồng thời lượng lớn kết nối, sử dụng tài nguyên hiệu quả và cấu hình linh hoạt.

  • Hiệu suất: Nginx được thiết kế để xử lý nhiều request đồng thời với mức tiêu thụ tài nguyên tối thiểu, giúp website của bạn hoạt động nhanh chóng và ổn định.
  • Linh hoạt: Với cấu hình dựa trên file văn bản đơn giản, bạn có thể dễ dàng tùy chỉnh Nginx để phù hợp với nhu cầu cụ thể của mình.
  • Reverse proxy: Nginx có thể đóng vai trò là một lớp bảo vệ cho server backend, giúp tăng cường bảo mật và khả năng mở rộng.
  • Load balancing: Phân phối traffic đến nhiều server backend, đảm bảo website luôn sẵn sàng phục vụ người dùng, ngay cả khi có lượng truy cập lớn.

Chính vì những ưu điểm này, Nginx ngày càng trở nên phổ biến và được sử dụng rộng rãi bởi các công ty lớn như Netflix, Airbnb, và WordPress.com.

Cài đặt Nginx: Hướng dẫn chi tiết cho các hệ điều hành phổ biến

Việc cài đặt Nginx khá đơn giản, tùy thuộc vào hệ điều hành bạn đang sử dụng. Dưới đây là hướng dẫn chi tiết cho một số hệ điều hành phổ biến:

Trên Ubuntu/Debian:

  1. Cập nhật package list:

    sudo apt update
  2. Cài đặt Nginx:

    sudo apt install nginx
  3. Kiểm tra trạng thái Nginx:

    sudo systemctl status nginx

    Nếu Nginx đang chạy, bạn sẽ thấy dòng chữ “active (running)”.

  4. Cho phép Nginx chạy khi khởi động:

     sudo systemctl enable nginx

Trên CentOS/RHEL:

  1. Cài đặt EPEL repository (nếu chưa có):

    sudo yum install epel-release
  2. Cài đặt Nginx:

    sudo yum install nginx
  3. Khởi động Nginx:

    sudo systemctl start nginx
  4. Kiểm tra trạng thái Nginx:

    sudo systemctl status nginx
  5. Cho phép Nginx chạy khi khởi động:

    sudo systemctl enable nginx
  6. Mở port 80 và 443 trên Firewall (nếu sử dụng firewalld):

    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https
    sudo firewall-cmd --reload

Trên Windows:

  1. Tải Nginx từ trang chủ: Truy cập http://nginx.org/en/download.html và tải phiên bản phù hợp cho Windows.

  2. Giải nén file đã tải: Giải nén file zip vào một thư mục, ví dụ: C:nginx.

  3. Chạy Nginx: Mở command prompt (cmd) và di chuyển đến thư mục Nginx:

    cd C:nginx

    Sau đó chạy lệnh:

    start nginx

    Nếu bạn gặp lỗi liên quan đến quyền truy cập, hãy thử chạy cmd với quyền administrator.

  4. Kiểm tra: Mở trình duyệt và truy cập http://localhost. Nếu bạn thấy trang “Welcome to nginx!”, có nghĩa là Nginx đã được cài đặt thành công.

Sau khi cài đặt thành công, bạn có thể truy cập http://localhost (hoặc địa chỉ IP của server) để kiểm tra xem Nginx đã hoạt động hay chưa. Nếu thấy trang “Welcome to nginx!”, xin chúc mừng, bạn đã cài đặt Nginx thành công!

Cấu hình Server Block: “Nhà” cho website của bạn

Server block (trong Apache gọi là Virtual Host) là một phần quan trọng trong cấu hình Nginx, cho phép bạn host nhiều website trên cùng một server. Mỗi server block sẽ định nghĩa cách Nginx xử lý các request đến từ một domain hoặc subdomain cụ thể.

Tạo file cấu hình Server Block

Thông thường, các file cấu hình server block sẽ được lưu trữ trong thư mục /etc/nginx/conf.d/ hoặc /etc/nginx/sites-available/ (tùy thuộc vào hệ điều hành). Hãy tạo một file cấu hình mới cho website của bạn, ví dụ: /etc/nginx/conf.d/example.com.conf (hoặc /etc/nginx/sites-available/example.com và tạo symlink đến /etc/nginx/sites-enabled/):

sudo nano /etc/nginx/conf.d/example.com.conf

Cấu trúc cơ bản của Server Block

Một server block cơ bản sẽ có cấu trúc như sau:

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}
  • listen 80;: Chỉ định cổng mà Nginx sẽ lắng nghe (cổng 80 là cổng mặc định cho HTTP).
  • server_name example.com www.example.com;: Xác định domain name mà server block này sẽ xử lý. Bạn có thể liệt kê nhiều domain name cách nhau bằng dấu cách. Nếu nginx không nhận domain, hãy kiểm tra lại dòng này và chắc chắn rằng bạn đã trỏ domain về địa chỉ IP của server.
  • root /var/www/example.com;: Chỉ định thư mục gốc chứa các file website của bạn.
  • index index.html index.htm;: Xác định file index mặc định sẽ được trả về khi người dùng truy cập vào thư mục.
  • location / { ... }: Định nghĩa cách Nginx xử lý các request đến từ các URL khác nhau. Trong trường hợp này, location / sẽ xử lý tất cả các request.
  • try_files $uri $uri/ =404;: Lệnh này sẽ cố gắng tìm file hoặc thư mục tương ứng với URL được yêu cầu. Nếu không tìm thấy, nó sẽ trả về lỗi 404. Nếu bạn gặp lỗi 404 nginx xử lý thế nào, hãy kiểm tra lại đường dẫn root và đảm bảo rằng file index.html (hoặc file index khác) tồn tại trong thư mục đó.

Ví dụ cấu hình Server Block cho WordPress

Nếu bạn muốn host một website WordPress, bạn có thể sử dụng cấu hình server block sau:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php;

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

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock; # Thay đổi phiên bản PHP nếu cần
    }

    location ~ /.ht {
        deny all;
    }
}

Lưu ý:

  • Thay đổi /var/www/example.com thành đường dẫn thực tế đến thư mục chứa website của bạn.
  • Thay đổi fastcgi_pass unix:/run/php/php7.4-fpm.sock; thành đường dẫn socket của PHP-FPM nếu cần.
  • Đảm bảo bạn đã cài đặt PHP-FPM và cấu hình nó để làm việc với Nginx.

Kích hoạt Server Block

Sau khi tạo file cấu hình server block, bạn cần kích hoạt nó bằng cách tạo một symlink từ /etc/nginx/sites-available/example.com đến /etc/nginx/sites-enabled/example.com (nếu sử dụng cấu trúc sites-availablesites-enabled).

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

Sau đó, kiểm tra cấu hình Nginx và khởi động lại để áp dụng thay đổi:

sudo nginx -t
sudo systemctl restart nginx

“Việc cấu hình server block đúng cách là rất quan trọng để website của bạn hoạt động ổn định và bảo mật,” ông Nguyễn Văn A, một chuyên gia về web server với hơn 10 năm kinh nghiệm, chia sẻ. “Hãy dành thời gian tìm hiểu kỹ các tùy chọn cấu hình và đảm bảo rằng bạn hiểu rõ tác động của chúng.”

Xử lý File Tĩnh: Tối ưu tốc độ website

File tĩnh (static files) là các file không thay đổi nội dung, chẳng hạn như hình ảnh, CSS, JavaScript. Việc xử lý file tĩnh hiệu quả là một yếu tố quan trọng để cải thiện tốc độ website.

Cấu hình Cache cho File Tĩnh

Để giảm tải cho server và tăng tốc độ tải trang, bạn có thể cấu hình Nginx để cache các file tĩnh. Thêm đoạn code sau vào server block của bạn:

location ~* .(jpg|jpeg|png|gif|css|js|ico)$ {
    expires 30d;
    add_header Cache-Control "public, max-age=2592000";
}
  • *`location ~ .(jpg|jpeg|png|gif|css|js|ico)$`**: Chỉ định các loại file tĩnh sẽ được cache.
  • expires 30d;: Thiết lập thời gian cache là 30 ngày.
  • add_header Cache-Control "public, max-age=2592000";: Thêm header Cache-Control để hướng dẫn trình duyệt cache file.

Sử dụng Gzip Compression

Gzip là một phương pháp nén dữ liệu giúp giảm kích thước file và tăng tốc độ tải trang. Để bật Gzip compression trong Nginx, thêm đoạn code sau vào file /etc/nginx/nginx.conf:

gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss image/svg+xml;
  • gzip on;: Bật Gzip compression.
  • gzip_disable "msie6";: Tắt Gzip cho trình duyệt Internet Explorer 6 (vì phiên bản này có thể gặp lỗi khi xử lý Gzip).
  • gzip_types ...;: Xác định các loại file sẽ được nén bằng Gzip.

Sau khi thay đổi, hãy kiểm tra cấu hình và khởi động lại Nginx:

sudo nginx -t
sudo systemctl restart nginx

Serving Static Content Efficiently

Ngoài việc caching và Gzip compression, bạn cũng nên đảm bảo rằng bạn đang serving static content một cách hiệu quả. Điều này có nghĩa là:

  • Sử dụng CDN (Content Delivery Network): CDN giúp phân phối static content đến người dùng từ các server gần nhất, giảm độ trễ và tăng tốc độ tải trang.
  • Tối ưu hóa hình ảnh: Sử dụng các công cụ nén ảnh để giảm kích thước file mà không làm giảm chất lượng.
  • Minify CSS và JavaScript: Loại bỏ các ký tự không cần thiết (như khoảng trắng, comment) khỏi file CSS và JavaScript để giảm kích thước file.

Các lệnh Nginx cơ bản bạn cần biết

Để quản lý Nginx một cách hiệu quả, bạn cần làm quen với một số lệnh cơ bản sau:

  • sudo systemctl start nginx: Khởi động Nginx.
  • sudo systemctl stop nginx: Dừng Nginx.
  • sudo systemctl restart nginx: Khởi động lại Nginx (dừng và khởi động lại). Nếu bạn gặp vấn đề nginx không chạy sau reboot, hãy kiểm tra xem bạn đã enable Nginx để chạy khi khởi động hay chưa (sử dụng lệnh sudo systemctl enable nginx).
  • sudo systemctl reload nginx: Tải lại cấu hình Nginx mà không làm gián đoạn kết nối.
  • sudo systemctl status nginx: Kiểm tra trạng thái của Nginx.
  • sudo nginx -t: Kiểm tra cấu hình Nginx xem có lỗi cú pháp hay không.

Bảo mật Nginx: Giữ cho website của bạn an toàn

Bảo mật là một yếu tố quan trọng không thể bỏ qua khi cấu hình Nginx. Dưới đây là một số biện pháp bảo mật cơ bản bạn nên áp dụng:

Cấu hình SSL/TLS

SSL/TLS là giao thức mã hóa giúp bảo vệ dữ liệu truyền tải giữa server và trình duyệt. Để cấu hình SSL/TLS cho Nginx, bạn cần có một SSL certificate. Bạn có thể mua certificate từ các nhà cung cấp uy tín hoặc sử dụng Let’s Encrypt để có certificate miễn phí.

Sau khi có certificate, thêm đoạn code sau vào server block của bạn:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;

    # Các cấu hình khác
}
  • listen 443 ssl http2;: Lắng nghe trên cổng 443 (cổng mặc định cho HTTPS) và bật SSL/TLS và HTTP/2. Tìm hiểu thêm về việc nginx hỗ trợ http/2 không để tối ưu website của bạn.
  • ssl_certificate /etc/ssl/certs/example.com.crt;: Chỉ định đường dẫn đến file certificate.
  • ssl_certificate_key /etc/ssl/private/example.com.key;: Chỉ định đường dẫn đến file private key.
  • return 301 https://$host$request_uri;: Chuyển hướng tất cả các request từ HTTP sang HTTPS. Nếu bạn muốn nginx redirect domain này sang domain khác, bạn có thể sử dụng cấu hình tương tự.

Ngăn chặn Hotlinking

Hotlinking là việc người khác sử dụng hình ảnh hoặc file của bạn trên website của họ, gây tốn băng thông cho server của bạn. Để ngăn chặn hotlinking, thêm đoạn code sau vào server block của bạn:

location ~* .(jpg|jpeg|png|gif)$ {
    valid_referers none blocked example.com *.example.com;
    if ($invalid_referer) {
        return 403;
    }
}
  • *`valid_referers none blocked example.com .example.com;**: Chỉ cho phép truy cập vào hình ảnh từ domain của bạn (example.com` và các subdomain của nó).
  • if ($invalid_referer) { return 403; }: Trả về lỗi 403 (Forbidden) nếu request đến từ một referer không hợp lệ.

Giới hạn Request Rate

Giới hạn request rate giúp ngăn chặn các cuộc tấn công DoS (Denial of Service) bằng cách giới hạn số lượng request mà một IP address có thể gửi đến server trong một khoảng thời gian nhất định.

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;

server {
    location / {
        limit_req zone=mylimit burst=5 nodelay;
    }
}
  • limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;: Định nghĩa một zone giới hạn request rate tên là mylimit, với kích thước 10MB và rate là 1 request/giây.
  • limit_req zone=mylimit burst=5 nodelay;: Áp dụng giới hạn request rate cho tất cả các request đến /, cho phép tối đa 5 burst request (request vượt quá giới hạn) mà không bị delay.

“Bảo mật website là một quá trình liên tục,” bà Trần Thị B, một chuyên gia bảo mật web với hơn 5 năm kinh nghiệm, nhấn mạnh. “Hãy thường xuyên cập nhật Nginx và các phần mềm khác, và theo dõi các bản tin bảo mật để phát hiện và khắc phục các lỗ hổng kịp thời.”

Tối ưu hiệu suất Nginx: Đạt được tốc độ tối đa

Ngoài các biện pháp tối ưu file tĩnh đã đề cập, còn có một số kỹ thuật khác giúp bạn tối ưu hiệu suất Nginx:

Sử dụng HTTP/2

HTTP/2 là một phiên bản mới của giao thức HTTP, được thiết kế để cải thiện tốc độ và hiệu suất của web. Để bật HTTP/2 trong Nginx, bạn chỉ cần thêm http2 vào dòng listen 443 ssl trong server block của bạn (như đã thấy trong phần cấu hình SSL/TLS).

Tăng Worker Processes

Worker processes là các tiến trình thực tế xử lý các request đến từ người dùng. Bạn có thể tăng số lượng worker processes để tận dụng tối đa sức mạnh của CPU. Mở file /etc/nginx/nginx.conf và tìm dòng worker_processes auto;. Thay auto bằng số lượng CPU cores của bạn.

Tinh chỉnh Buffer Size

Nginx sử dụng buffer để lưu trữ dữ liệu trước khi gửi đến client. Bạn có thể tinh chỉnh kích thước buffer để tối ưu hiệu suất. Thêm các dòng sau vào file /etc/nginx/nginx.conf:

client_body_buffer_size 10k;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 4 4k;

Sử dụng Cache Module

Nginx có một module cache tích hợp giúp bạn cache các response từ server backend, giảm tải cho server backend và tăng tốc độ tải trang. Để sử dụng cache module, bạn cần cấu hình một cache zone và sau đó sử dụng directive proxy_cache_path để chỉ định nơi lưu trữ cache.

Kết luận

Vậy là bạn đã nắm được những kiến thức cấu hình Nginx cơ bản cho người mới. Từ cài đặt, cấu hình server block, xử lý file tĩnh, bảo mật, đến tối ưu hiệu suất, hy vọng bài viết này đã cung cấp cho bạn một nền tảng vững chắc để bắt đầu hành trình khám phá Nginx. Hãy nhớ rằng, việc học hỏi và thử nghiệm là chìa khóa để trở thành một chuyên gia Nginx thực thụ. Chúc bạn thành công!

Câu hỏi thường gặp (FAQ)

1. Làm thế nào để kiểm tra phiên bản Nginx đang sử dụng?

Bạn có thể sử dụng lệnh nginx -v trong terminal để kiểm tra phiên bản Nginx.

2. Làm thế nào để tìm file cấu hình Nginx?

File cấu hình chính của Nginx thường nằm ở /etc/nginx/nginx.conf. Các file cấu hình server block thường nằm ở /etc/nginx/conf.d/ hoặc /etc/nginx/sites-available/.

3. Làm thế nào để khắc phục lỗi “403 Forbidden”?

Lỗi “403 Forbidden” thường xảy ra khi Nginx không có quyền truy cập vào file hoặc thư mục mà bạn đang cố gắng truy cập. Hãy kiểm tra quyền truy cập của file và thư mục, và đảm bảo rằng Nginx có quyền đọc và thực thi.

4. Làm thế nào để cấu hình Nginx làm reverse proxy?

Để cấu hình Nginx làm reverse proxy, bạn cần sử dụng directive proxy_pass trong location block. Ví dụ:

location / {
    proxy_pass http://backend_server;
}

5. Làm thế nào để cấu hình Nginx làm load balancer?

Để cấu hình Nginx làm load balancer, bạn cần định nghĩa một upstream block chứa danh sách các server backend, và sau đó sử dụng directive proxy_pass để chuyển traffic đến upstream block đó. Ví dụ:

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

6. Làm thế nào để sử dụng Let’s Encrypt để có SSL certificate miễn phí?

Bạn có thể sử dụng Certbot, một công cụ tự động hóa quá trình tạo và cài đặt SSL certificate từ Let’s Encrypt. Truy cập https://certbot.eff.org/ để được hướng dẫn chi tiết.

7. Nginx có thể thay thế hoàn toàn Apache không?

Nginx và Apache đều là những web server mạnh mẽ, mỗi loại có ưu và nhược điểm riêng. Trong một số trường hợp, Nginx có thể là lựa chọn tốt hơn (ví dụ: khi cần xử lý lượng lớn kết nối đồng thời). Tuy nhiên, trong những trường hợp khác, Apache có thể phù hợp hơn (ví dụ: khi cần sử dụng các module phức tạp). Việc lựa chọn web server phù hợp phụ thuộc vào nhu cầu cụ thể của bạn.