Cấu Hình và Thứ Tự Ưu Tiên Location Trong Nginx

Hiểu sâu về Directive Location

Trong Nginx, directive location đóng vai trò quyết định cách thức xử lý các yêu cầu HTTP dựa trên đường dẫn URI được gửi đến. Một khối server có thể chứa nhiều cấu hình location khác nhau, do đó việc hiểu rõ cơ chế ưu tiên là yếu tố then chốt để đảm bảo lưu lượng truy cập được định tuyến chính xác đến backend hoặc tệp tĩnh phù hợp.

Nguyên tắc khớp URI và Ký hiệu

Nginx cung cấp các ký hiệu đặc biệt để xác định phương thức khớp giữa URI yêu cầu và cấu hình location. Dưới đây là bảng tổng hợp các loại匹配 (matching) phổ biến:

Ký hiệu Ý nghĩa Mức độ ưu tiên
= Khớp chính xác toàn bộ đường dẫn Cao nhất (1)
^~ Khớp tiền tố chuỗi, dừng tìm kiếm regex Cao (2)
~ Khớp biểu thức chính quy (phân biệt hoa thường) Trung bình (3)
~* Khớp biểu thức chính quy (không phân biệt hoa thường) Trung bình (3)
/ Khớp tiền tố chung (mặc định) Thấp nhất (4)

Quy trình xử lý ưu tiên

  1. Khớp chính xác: Nếu tìm thấy location sử dụng = trùng khớp hoàn toàn, Nginx sẽ chọn ngay lập tức và bỏ qua các kiểm tra còn lại.
  2. Khớp tiền tố: Nếu không có khớp chính xác, Nginx sẽ tìm các location dạng tiền tố. Nếu tìm thấy loại ^~, quá trình khớp regex sẽ bị bỏ qua và kết quả được chọn ngay. Nếu có nhiều location tiền tố thường, cái có độ dài chuỗi khớp lớn nhất sẽ được tạm chọn.
  3. Khớp Regex: Cuối cùng, Nginx kiểm tra các location dạng regex (~ hoặc ~*) theo thứ tự xuất hiện trong file cấu hình. Location regex đầu tiên khớp thành công sẽ được chọn. Nếu không có regex nào khớp, kết quả tạm chọn ở bước 2 (tiền tố dài nhất) sẽ được sử dụng.

Ví dụ minh họa thứ tự ưu tiên

Đoạn cấu hình dưới đây demonstrates cách Nginx phân xử các yêu cầu khác nhau dựa trên ký hiệu location:

server {
    listen 80;
    server_name example.com;

    # Khớp regex không phân biệt hoa thường
    location ~* \.(png|jpg)$ {
        default_type text/plain;
        return 200 "Matched: Case-insensitive Regex";
    }

    # Khớp regex phân biệt hoa thường
    location ~ /Admin {
        default_type text/plain;
        return 200 "Matched: Case-sensitive Regex";
    }

    # Khớp tiền tố ưu tiên cao, dừng tìm regex
    location ^~ /static/ {
        default_type text/plain;
        return 200 "Matched: Prefix Priority";
    }

    # Khớp chính xác tuyệt đối
    location = /health-check {
        default_type text/plain;
        return 200 "Matched: Exact Match";
    }
}

Thực hành: Chia sẻ tài nguyên tĩnh qua NFS

Trong môi trường đa máy chủ web, việc đồng bộ dữ liệu tĩnh (như hình ảnh game, video) là một thách thức. Giải pháp sử dụng NFS (Network File System) cho phép nhiều web server cùng mount một thư mục lưu trữ chung từ một máy chủ trung tâm.

1. Cấu hình máy chủ NFS (Storage Server)

Giả sử máy chủ lưu trữ có IP 10.0.0.50. Chúng ta sẽ tạo thư mục chia sẻ và cấp quyền truy cập cho mạng nội bộ.

# Tạo thư mục chứa dữ liệu chung
mkdir -p /srv/share/assets
chown -R nginx:nginx /srv/share/assets

# Cấu hình exports
vim /etc/exports
# Thêm dòng sau vào file:
/srv/share/assets  10.0.0.0/24(rw,sync,no_root_squash,all_squash,anonuid=999,anongid=999)

# Khởi động lại dịch vụ
systemctl restart nfs-server rpcbind

# Kiểm tra trạng thái chia sẻ
showmount -e localhost

2. Cấu hình máy chủ Web (Client)

Tại máy chủ web (ví dụ IP 10.0.0.10), thực hiện mount thư mục chia sẻ vào hệ thống tệp cục bộ.

# Tạo điểm mount
mkdir -p /mnt/web_assets

# Mount thư mục NFS
mount -t nfs 10.0.0.50:/srv/share/assets /mnt/web_assets

# Kiểm tra dung lượng đã mount
df -h | grep web_assets

3. Cấu hình Nginx để phục vụ dữ liệu

Giả sử mã nguồn game được đặt tại /var/www/game, nhưng hình ảnh cần lấy từ thư mục NFS đã mount.

vim /etc/nginx/conf.d/game_site.conf

Nội dung cấu hình:

server {
    listen 80;
    server_name 10.0.0.10;

    # Cấu hình gốc cho mã nguồn game
    location / {
        root /var/www/game;
        index index.html;
    }

    # Định tuyến request ảnh về thư mục NFS
    location ^~ /assets/ {
        alias /mnt/web_assets/;
        # Hoặc sử dụng root nếu cấu trúc thư mục phù hợp
        # root /mnt/web_assets; 
    }
}

4. Kiểm tra và xử lý sự cố

Sau khi khởi động lại Nginx, nếu trình duyệt không hiển thị ảnh, cần kiểm tra日志 (logs) để tìm nguyên nhân.

# Xem log lỗi thời gian thực
tail -f /var/log/nginx/error.log

Một lỗi phổ biến là cấu trúc thư mục không khớp. Ví dụ, nếu code yêu cầu đường dẫn /assets/images/logo.png nhưng file thực tế nằm ngay trong thư mục mount, ta cần điều chỉnh lại cấu trúc thư mục hoặc sửa directive alias.

# Điều chỉnh cấu trúc thư mục tại điểm mount
cd /mnt/web_assets
mkdir -p images
mv *.png images/
mv *.jpg images/

Sau khi điều chỉnh, reload Nginx và kiểm tra lại trên trình duyệt.

5. Mở rộng sang nhiều máy chủ Web

Để triển khai thêm máy chủ web thứ hai (ví dụ IP 10.0.0.11), chỉ cần lặp lại bước mount NFS và sao chép cấu hình Nginx tương tự. Dữ liệu chỉ cần lưu trữ một lần tại máy chủ NFS, cả hai web server đều có thể truy cập đọc ghi đồng bộ.

# Tại web server thứ 2
mkdir -p /mnt/web_assets
mount -t nfs 10.0.0.50:/srv/share/assets /mnt/web_assets

# Sao chép cấu hình nginx từ server 1 sang
scp 10.0.0.10:/etc/nginx/conf.d/game_site.conf /etc/nginx/conf.d/

# Khởi động dịch vụ
systemctl restart nginx

Khi truy cập vào IP của máy chủ thứ hai, tài nguyên tĩnh sẽ được tải thành công từ cùng một nguồn lưu trữ chung, đảm bảo tính nhất quán dữ liệu trên toàn hệ thống.

Thẻ: nginx location-matching nfs-storage web-architecture linux-sysadmin

Đăng vào ngày 27 tháng 8 lúc 19:53