[VPS] Sửa lỗi 403 forbidden trên server NGinX và PHP

Thi thoảng khi cài đặt NGinX và PHP lên server Linux thường bị tình trạng lỗi 403 forbidden mặc dù đã cấu hình các thông số đầy đủ. Kiểm tra log của NGINX thì sẽ thấy thông báo Permission denied. Lúc này việc cần làm là kiểm tra kĩ việc cấp quyền truy cập của NGINX đối với thư mục chứa mã nguồn trang.

I. Cấp quyền truy cập cho user/group nginx

Giả sử mã nguồn trang web được đặt tại /var/www/domain_name/public_html.

Đảm bảo các file mã nguồn có thể đọc và execute:

sudo chmod 0755 -R /var/www/domain_name

Cấp quyền đọc và ghi cho NGINX:

sudo chown -R nginx:nginx /var/www/domain_name

Trong trường hợp không muốn NGINX có quyền ghi mà chỉ có quyền đọc:

sudo usermod -aG nginx user1

sudo chown -R user1:nginx /var/www/domain_name

Câu lệnh đầu tiên sẽ add user1 vào group nginx, câu lệnh thứ 2 sẽ cấp quyền ghi cho user1 tại thư mục mã nguồn đồng thời cho phép các user khác trong group nginx (bao gồm cả user nginx) có quyền đọc và execute tại đây.

Khởi động lại các service:

sudo service php-fpm restart

sudo service nginx restart

II. Chỉnh SELinux

Trong hầu hết các trường hợp chỉ cần chỉnh bước 1 là có thể chạy trang web bình thường rồi. Nhưng đối với những hệ thống có kích hoạt SELinux thì cần chỉnh thêm một chút.

Kiểm tra tình trạng SELinux:

sudo getenforce

Nếu kết quả là “Enforcing” có nghĩ là SELinux đang bật. Hãy thử tắt SELinux đi:

sudo setenforce Permissive

Khởi động lại NGINX và PHP-FPM service để xem kết quả!

Trong trường hợp vẫn muốn bật SELinux vì một lý do nào đó, hãy làm như sau để nói cho SELinux biết đâu là thư mục chứa mã nguồn trang web.

Bật lại SELinux:

sudo setenforce Enforcing

Đánh dấu thư mục chưa mã nguồn web:

sudo chcon -Rt httpd_sys_content_t /var/www/domain_name

Khởi động lại VPS và xem kết quả. Nếu vẫn bị lỗi 403 Forbidden thì gõ thêm lệnh sau:

sudo setsebool -P httpd_can_network_connect on

Những câu lệnh trên được thử trên CentOS 6.8, các hệ điều hành khác có thể khác biệt đôi chút.

Leave a Reply