Làm cách nào để thiết lập quyền truy cập tệp cho Laravel?


234

Tôi đang sử dụng Máy chủ web Apache có chủ sở hữu được đặt _www:_www. Tôi không bao giờ biết cách thực hành tốt nhất với quyền truy cập tệp, ví dụ như khi tôi tạo dự án Laravel 5 mới.

Laravel 5 yêu cầu /storagethư mục có thể ghi. Tôi đã tìm thấy rất nhiều cách tiếp cận khác nhau để làm cho nó hoạt động và tôi thường kết thúc bằng việc làm cho nó 777chmod đệ quy. Tôi biết đó không phải là ý tưởng tốt nhất mặc dù.

Tài liệu chính thức nói:

Laravel có thể yêu cầu một số quyền được cấu hình: các thư mục bên trong storagevendoryêu cầu truy cập ghi bởi máy chủ web.

Điều đó có nghĩa là máy chủ web cũng cần truy cập vào storagevendorcác thư mục hay chỉ nội dung hiện tại của chúng?

Tôi cho rằng những gì tốt hơn nhiều, là thay đổi chủ sở hữu thay vì quyền. Tôi đã thay đổi tất cả các quyền của tệp của Laravel theo cách đệ quy _www:_wwwvà điều đó làm cho trang web hoạt động chính xác, như thể tôi đã thay đổi chmod thành 777. Vấn đề là bây giờ trình soạn thảo văn bản của tôi yêu cầu tôi nhập mật khẩu mỗi lần tôi muốn lưu bất kỳ tệp nào và điều tương tự xảy ra nếu tôi cố gắng thay đổi bất cứ điều gì trong Finder, ví dụ như sao chép một tệp.

Cách tiếp cận chính xác để giải quyết những vấn đề này là gì?

  1. Thay đổi chmod
  2. Thay đổi chủ sở hữu của các tệp để khớp với các tệp của máy chủ web và có thể đặt trình soạn thảo văn bản (và Finder?) Để bỏ qua yêu cầu mật khẩu hoặc sử dụng chúng sudo
  3. Thay đổi chủ sở hữu máy chủ web để phù hợp với người dùng os (Tôi không biết hậu quả)
  4. Thứ gì khác

4
Tôi nghĩ 777là quá nhiều tự do, bởi vì nó bao gồm tất cả các quyền cho tất cả mọi người.
Robo Robok

Từ các tài liệu của Laravel: Các thư mục trong storagevà các bootstrap/cachethư mục sẽ được ghi bởi máy chủ web của bạn
joshuamabina

1
sử dụng fcgi và bạn có thể 755/644 cho tất cả (bao gồm công khai / lưu trữ)
Jeffz

@jww đồng ý chúng ta có thể chuyển câu hỏi sang serverfault thay vì giữ nó không?
wp78de

Câu trả lời:


588

Chỉ cần nêu rõ ràng cho bất kỳ ai đang xem cuộc thảo luận này .... nếu bạn cung cấp cho bất kỳ quyền nào trong thư mục 777 của bạn, bạn đang cho phép BẤT CỨ AI đọc, viết và thực thi bất kỳ tệp nào trong thư mục đó .... điều này có nghĩa là gì bạn đã đưa ra MỌI NGƯỜI (bất kỳ tin tặc hoặc người độc hại nào trên toàn thế giới) cho phép tải lên BẤT K file tệp, vi rút hoặc bất kỳ tệp nào khác và THEN thực thi tệp đó ...

NẾU BẠN ĐANG THIẾT LẬP CÁC GIẤY PHÉP FILEER CỦA BẠN ĐẾN 777 BẠN ĐÃ MỞ MÁY CHỦ CỦA BẠN ĐẾN BẤT CỨ AI NÀO CÓ THỂ TÌM ĐƯỢC R DIRNG GIÁM ĐỐC. Rõ ràng đủ chưa ??? :)

