0

Nỗi ám ảnh "Permission Denied": Giải phẫu cặp lệnh chown và chmod cứu rỗi dự án Laravel

Chào anh em!

Nếu anh em đã từng tự tay deploy một dự án Laravel lên một con server Linux (như Ubuntu) chạy Nginx hoặc Apache, chắc chắn 99,99% anh em đã từng đối mặt với màn hình báo lỗi huyền thoại với dòng chữ đỏ rực: "The stream or file /var/www/html/storage/logs/laravel.log could not be opened: failed to open stream: Permission denied".

Ứng dụng chạy trên Local thì mượt mà, nhưng cứ lên Server là sập chỉ vì cái file log. Và phản xạ tự nhiên của chúng ta là lên StackOverflow copy ngay 2 dòng lệnh thần thánh này thả vào Terminal:

sudo chown -R www-data:www-data /var/www/html/storage/logs
sudo chmod -R 775 /var/www/html/storage/logs

Bùm! Website hoạt động trở lại. Nhưng bao nhiêu người thực sự hiểu 2 dòng lệnh này đang làm gì, hay chỉ đơn thuần là copy/paste như một thói quen? Hôm nay, hãy cùng mổ xẻ chúng tận gốc rễ nhé.

1. chown - Đổi chủ hộ khẩu (Change Owner)

Dòng lệnh đầu tiên: sudo chown -R www-data:www-data /var/www/html/storage/logs dùng để thay đổi "chủ sở hữu" của thư mục.

  • sudo (Superuser Do): Vì bạn đang can thiệp vào quyền hạn của hệ thống, bạn cần mượn quyền của tài khoản Admin cao nhất (root) để thực thi.
  • chown (Change Owner): Lệnh thay đổi quyền sở hữu.
  • -R (Recursive): Chữ R viết hoa này cực kỳ quan trọng. Nó báo cho hệ thống biết: "Hãy đổi quyền sở hữu của thư mục logs và áp dụng luôn cho TẤT CẢ các file, các thư mục con nằm sâu bên trong nó". Nếu không có -R, chỉ cái vỏ thư mục đổi chủ, còn file laravel.log bên trong vẫn giữ nguyên chủ cũ.
  • www-data:www-data: Đây là cặp User:Group (Người dùng : Nhóm người dùng). Trong các hệ điều hành họ Debian/Ubuntu, www-data là tài khoản mặc định mà web server (như Nginx hay Apache) sử dụng để chạy. Dòng này có nghĩa là: Bàn giao toàn quyền sở hữu thư mục này cho anh chạy Web Server.

Tại sao phải làm vậy? Khi bạn dùng user cá nhân (ví dụ: ubuntu) để git pull code về, người tạo ra thư mục đó mặc định là ubuntu. Nhưng khi người dùng truy cập web, Nginx (dưới nhân dạng www-data) cố gắng viết lỗi vào file log. Một người lạ (www-data) cố gắng viết vào nhà của người khác (ubuntu) sẽ bị hệ điều hành Linux chặn lại ngay lập tức (Permission Denied). Bạn phải sang tên đổi chủ cho nó!

2. chmod - Cấp "thẻ từ" vào cửa (Change Mode)

Dòng lệnh thứ hai: sudo chmod -R 775 /var/www/html/storage/logs dùng để cấu hình chi tiết xem ai được phép làm gì.

  • chmod: Lệnh thay đổi phân quyền đọc/ghi/thực thi.
  • 775: Đây là sức mạnh cốt lõi của lệnh. Trong Linux, quyền được chia làm 3 nhóm đối tượng: Owner (Chủ sở hữu), Group (Nhóm của chủ), và Others (Những kẻ không liên quan). Mỗi con số đại diện cho một nhóm.

Quyền được mã hóa bằng số: 4 = Read (Đọc), 2 = Write (Ghi/Sửa), 1 = Execute (Thực thi).

  • Số 7 đầu tiên (Owner): 4 + 2 + 1 = 7. Chủ sở hữu (www-data) có toàn quyền Đọc, Ghi, Thực thi.
  • Số 7 thứ hai (Group): 4 + 2 + 1 = 7. Những ai nằm trong nhóm www-data cũng có toàn quyền.
  • Số 5 cuối cùng (Others): 4 + 1 = 5. Người ngoài chỉ được Đọc và Thực thi, tuyệt đối cấm Ghi (sửa xóa) file log.

Tại sao lại là 775 mà không phải là 777? Rất nhiều bài hướng dẫn xúi dại anh em chạy lệnh chmod -R 777. Chạy 777 (cấp toàn quyền cho tất cả mọi người) là một hành động tự sát về mặt bảo mật. Bất kỳ ai, kể cả một con bot hay hacker chiếm quyền một user ất ơ nào đó trên server, cũng có thể xóa hoặc cài mã độc vào thư mục của bạn. Dùng 775 là một sự thỏa hiệp an toàn và chuyên nghiệp hơn rất nhiều.

3. Vấn đề thực tiễn: Tại sao cần kết hợp cả hai?

Ở môi trường Production, không chỉ có mỗi Nginx ghi log. Khi bạn chạy các lệnh Artisan thủ công (ví dụ: php artisan schedule:run hoặc chạy Queue), bạn thường chạy bằng user cá nhân (như ubuntu).

Nếu bạn chỉ set owner là www-data mà để quyền là 755 (Group không có quyền ghi), thì khi bạn gõ lệnh artisan sinh ra log, bạn sẽ bị văng lỗi vì user của bạn không phải là www-data.

Bằng cách thiết lập quyền 775, đồng thời add user của bạn vào nhóm www-data (bằng lệnh sudo usermod -aG www-data ubuntu), bạn đã tạo ra một hệ sinh thái hòa bình: Cả Nginx (dưới tư cách Owner) và Bạn (dưới tư cách Group) đều có quyền ghi vào file laravel.log mà không bị hệ điều hành "gõ đầu".

Lời kết

Quản trị phân quyền (Permission) trong Linux luôn là một bộ môn nghệ thuật đòi hỏi sự cân bằng giữa Tính khả dụng (Website chạy được) và Tính bảo mật (Không mở toang cửa cho Hacker). Hiểu thấu đáo bản chất của chownchmod sẽ giúp anh em tự tin hơn rất nhiều khi làm việc với các hệ thống máy chủ, không còn phải nhắm mắt copy code và cầu nguyện nữa!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí