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.