Về cơ bản có hai cách để thiết lập quyền sở hữu và quyền của bạn. Hoặc bạn tự cho mình quyền sở hữu hoặc bạn biến máy chủ web thành chủ sở hữu của tất cả các tệp.

Máy chủ web là chủ sở hữu (cách mà hầu hết mọi người làm điều đó và cách của tài liệu Laravel):

giả sử dữ liệu www (nó có thể là một cái gì đó khác) là người dùng máy chủ web của bạn.

sudo chown -R www-data: www-data / path / to / your / laravel / root / thư mục

nếu bạn làm điều đó, máy chủ web sở hữu tất cả các tệp và cũng là nhóm và bạn sẽ gặp một số vấn đề khi tải tệp lên hoặc làm việc với tệp qua FTP, vì máy khách FTP của bạn sẽ được đăng nhập như bạn chứ không phải máy chủ web của bạn, vì vậy hãy thêm người dùng của bạn vào nhóm người dùng máy chủ web:

sudo usermod -a -G www-data ubfox

Tất nhiên, điều này giả định rằng máy chủ web của bạn đang chạy dưới dạng dữ liệu www (mặc định Homestead) và người dùng của bạn là Ubuntu (thật mơ hồ nếu bạn đang sử dụng Homestead).

Sau đó, bạn đặt tất cả các thư mục của mình thành 755 và các tệp của bạn thành 644 ... quyền truy cập tệp SET

sudo find / path / to / your / laravel / root / thư mục -type f -exec chmod 644 {} \;    

Quyền truy cập thư mục SET

sudo find / path / to / your / laravel / root / thư mục -type d -exec chmod 755 {} \;

Người dùng của bạn là chủ sở hữu

Tôi thích sở hữu tất cả các thư mục và tệp (nó giúp làm việc với mọi thứ dễ dàng hơn nhiều), vì vậy tôi làm:

sudo chown -R my-user: www-data / path / to / your / laravel / root / thư mục

Sau đó, tôi cung cấp cho cả bản thân và quyền của máy chủ web:

sudo find / path / to / your / laravel / root / thư mục -type f -exec chmod 664 {} \;    
sudo find / path / to / your / laravel / root / thư mục -type d -exec chmod 775 {} \;

Sau đó cung cấp cho máy chủ web quyền đọc và ghi vào bộ nhớ và bộ đệm

Dù bạn thiết lập theo cách nào thì bạn cũng cần cấp quyền đọc và ghi cho máy chủ web để lưu trữ, bộ đệm và bất kỳ thư mục nào khác mà máy chủ web cũng cần tải lên hoặc ghi (tùy thuộc vào tình huống của bạn), vì vậy hãy chạy các lệnh từ bashy ở trên:

sudo chgrp -R lưu trữ dữ liệu www bootstrap / cache
sudo chmod -R ug + rwx lưu trữ bootstrap / cache

Bây giờ, bạn an toàn và trang web của bạn hoạt động, VÀ bạn có thể làm việc với các tệp khá dễ dàng


4
Ví dụ tuyệt vời, nếu không có người dùng dữ liệu www, hãy sử dụng apache: apache thay cho dữ liệu www (trên một số bản phát hành)
Denis Solakovic

53
Tôi nghĩ mọi người hiểu sai quá nhiều về anyonekhái niệm này. anyoneCờ của Linux có nghĩa là bất kỳ người dùng nào , không phải bất kỳ người nào. Bạn vẫn cần truy cập máy chủ.
Marco Aurélio Deleu

3
@ andreshg112 Dữ liệu www đầu tiên là tên của người dùng và dữ liệu www thứ hai là tên của nhóm. Vì vậy, nó có nghĩa là chủ sở hữu là apache và (nhóm này) apache. Sử dụng dữ liệu www: dữ liệu www hoặc thêm người dùng của bạn vào nhóm đó. (CLI: useradd -G {tên nhóm} tên người dùng) và hơn bạn có thể truy cập tên người dùng: www-group
Denis Solakovic

