Khắc Phục Lỗi 403 và 404 Trên Nginx
Giới Thiệu
Trong quá trình quản lý máy chủ web, lỗi 403 Forbidden và 404 Not Found là hai trong số những sự cố phổ biến nhất mà bạn có thể gặp phải với Nginx. Lỗi 403 cho biết rằng máy chủ hiểu yêu cầu nhưng từ chối cấp quyền truy cập, thường liên quan đến quyền truy cập tệp hoặc thư mục. Trong khi đó, lỗi 404 có nghĩa là máy chủ không tìm thấy tài nguyên được yêu cầu tại URL đã cung cấp.
Bài viết này sẽ hướng dẫn bạn từng bước cách chẩn đoán và khắc phục các lỗi này, giúp website của bạn hoạt động trở lại một cách nhanh chóng và hiệu quả.
📋 Thời gian: 20-30 phút | Độ khó: Trung bình
Yêu Cầu
Để thực hiện theo hướng dẫn này, bạn cần có:
- Quyền truy cập SSH vào máy chủ Linux của bạn.
- Quyền
sudohoặc quyền root để thực hiện các lệnh quản trị. - Nginx đã được cài đặt và đang chạy trên máy chủ của bạn.
- Hiểu biết cơ bản về cấu trúc tệp hệ thống Linux và cấu hình Nginx.
Các Bước Thực Hiện
Bước 1: Kiểm tra Log Nginx
Việc đầu tiên và quan trọng nhất khi gặp bất kỳ lỗi nào trên Nginx là kiểm tra các tệp log. Log Nginx cung cấp thông tin chi tiết về các yêu cầu và lỗi, giúp bạn xác định nguyên nhân gốc rễ.
# Xem log lỗi của Nginx
sudo tail -f /var/log/nginx/error.log
# Xem log truy cập của Nginx (để kiểm tra các yêu cầu đến)
sudo tail -f /var/log/nginx/access.log
💡 Mẹo: Ghi lại thời gian xảy ra lỗi và tìm kiếm các dòng log tương ứng. Các thông báo lỗi trong error.log thường rất cụ thể, chỉ ra tệp hoặc thư mục nào đang gặp sự cố.
Bước 2: Khắc phục Lỗi 403 Forbidden
Lỗi 403 thường xuất hiện khi Nginx từ chối truy cập vào một tài nguyên mặc dù tài nguyên đó tồn tại. Các nguyên nhân phổ biến bao gồm quyền truy cập tệp/thư mục không đúng, cấu hình Nginx sai hoặc thiếu tệp index.
2.1. Kiểm tra Quyền Truy Cập Tệp và Thư Mục
Đây là nguyên nhân phổ biến nhất gây ra lỗi 403. Nginx cần có quyền đọc các tệp và quyền thực thi (execute) trên các thư mục để có thể phục vụ nội dung.
# Xác định người dùng Nginx đang chạy (thường là 'www-data' hoặc 'nginx')
grep user /etc/nginx/nginx.conf
# Ví dụ: Giả sử người dùng Nginx là 'www-data'
# Kiểm tra quyền của thư mục gốc website (ví dụ: /var/www/html)
ls -ld /var/www/html
# Kiểm tra quyền của các tệp trong thư mục gốc
ls -l /var/www/html/index.html
# Thiết lập quyền truy cập chuẩn
# Thư mục: 755 (owner read/write/execute, group read/execute, others read/execute)
sudo find /var/www/html -type d -exec chmod 755 {} \;
# Tệp: 644 (owner read/write, group read, others read)
sudo find /var/www/html -type f -exec chmod 644 {} \;
# Đảm bảo người dùng Nginx là chủ sở hữu của các tệp/thư mục
sudo chown -R www-data:www-data /var/www/html
⚠️ Cảnh báo: Thay thế /var/www/html bằng đường dẫn thực tế đến thư mục gốc website của bạn. Đảm bảo người dùng và nhóm (www-data:www-data) khớp với người dùng Nginx của bạn.
2.2. Kiểm tra Cấu hình Nginx (Chỉ thị root và index)
Đảm bảo rằng chỉ thị root trong file cấu hình Nginx trỏ đúng đến thư mục gốc của website và chỉ thị index được thiết lập đúng.
# Ví dụ cấu hình Nginx (thường nằm trong /etc/nginx/sites-available/your_domain.conf)
server {
listen 80;
server_name your_domain.com www.your_domain.com;
# Đảm bảo đường dẫn này chính xác
root /var/www/html;
# Đảm bảo các tệp index được liệt kê đúng
index index.html index.htm index.nginx-debian.html;
location / {
# Nếu directory listing bị tắt và không có tệp index, sẽ gây lỗi 403
# autoindex off;
try_files $uri $uri/ =404;
}
}
Nếu autoindex off; và không có tệp index nào được tìm thấy trong thư mục, Nginx sẽ trả về 403.
2.3. Kiểm tra các Chỉ thị deny
Đôi khi, các chỉ thị deny all; không mong muốn có thể chặn truy cập.
# Tìm kiếm các chỉ thị deny trong cấu hình Nginx của bạn
sudo grep -r "deny all" /etc/nginx/sites-available/
sudo grep -r "deny all" /etc/nginx/nginx.conf
Nếu tìm thấy, hãy xem xét liệu chúng có cần thiết hay không.
Bước 3: Khắc phục Lỗi 404 Not Found
Lỗi 404 xảy ra khi Nginx không thể tìm thấy tài nguyên mà người dùng yêu cầu. Điều này thường liên quan đến đường dẫn tệp sai, URL sai hoặc cấu hình try_files không chính xác.
3.1. Kiểm tra Chỉ thị root và Đường dẫn URL
Đảm bảo rằng chỉ thị root trong cấu hình Nginx trỏ đến đúng thư mục gốc của trang web. Sau đó, kiểm tra kỹ URL mà bạn đang cố gắng truy cập và đảm bảo rằng tệp hoặc thư mục tương ứng thực sự tồn tại trên máy chủ.
# Ví dụ: Nếu root là /var/www/html và bạn truy cập your_domain.com/about/index.html
# Đảm bảo tệp này tồn tại:
ls /var/www/html/about/index.html
Nếu tệp không tồn tại, đó là lý do của lỗi 404.
3.2. Kiểm tra Chỉ thị try_files
Đối với các ứng dụng web phức tạp (như WordPress, Laravel) sử dụng cấu trúc URL thân thiện (pretty URLs), chỉ thị try_files là rất quan trọng. Nó hướng dẫn Nginx cách tìm kiếm tệp khi một URL không trỏ trực tiếp đến một tệp tĩnh.
# Ví dụ cấu hình try_files cho một ứng dụng web
server {
listen 80;
server_name your_domain.com;
root /var/www/html/public; # Lưu ý: root có thể trỏ đến thư mục public
index index.php index.html;
location / {
# Nginx sẽ thử tìm $uri, sau đó $uri/, sau đó chuyển yêu cầu đến index.php
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # Thay bằng socket PHP-FPM của bạn
}
}
Nếu try_files không được cấu hình đúng, Nginx có thể không tìm thấy các tệp script của ứng dụng, dẫn đến 404.
3.3. Kiểm tra Symbolic Links (Symlinks)
Nếu bạn đang sử dụng các liên kết tượng trưng (symlinks) cho các thư mục hoặc tệp, hãy đảm bảo rằng Nginx được phép theo dõi chúng. Mặc định, Nginx không theo dõi symlinks ngoài thư mục root trừ khi được cấu hình rõ ràng.
# Để cho phép Nginx theo dõi symlinks
location / {
root /var/www/html;
# Thêm dòng này nếu bạn sử dụng symlinks bên ngoài thư mục root
# hoặc trong các trường hợp phức tạp hơn
disable_symlinks off;
try_files $uri $uri/ =404;
}
⚠️ Cảnh báo: disable_symlinks off; có thể tạo ra rủi ro bảo mật nếu không được sử dụng cẩn thận. Hãy chắc chắn bạn hiểu rõ về các symlinks của mình.
Bước 4: Kiểm tra và Khởi động lại Nginx
Sau khi thực hiện bất kỳ thay đổi nào đối với tệp cấu hình Nginx, bạn phải kiểm tra cú pháp và sau đó tải lại dịch vụ.
# Kiểm tra cú pháp cấu hình Nginx
sudo nginx -t
# Nếu kiểm tra thành công, tải lại Nginx
sudo systemctl reload nginx
# Hoặc, nếu có lỗi nghiêm trọng, khởi động lại Nginx (có thể gây gián đoạn ngắn)
# sudo systemctl restart nginx
✅ Thành công: Nếu nginx -t trả về syntax is ok và test is successful, bạn có thể tự tin tải lại Nginx.
Troubleshooting
- Nginx không chạy: Nếu Nginx hoàn toàn không phản hồi, hãy kiểm tra trạng thái của nó:
Nếu nó không chạy, hãy xem log hệ thống để biết thêm chi tiết:
sudo systemctl status nginxjournalctl -xe. - Lỗi 403 với SELinux/AppArmor: Trên một số hệ thống (như CentOS/RHEL với SELinux, hoặc Ubuntu với AppArmor), các chính sách bảo mật này có thể ngăn Nginx truy cập vào các tệp ngay cả khi quyền Linux đã đúng.
- SELinux: Kiểm tra log audit (
sudo ausearch -c httpd_t -m avc) và sử dụngsudo restorecon -Rv /var/www/htmlđể khôi phục ngữ cảnh bảo mật. - AppArmor: Kiểm tra log (
sudo dmesg | grep apparmor) và xem xét chỉnh sửa profile AppArmor cho Nginx nếu cần.
- SELinux: Kiểm tra log audit (
- Lỗi bộ nhớ cache trình duyệt/CDN: Đôi khi, lỗi 403/404 có thể do trình duyệt hoặc CDN lưu trữ phiên bản cũ của trang. Hãy thử xóa bộ nhớ cache của trình duyệt hoặc sử dụng chế độ ẩn danh. Nếu bạn dùng CDN, hãy xóa cache của CDN.
- Location block xung đột: Nếu bạn có nhiều
locationblock trong cấu hình Nginx, chúng có thể xung đột và điều hướng yêu cầu không đúng cách. Hãy xem xét thứ tự ưu tiên và các biểu thức chính quy.
Kết Luận
Việc khắc phục lỗi 403 Forbidden và 404 Not Found trên Nginx đòi hỏi một cách tiếp cận có hệ thống, bắt đầu từ việc kiểm tra log. Hầu hết các vấn đề này đều bắt nguồn từ quyền truy cập tệp/thư mục không chính xác, cấu hình Nginx sai hoặc thiếu tệp. Bằng cách làm theo các bước đã trình bày, bạn có thể nhanh chóng xác định và giải quyết các sự cố phổ biến này.
Best practices:
- Kiểm tra log thường xuyên: Đặt lịch kiểm tra log Nginx để phát hiện sớm các vấn đề.
- Quyền truy cập tối thiểu: Luôn đặt quyền truy cập tệp và thư mục theo nguyên tắc "ít đặc quyền nhất", chỉ cấp những quyền cần thiết.
- Kiểm tra cấu hình trước: Luôn sử dụng
sudo nginx -ttrước khi tải lại Nginx để tránh lỗi cú pháp. - Sao lưu cấu hình: Luôn sao lưu các tệp cấu hình Nginx của bạn trước khi thực hiện các thay đổi lớn.
Chúc bạn thành công!