2
@fs_tigre Tôi không nghĩ có nhiều sự khác biệt về bảo mật ... ngoại trừ tôi đoán rằng có hai người dùng đoán mật khẩu thay vì một, và dĩ nhiên tôi đăng nhập mọi lúc bằng tài khoản người dùng của mình, vì vậy nếu Tôi đã làm điều đó một cách không an toàn (ví dụ FTP thông thường và sử dụng mật khẩu) nó có thể xâm phạm trang web, nhưng tôi chỉ đăng nhập bằng Putty và SSH, và khi tôi sử dụng FTP thì đó là SFTP, vì vậy không có vấn đề gì cả. Các lệnh được đề xuất bởi bashy được khuyến nghị vì chúng thiết lập bit dính, vì vậy nếu máy chủ web của bạn tạo thư mục con, chúng sẽ có cùng chủ sở hữu / quyền như cha mẹ
bgies

3
Trong phương pháp đầu tiên, người dùng vẫn không thể tải lên các tệp vì bạn không cho writephép nhóm?
Fahmi

44

Các quyền cho storagevendorthư mục nên ở 775, vì lý do bảo mật rõ ràng.

Tuy nhiên, cả máy tính và máy chủ Apache của bạn đều cần có khả năng ghi vào các thư mục này. Ví dụ: khi bạn chạy các lệnh như php artisan, máy tính của bạn cần ghi vào tệp nhật ký storage.

Tất cả những gì bạn cần làm là trao quyền sở hữu các thư mục cho Apache:

sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage

Sau đó, bạn cần thêm máy tính của mình (được tham chiếu bởi nó username) vào nhóm mà máy chủ Apache thuộc về. Thích như vậy:

sudo usermod -a -G www-data userName

Chú ý: Thường xuyên nhất, groupNamewww-datanhưng trong trường hợp của bạn, thay thế nó bằng_www


10
+1 Tôi thích cách tiếp cận này. Nhưng tôi tin rằng các chownlệnh nên bao gồm cờ -R. Ngoài ra, trong laravel 5.1 và 5.2, thay vì thư mục nhà cung cấp, bạn nên cấp quyền truy cập vào thư mục bootstrap / cache.
Jason Wheeler

Có cách nào để kiểm tra nếu điều này sẽ làm việc tốt? Tôi có nghĩa là nếu tệp nhật ký mới được tạo trong thư mục lưu trữ / nhật ký sẽ có quyền chính xác làm thế nào tôi có thể kiểm tra điều đó?
Chaudhry Waqas

20

Chúng tôi đã gặp nhiều trường hợp cạnh khi thiết lập quyền cho các ứng dụng Laravel. Chúng tôi tạo một tài khoản người dùng ( deploy) riêng để sở hữu thư mục ứng dụng Laravel và thực thi các lệnh Laravel từ CLI và chạy máy chủ web bên dưới www-data. Một vấn đề nguyên nhân này là (các) tệp nhật ký có thể được sở hữu bởi www-datahoặc deploy, tùy thuộc vào người đã ghi vào tệp nhật ký trước, rõ ràng ngăn người dùng khác viết thư cho nó trong tương lai.

Tôi đã thấy rằng giải pháp an toàn và duy nhất là sử dụng các ACL của Linux. Mục tiêu của giải pháp này là:

  1. Để cho phép người dùng sở hữu / triển khai ứng dụng đọc và ghi quyền truy cập vào mã ứng dụng Laravel (chúng tôi sử dụng tên người dùng deploy).
  2. Để cho phép www-datangười dùng đọc quyền truy cập vào mã ứng dụng Laravel, nhưng không truy cập ghi.
  3. Để ngăn chặn bất kỳ người dùng nào khác truy cập vào mã / dữ liệu ứng dụng Laravel.
  4. Để cho phép cả www-datangười dùng và người dùng ứng dụng ( deploy) ghi quyền truy cập vào thư mục lưu trữ, bất kể người dùng nào sở hữu tệp (vì vậy cả hai deploywww-datacó thể ghi vào cùng một tệp nhật ký chẳng hạn).

Chúng tôi thực hiện điều này như sau:

  1. Tất cả các tệp trong application/thư mục được tạo với ô mặc định 0022, dẫn đến các thư mục có drwxr-xr-xquyền và tệp có -rw-r--r--.
  2. sudo chown -R deploy:deploy application/(hoặc đơn giản là triển khai ứng dụng của bạn với tư cách là deployngười dùng, đó là những gì chúng tôi làm).
  3. chgrp www-data application/để cung cấp cho www-datanhóm truy cập vào ứng dụng.
  4. chmod 750 application/để cho phép deployngười dùng đọc / ghi, www-datangười dùng chỉ đọc và xóa tất cả các quyền đối với bất kỳ người dùng nào khác.
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/để đặt quyền mặc định trên storage/thư mục và tất cả các thư mục con. Bất kỳ thư mục / tệp mới nào được tạo trong thư mục lưu trữ sẽ kế thừa các quyền này ( rwxcho cả hai www-datadeploy).
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ để đặt các quyền trên trên bất kỳ tệp / thư mục hiện có.

15

Thay đổi quyền cho thư mục dự án của bạn để cho phép đọc / ghi / thực thi cho bất kỳ người dùng nào trong nhóm sở hữu thư mục (trong trường hợp của bạn là _www):

chmod -R 775 /path/to/your/project

Sau đó thêm tên người dùng OS X của bạn vào _wwwnhóm để cho phép nó truy cập vào thư mục:

sudo dseditgroup -o edit -a yourusername -t user _www

Khi tôi dseditgroupcung cấp bởi bạn, tôi gặp lỗi : Username and password must be provided..
Robo Robok

Lỗi của tôi, bạn cần chạy lệnh đó với người dùng có quyền thích hợp, vì vậy chỉ cần thêm sudovào lúc bắt đầu.
Bogdan

Vậy tôi có cần thay đổi chủ sở hữu của những tập tin đó _www:_wwwhay myuser:_wwwkhông?
Robo Robok

Bạn có thể để nó _www:_www, bởi vì 775 có nghĩa là bất kỳ người dùng nào trong nhóm _wwwsẽ có toàn quyền đọc / ghi / xuất hiện trong thư mục đó và bạn chỉ cần thêm tên người dùng của mình vào nhóm đó.
Bogdan

Bạn có thể cho tôi biết một điều? Nó có nghĩa là chown myuser:_wwwgì? Tôi biết người đầu tiên là người dùng và người thứ hai là nhóm, nhưng nó có nghĩa là "người dùng này VÀ BẤT CỨ NGƯỜI NÀO TỪ nhóm này" hay "người dùng này NHƯNG CHỈ NẾU BẠN BẮT ĐẦU nhóm này"?
Robo Robok

8

Như đã đăng rồi

Tất cả những gì bạn cần làm là trao quyền sở hữu các thư mục cho Apache:

nhưng tôi đã thêm -R cho lệnh chown : sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage


3
Tại sao chúng ta phải cấp phép cho thư mục nhà cung cấp? Lưu trữ có ý nghĩa, để ghi vào tệp nhật ký, vv Nhưng nhà cung cấp? tại sao?
Ali Haris

Như đã viết ở trên trong một số nhận xét: "Tuy nhiên, cả máy tính và máy chủ Apache của bạn cần có khả năng ghi vào các thư mục này. Ví dụ: khi bạn chạy các lệnh như php artisan, máy tính của bạn cần ghi vào tệp nhật ký trong bộ lưu trữ."
Stanislav Potapenko

Lỗi trên mac: chown: www-data: tên nhóm bất hợp pháp
Sunil Kumar


7

Hầu hết các thư mục phải là "755" và tệp bình thường, "644"

Laravel yêu cầu một số thư mục có thể ghi được cho người dùng máy chủ web. Bạn có thể sử dụng lệnh này trên các hệ điều hành dựa trên unix.

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

7

Thêm vào composer.json

"scripts": {
    "post-install-cmd": [
      "chgrp -R www-data storage bootstrap/cache",
      "chmod -R ug+rwx storage bootstrap/cache"
    ]
}

Sau composer install


2
Đây là một câu trả lời xấu. Bạn sẽ không bao giờ cần sử dụng 777 cho bất kỳ thư mục nào nếu bạn đã cấu hình máy chủ web chính xác. Sử dụng 777 sẽ mở máy chủ của bạn cho bất kỳ hacker nào tải lên tệp và thực thi tệp đã nói nếu họ biết thư mục tồn tại ở đâu.
mbozwood

2
Được chứ. Bạn đang yêu cầu gì?
Davron Achilov

Và nếu vậy, nó sẽ đúng? chown -R $ USER: lưu trữ dữ liệu www, chown -R $ USER: bootstrap / cache dữ liệu www
Davron Achilov

Xem câu trả lời đúng, nó chứa tất cả các thông tin cần thiết mà bạn hoàn toàn có thể đưa vào bản cập nhật sau :)
mbozwood

6

Các tài liệu của Laravel 5.4 nói:

Sau khi cài đặt Laravel, bạn có thể cần phải định cấu hình một số quyền. Các thư mục trong storagevà các bootstrap/cachethư mục phải được ghi bởi máy chủ web của bạn hoặc Laravel sẽ không chạy. Nếu bạn đang sử dụng máy ảo Homestead, các quyền này đã được đặt.

Có rất nhiều câu trả lời trên trang này đề cập đến việc sử dụng 777quyền. Đừng làm vậy. Bạn sẽ tiếp xúc với tin tặc.

Thay vào đó, hãy làm theo đề xuất của người khác về cách đặt quyền 755 (hoặc hạn chế hơn). Bạn có thể cần phải tìm ra người dùng nào ứng dụng của bạn đang chạy bằng cách chạy whoamitrong thiết bị đầu cuối và sau đó thay đổi quyền sở hữu các thư mục nhất định bằng cách sử dụng chown -R.

Nếu bạn không có quyền sử dụng sudovì rất nhiều câu trả lời khác yêu cầu ...

Máy chủ của bạn có thể là một máy chủ được chia sẻ như Cloudways.

(Trong trường hợp của tôi, tôi đã sao chép ứng dụng Laravel của mình vào máy chủ Cloudways thứ hai của mình và nó hoàn toàn không hoạt động vì các quyền của thư mục storagebootstrap/cachethư mục đã bị rối.)

Tôi cần sử dụng:

Cloudways Platform > Server > Application Settings > Reset Permission

Sau đó tôi có thể chạy php artisan cache:cleartrong thiết bị đầu cuối.


4

Giải pháp được đăng bởi bgles là tại chỗ đối với tôi về mặt thiết lập quyền chính xác ban đầu (tôi sử dụng phương pháp thứ hai), nhưng nó vẫn có vấn đề tiềm ẩn đối với Laravel.

Theo mặc định, Apache sẽ tạo các tệp có 644 quyền. Vì vậy, đó là khá nhiều bất cứ điều gì trong lưu trữ /. Vì vậy, nếu bạn xóa nội dung lưu trữ / khung / khung nhìn, sau đó truy cập một trang thông qua Apache, bạn sẽ thấy chế độ xem được lưu trong bộ nhớ cache đã được tạo như sau:

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2

Nếu bạn chạy "nghệ nhân phục vụ" và truy cập một trang khác, bạn sẽ nhận được các quyền khác nhau vì CLI PHP hoạt động khác với Apache:

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e

Bản thân nó không phải là vấn đề lớn vì bạn sẽ không làm điều này trong sản xuất. Nhưng nếu Apache tạo một tệp mà sau đó người dùng cần phải viết, nó sẽ thất bại. Và điều này có thể áp dụng cho các tệp bộ đệm, chế độ xem và nhật ký được lưu trong bộ nhớ cache khi triển khai bằng người dùng và nghệ nhân đã đăng nhập. Một ví dụ dễ hiểu là "artisan cache: clear" sẽ không xóa bất kỳ tệp bộ đệm nào là www-data: www-data 644.

Điều này có thể được giảm thiểu một phần bằng cách chạy các lệnh thủ công dưới dạng dữ liệu www, vì vậy bạn sẽ thực hiện / viết kịch bản mọi thứ như:

sudo -u www-data php artisan cache:clear

Hoặc bạn sẽ tránh sự tẻ nhạt của điều này và thêm nó vào .bash_aliases của bạn:

alias art='sudo -u www-data php artisan'

Điều này là đủ tốt và không ảnh hưởng đến an ninh dưới bất kỳ hình thức nào. Nhưng trên các máy phát triển, việc chạy các kịch bản kiểm tra và vệ sinh khiến việc này trở nên khó sử dụng, trừ khi bạn muốn thiết lập bí danh để sử dụng 'sudo -u www-data' để chạy phpunit và mọi thứ khác mà bạn kiểm tra các bản dựng của mình có thể khiến các tệp được tạo.

Giải pháp là làm theo phần thứ hai của lời khuyên của bgles và thêm phần sau vào / etc / apache2 / envvars và khởi động lại (không tải lại) Apache:

umask 002

Điều này sẽ buộc Apache tạo các tệp theo 664 theo mặc định. Trong chính nó, điều này có thể gây ra rủi ro bảo mật. Tuy nhiên, trên các môi trường Laravel chủ yếu được thảo luận ở đây (Homestead, Vagrant, Ubuntu), máy chủ web chạy dưới dạng dữ liệu www của người dùng trong dữ liệu www của nhóm. Vì vậy, nếu bạn không tự ý cho phép người dùng tham gia nhóm dữ liệu www, sẽ không có rủi ro bổ sung. Nếu ai đó quản lý thoát ra khỏi máy chủ web, dù sao họ cũng có cấp truy cập dữ liệu www nên không có gì bị mất (mặc dù đó không phải là thái độ tốt nhất để liên quan đến bảo mật được thừa nhận). Vì vậy, về sản xuất, nó tương đối an toàn và trên một máy phát triển một người dùng, đó không phải là vấn đề.

Cuối cùng, khi người dùng của bạn thuộc nhóm dữ liệu www và tất cả các thư mục chứa các tệp này là g + s (tệp luôn được tạo trong nhóm của thư mục mẹ), mọi thứ được tạo bởi người dùng hoặc bởi dữ liệu www sẽ là r / w cho người khác.

Và đó là mục đích ở đây.

biên tập

Khi nghiên cứu cách tiếp cận ở trên để thiết lập quyền hơn nữa, nó vẫn có vẻ đủ tốt, nhưng một vài điều chỉnh có thể giúp:

Theo mặc định, thư mục là 775 và tệp là 664 và tất cả các tệp có chủ sở hữu và nhóm người dùng vừa cài đặt khung. Vì vậy, giả sử chúng ta bắt đầu từ thời điểm đó.

cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./

Điều đầu tiên chúng tôi làm là chặn quyền truy cập vào những người khác và biến nhóm thành dữ liệu www. Chỉ chủ sở hữu và các thành viên của dữ liệu www có thể truy cập vào thư mục.

sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache

Để cho phép máy chủ web tạo services.json và comp.php, như được đề xuất bởi hướng dẫn cài đặt chính thức của Laravel. Đặt bit dính nhóm có nghĩa là những thứ này sẽ được sở hữu bởi người tạo với một nhóm dữ liệu www.

find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage

Chúng tôi làm điều tương tự với thư mục lưu trữ để cho phép tạo bộ đệm, nhật ký, phiên và xem tệp. Chúng tôi sử dụng find để thiết lập rõ ràng các quyền thư mục khác nhau cho các thư mục và tệp. Chúng tôi không cần phải làm điều này trong bootstrap / cache vì không có (thường) bất kỳ thư mục con nào trong đó.

Bạn có thể cần phải áp dụng lại bất kỳ cờ thực thi nào và xóa nhà cung cấp / * và cài đặt lại các phụ thuộc của trình soạn thảo để tạo lại các liên kết cho phpunit et al, ví dụ:

chmod +x .git/hooks/*
rm vendor/*
composer install -o

Đó là nó. Ngoại trừ cái ô cho Apache đã giải thích ở trên, đây là tất cả những gì cần thiết mà không làm cho toàn bộ dự án có thể ghi được bằng dữ liệu www, đó là những gì xảy ra với các giải pháp khác. Vì vậy, nó an toàn hơn một chút theo cách này khi kẻ xâm nhập chạy dưới dạng dữ liệu www có quyền truy cập ghi hạn chế hơn.

kết thúc chỉnh sửa

Thay đổi cho Systemd

Điều này áp dụng cho việc sử dụng php-fpm, nhưng có lẽ những người khác cũng vậy.

Dịch vụ systemd tiêu chuẩn cần được ghi đè, ô được đặt trong tệp override.conf và dịch vụ được khởi động lại:

sudo systemctl edit php7.0-fpm.service
Use:
    [Service]
    UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service

3

Điều này làm việc cho tôi:

cd [..LARAVEL PROJECT ROOT]
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/

Những gì nó làm:

  • Thay đổi tất cả các quyền của tập tin thành 644
  • Thay đổi tất cả các quyền thư mục thành 755
  • Để lưu trữ và bộ đệm bootstrap (các thư mục đặc biệt được sử dụng bởi laravel để tạo và thực thi các tệp, không có sẵn từ bên ngoài), hãy đặt quyền cho 777, cho mọi thứ bên trong

Lưu ý: Có thể bạn không thể, hoặc không cần, để làm điều đó với tiền tố sudo. nó phụ thuộc vào quyền, nhóm của bạn, v.v ...


2

Tôi quyết định viết kịch bản của riêng mình để giảm bớt nỗi đau khi thiết lập các dự án.

Chạy phần bên trong gốc dự án của bạn:

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

Đợi cho bootstrapping hoàn thành và bạn tốt để đi.

Xem lại kịch bản trước khi sử dụng.


2

Tôi đã cài đặt laravel trên EC2 và đã dành 3 ngày để sửa lỗi cấp phép và cuối cùng đã sửa nó. Vì vậy, tôi muốn chia sẻ kinh nghiệm này với người khác.

  1. vấn đề người dùng Khi tôi đăng nhập vào ví dụ ec2, tên người dùng của tôi là người dùng ec2 và nhóm người dùng là người dùng ec2. Và trang web hoạt động theo người dùng httpd: apache: apache vì vậy chúng ta nên đặt quyền cho apache.

  2. thư mục và quyền cho phép A. cấu trúc thư mục trước tiên, bạn nên đảm bảo rằng bạn có cấu trúc thư mục như thế này trong bộ lưu trữ

    lưu trữ

    • khung
      • bộ nhớ cache
      • phiên
      • lượt xem
    • Nhật ký Cấu trúc thư mục có thể khác nhau tùy theo phiên bản laravel bạn sử dụng. phiên bản laravel của tôi là 5.2 và bạn có thể tìm thấy cấu trúc phù hợp theo phiên bản của bạn.

B. quyền Lúc đầu, tôi thấy các hướng dẫn để đặt 777 trong bộ lưu trữ để xóa file_put_contents: không thể mở lỗi luồng. Vì vậy, tôi thiết lập quyền 777 để lưu trữ chmod -R 777 lưu trữ Nhưng lỗi không được sửa. Ở đây, bạn nên xem xét một: người ghi tệp vào bộ lưu trữ / phiên và lượt xem. Đó không phải là người dùng ec2, mà là apache. Vâng, phải rồi. Người dùng "apache" ghi tệp (tệp phiên, tệp đã xem) vào thư mục phiên và xem. Vì vậy, bạn nên cung cấp cho apache để viết quyền cho các thư mục này. Theo mặc định: SELinux cho biết thư mục / var / www chỉ được đọc bởi deamon apache.

Vì vậy, để làm điều này, chúng ta có thể đặt selinux là 0: setenforce 0

Điều này có thể giải quyết vấn đề tạm thời, nhưng điều này làm cho mysql không hoạt động. Vì vậy, đây không phải là giải pháp tốt.

Bạn có thể đặt bối cảnh đọc-ghi vào thư mục lưu trữ với: (nhớ đặt setenforce 1 để kiểm tra)

chcon -Rt httpd_sys_content_rw_t storage/

Sau đó, vấn đề của bạn sẽ được khắc phục.

  1. và đừng quên bản cập nhật trình soạn thảo bộ đệm nghệ nhân php này: xóa

    Các lệnh này sẽ hữu ích sau hoặc trước.

    Tôi hy vọng bạn tiết kiệm thời gian của bạn. Chúc may mắn. Hacken


Bạn đã thử gọi một kịch bản dòng lệnh từ máy chủ Web? Tôi gặp sự cố vì nó không in bất kỳ đầu ra nào
Volatil3

0

Tôi đã có cấu hình sau:

  • NGINX (người dùng đang chạy nginx:)
  • PHP-FPM

Và áp dụng quyền chính xác như @bgies đề xuất trong câu trả lời được chấp nhận. Vấn đề trong trường hợp của tôi là nhóm và người dùng đang chạy được cấu hình của php-fpm ban đầu apache.

Nếu bạn đang sử dụng NGINX với php-fpm, bạn nên mở tệp cấu hình của php-fpm:

nano /etc/php-fpm.d/www.config

Và thay thế usergroupgiá trị của tùy chọn bằng một NGINX được định cấu hình để hoạt động; trong trường hợp của tôi, cả hai đều nginx:

... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...

Lưu nó và khởi động lại dịch vụ nginx và php-fpm.


0

Đối với các nhà phát triển Laravel, các vấn đề về thư mục có thể hơi đau một chút. Trong ứng dụng của mình, tôi đã tạo các thư mục một cách nhanh chóng và di chuyển các tệp đến thư mục này trong môi trường cục bộ của tôi thành công. Sau đó, trên máy chủ, tôi đã gặp lỗi trong khi di chuyển tệp đến thư mục mới được tạo.

Dưới đây là những điều mà tôi đã làm và có kết quả thành công vào cuối.

  1. sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
    sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
  2. chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
  3. Trong khi tạo thư mục mới một cách nhanh chóng, tôi đã sử dụng lệnh mkdir($save_path, 0755, true);

Sau khi thực hiện những thay đổi đó trên máy chủ sản xuất, tôi đã tạo thành công các thư mục mới và di chuyển tệp đến chúng.

Cuối cùng, nếu bạn sử dụng File facade trong Laravel, bạn có thể làm một cái gì đó như thế này: File::makeDirectory($save_path, 0755, true);


-1

Tôi tìm thấy một giải pháp thậm chí tốt hơn cho việc này. Nó gây ra bởi vì php đang chạy như một người dùng khác theo mặc định.

vì vậy để khắc phục điều này

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

sau đó chỉnh sửa user = "put user that owns the directories" group = "put user that owns the directories"

sau đó:

sudo systemctl reload php7.0-fpm


Nếu khách truy cập vào trang web quản lý thoát ra khỏi máy chủ web, giờ đây họ sẽ có quyền truy cập của "người dùng sở hữu các thư mục". Nếu người dùng đó là dữ liệu www, họ có thể bị thiệt hại giới hạn và đây là lý do tại sao apache chạy như một người dùng hạn chế. Nếu người dùng đó không quá giới hạn, họ có thể gây sát thương nhiều hơn. Nếu người dùng đó có quyền sudo, họ có thể gây ra nhiều thiệt hại hơn.
markdwhite

Đó là cùng một thỏa thuận với apache. BTW Bây giờ tôi chạy nignx như một cậu bé lớn
cecil merrel aka mang tên lửa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.