質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

Q&A

2回答

6627閲覧

Laravel環境構築について 特定のディレクトリの権限を777にしないとエラーになる

bokupiroki

総合スコア54

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

0グッド

0クリップ

投稿2020/11/02 07:57

編集2020/11/05 12:29

前提・実現したいこと

Dockerを利用してローカルにlaravel開発環境を構築したいです。

権限関連らしきエラーが出てlaravelの初期画面を表示することができません。

一応該当ディレクトリの権限設定を777に変更すれば(「試したこと」で詳しく記述します)
laravel初期画面はちゃんと表示されるのですが、本来これでいいものなのかが初めてなのでわかりません。

環境構築時に参考にしているサイト
https://qiita.com/mukae_tech/items/89075e7caf7d6506e0b3

発生している問題・エラーメッセージ

ディレクトリの権限設定を触らずにhttp://localhost/にアクセスすると下記のようなエラーが表示されます。

UnexpectedValueException The stream or file "/var/www/app/storage/logs/laravel-2020-11-02.log" could not be opened in append mode: failed to open stream: Permission denied

###該当箇所のスクリーンショット
イメージ説明

試したこと

①権限関連のエラーのようなので、ディレクトリの権限を777に変更。
/var/www/app/storage配下を再帰的に権限777にすればlaravelの初期画面は出てくるようになりました。

ただ、本番環境などでも777でいいものなのかがわかりません。

参照サイト
https://error-search.com/error-post/detail/175/Laravel%25E3%2581%25A7%25E3%2582%25A8%25E3%2583%25A9%25E3%2583%25BC%25E3%2580%2580The%2Bstream%2Bor%2Bfile%2B%2522%252Fvar%252Fwww%252Fhtml%252Flaravel_pj%252Fstorage%252Flogs%252Flaravel-2018-04-06.log%2522%2Bcould%2Bnot%2Bbe%2Bopened%253A%2Bfailed%2Bto%2Bopen%2Bstream%253A%2BPermission%2Bdenied

②nginxに書き込み権限を与える

♯chown -R nginx:nginx app/storage chown: invalid user: 'nginx:nginx'

「そんなユーザーはいない」といわれてしまっているように見えます。

参照サイト
https://akamist.com/blog/archives/3272

###試したこと追記1
hentaimanさんの回答をもとに、プロセスからphp-fpmの実行ユーザーを確認しようとしました。
しかし、psコマンドを叩いてもプロセスの中にphp-fpmらしきものは見当たりませんでした。

root@17fc25ef4b3d:/var/www# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 33096 10596 pts/0 Ss+ 09:13 0:00 /usr/bin/python3 -u /sbin/my_init root 12 0.0 0.0 294292 6680 pts/0 S 09:13 0:00 /usr/sbin/syslog-ng --pidfile /var/run/syslog-ng.pid -F --no-caps root 21 0.0 0.0 4552 788 pts/0 S+ 09:13 0:00 /usr/bin/runsvdir -P /etc/service root 22 0.0 0.0 4400 832 ? Ss 09:13 0:00 runsv cron root 23 0.0 0.0 4400 736 ? Ss 09:13 0:00 runsv sshd root 24 0.0 0.0 31616 3196 ? S 09:13 0:00 /usr/sbin/cron -f root 690 0.0 0.0 25104 7172 pts/1 Ss 10:28 0:00 bash root 1209 0.0 0.0 4628 860 pts/2 Ss+ 10:51 0:00 /bin/sh root 1283 0.0 0.0 37668 3176 pts/1 R+ 11:03 0:00 ps aux

コマンドを選定するにあたって参考にしたサイト
https://qiita.com/shuntaro_tamura/items/4016868bda604baeac3c

###試したこと追記2
hentaimanさんの回答のコメントをもとに、
そもそも入るコンテナが間違っている可能性を考えました。

確かに「試したこと追記1」ではdocker-compose exec workspace bashと実行してworkspace というコンテナに入ってしまっていました・・・

docker psを実行してコンテナを一覧

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c3d1c8c4907 laradock_nginx "/docker-entrypoint.…" 7 days ago Up 7 hours 0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp laradock_nginx_1 2a916030c4e8 laradock_php-fpm "docker-php-entrypoi…" 7 days ago Up 7 hours 9000/tcp laradock_php-fpm_1 17fc25ef4b3d laradock_workspace "/sbin/my_init" 7 days ago Up 7 hours 0.0.0.0:3000-3001->3000-3001/tcp, 0.0.0.0:4200->4200/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8001->8000/tcp laradock_workspace_1 ad03d4acda49 laradock_phpmyadmin "/docker-entrypoint.…" 7 days ago Up 7 hours 0.0.0.0:8081->80/tcp laradock_phpmyadmin_1 284bd149d89f docker:19.03-dind "dockerd-entrypoint.…" 7 days ago Up 7 hours 2375-2376/tcp laradock_docker-in-docker_1 c75ba4374797 laradock_mysql "docker-entrypoint.s…" 7 days ago Up 7 hours 0.0.0.0:3306->3306/tcp, 33060/tcp laradock_mysql_1

docker-compose exec php-fpm bashを実行するとphp-fpm のコンテナに入れました。
その上でps auxを実行すると下記のような結果が返ってきました。

root@2a916030c4e8:/var/www# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 369128 34892 ? Ss 09:13 0:01 php-fpm: master process (/usr/local/etc/php-fpm.conf) www-data 6 0.0 0.1 371592 30068 ? S 09:13 0:00 php-fpm: pool www www-data 7 0.0 0.0 369128 10204 ? S 09:13 0:00 php-fpm: pool www root 8 0.0 0.0 2388 756 pts/0 Ss+ 16:17 0:00 /bin/sh root 14 0.0 0.0 4000 3200 pts/1 Ss 16:30 0:00 bash root 318 0.0 0.0 7640 2704 pts/1 R+ 16:36 0:00 ps aux

※このコンテナにはpsコマンドがインストールされていなかったので別途インストールしました。

これを見ると、www-dataのような気がします。

いったん「/var/www/app/storage」配下を再帰的に権限755にしたうえで、

#chown -R www-data:www-data app/storage

と実行したところ、コマンドは通ったのですがhttp://localhost/にアクセスするとはじめと同じエラーが出てしまいました。

775でも試しましたが同じでした。

###試したこと追記3
hentaimanさんの回答のコメントをもとに、
公式ドキュメント(http://laradock.io/getting-started/)を見ながら、
できるだけ公式に忠実にlaradockのインストールを行ってみました。

※もう1台パソコンがあるのでそちらのほうに新規で環境を作り直しています。
結論から言うと同じエラーが出ました。

長いですが、インストールの下りを記載します。

■laradockインストール
↓ドキュメント配下にLaravelAppというフォルダを作ってその中に移動

cd Documents mkdir LaravelApp cd LaravelApp

↓該当ディレクトリの中にいる状態でコマンド実行(公式より引用)

git clone https://github.com/laradock/laradock.git docker-compose up -d nginx mysql

■envの設定
サムプルファイルを.envという名前でコピー

cd laradock copy env-example .env

※↑公式はcp env-example .envというコマンドでしたが、Windowsのコマンドプロンプトから操作したので、copyコマンドに変えました。

.envをエディターで開き公式の説明に基づいて変更

APP_CODE_PATH_HOST=../ ↓ APP_CODE_PATH_HOST=../app

cp env-example .env
上部で、APP_CODE_PATH_HOST変数をプロジェクトパスに変更します。

APP_CODE_PATH_HOST=../project-z/
必ずproject-zプロジェクトフォルダ名に置き換えてください。

公式(https://laradock.io/getting-started/)日本語訳より引用

↑今回はプロジェクトフォルダ名をappとしました。

なので、この後
C:\Users\ユーザー名\Documents\LaravelAppの下に
appディレクトリを手動で作成しました。

■コンテナの立ち上げ?
laladockディレクトリ上でコマンド実行

docker-compose up -d nginx mysql (中略) Creating laradock_mysql_1 ... done Creating laradock_docker-in-docker_1 ... done Creating laradock_workspace_1 ... done Creating laradock_php-fpm_1 ... done Creating laradock_nginx_1 ... done) ↑成功?

■コンテナに入る

C:\Users\ユーザー名\Documents\LaravelApp\laradock>docker-compose exec workspace bash bash: $'\r': command not found bash: $'\r': command not found bash: /root/aliases.sh: line 119: syntax error near unexpected token `$'{\r'' 'ash: /root/aliases.sh: line 119: `function mkd() { root@eb68bc599f20:/var/www#

エラーが出つつもコンテナには入れました。

■.envのDB_HOST=の設定

4-データベースホストを使用するようにプロジェクト構成を更新します

PHPプロジェクトの.envファイルまたは読み取り元の構成ファイルを開き、データベースホストDB_HOSTをmysql次のように設定します。

DB_HOST=mysql

公式(https://laradock.io/getting-started/)日本語訳より引用

.envファイルの中身を見ましたが、DB_HOSTという設定箇所を見つけることはできませんでした。

そして、公式ドキュメントはここで終わっているように見えます。
これだけではhttp://localhotにアクセスしても404のエラーでした。

laravel自体のインストールがまだだったので、もともとお手本にしていた
https://qiita.com/mukae_tech/items/89075e7caf7d6506e0b3
を参考にlaravelのインストールを行いました。

■default.confの設定変更
C:\Users\ユーザー名\Documents\LaravelApp\laradock\nginx\sites\default.conf

conf

1root /var/www/public; 23root /var/www/app/public;

先ほどappディレクトリを手動で作成したのでこのように変更しました。

■phpmyadminのコンテナ立ち上げ(?)とlaravel自体のインストール
laradockにいる状態で

docker-compose up -d nginx mysql phpmyadmin docker-compose exec workspace bash composer create-project laravel/laravel app "6.0.*"

ここまで行ってからlocalhostにアクセスすると、

The stream or file "/var/www/storage/logs/laravel-2020-11-05.log" could not be opened in append mode: failed to open stream: Permission denied

質問時と同じのエラーでした。

補足情報(FW/ツールのバージョンなど)

Windows10 pro
Docker version 19.03.13
php7.4.11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

前置き

laradock使った事無く、今公式サイトを見た程度での回答なので参考程度に留めておいてください
laradock利用者からより優れた回答がついた場合はそちらを参考にしてください

何故エラーか

「そんなユーザーはいない」といわれてしまっているように見えます。

実際そんなユーザーはいないのでしょう。
公式には以下のように書かれており(グーグル翻訳)、

この例では、NGINX(Webサーバー)とMySQL(データベースエンジン)を実行してPHPWebスクリプトをホストする方法を示します。 docker-compose up -d nginx mysql 注:すべてのWebサーバーコンテナーnginx、apache.. etcはに依存しphp-fpmます。つまり、それらのいずれかを実行すると、php-fpmコンテナーが自動的に起動されるため、upコマンドで明示的に指定する必要はありません。そうする必要がある場合は、次のように実行する必要がありますdocker-compose up -d nginx php-fpm mysql。

nginxとlaravel(php-fpm)の動いているコンテナが別だと読み取れます。
※実際には質問者の使っているymlを確認してください
また、php-fpmの実行にはnginxは不要なので、laravelのコンテナにはnginxユーザーは作られていないと思われます。
よって

chown: invalid user: 'nginx:nginx'

のエラーが出たのでしょう。

対応方法

php-fpmの実行ユーザーはphp-fpm.conf(ファイル名、ファイルパスは環境により異なる)のuserで指定されているため、実際にディレクトリに対する権限が必要なユーザーはそこで設定されているユーザーになります。
コンテナに入り稼働中の全プロセスを表示して確認してください。

ただ、本番環境などでも777でいいものなのかがわかりません。

動作には問題無いが、不必要に権限が与えられている状態です。
実際に必要な権限は大雑把に言うと700という事になります。
恐らく既にディレクトリのオーナーはphp-fpmの実行ユーザーになっているので、権限をchmodで変えてやるだけで大丈夫ですが、実行ユーザーとディレクトリの所有者が異なる場合は所有者をphp-fpmの実行ユーザーに切り替えましょう
※冒頭に書いた通りlaradock触った事無いので自分で確認してください

権限をいい加減に済まさず疑問を持った事はセキュリティ的にとても良い事(仕事でやるなら当然だが)です。複数のユーザーが権限を持つ必要が出たら適切に権限を与えて行けばいいでしょう。

投稿2020/11/02 16:34

hentaiman

総合スコア6415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bokupiroki

2020/11/04 13:34 編集

ありがとうございます。 php-fpm.confというファイルを探して、 そこに記載されているユーザーを調べればよいということですね。 php本体はCドライブ直下においているので、 C:\php配下の階どこかにphp-fpm.confがないか検索してみましたが見つけられませんでした。 また、LaravelApp(laladockディレクトリとappディレクトリがある場所の1つ上のディレクトリ) でも検索してみましたが、見つけられませんでした。 「コンテナに入り稼働中の全プロセスを表示して確認してください。」 ↓ 実行中のプロセスからのユーザー確認も試みましたが、わかりませんでした。 確認方法と結果については、質問欄の「試したこと追記」 に記載致しました。
hentaiman

2020/11/04 15:59

公式がphp-fpmを稼働していると書いているので、プロセスが見当たらない訳がないのですが・・・確認するコンテナは合ってますか? dockerpsで入るコンテナ確認しましたか? nginxをwebサーバーとして使っている場合、php-fpmが稼働していなかったらlaravelが動作する訳ないのでプロセスが見当たらないはずがないです。再度確認し直してみてください。
bokupiroki

2020/11/04 17:12

入るコンテナを間違っていたようです。 申し訳ありません。 docker psを実行してコンテナを確認したうえでの結果を 質問欄の「試したこと追記2」に記載しました。 ご覧いただけると幸いです。
hentaiman

2020/11/05 04:33

php-fpmとlaravelのワークスペースが別とは知らなかった失礼しました。 で、確認しようと思って公式のlaradock落として手順通り設定してみたんですが、質問者さんの環境とは違って777でworkspaceが出来上がりました。 質問の回答とは逸れますが、まだ開発進めてないのなら公式見ながら入れ直してみたらどうでしょう?それでもダメなら(手動で権限設定しないと動かない)なら用意したdockerの操作手順を教えてください。 真似してみて権限の状態などが再現出来たら確認ようと思います。
bokupiroki

2020/11/05 12:30

何度もありがとございます。 もう1台別のPCを用意して、そちらに環境を作り直してみました。 結果や過程を質問欄に追記したので、ご覧いただきたいです。
guest

0

https://readouble.com/laravel/8.x/ja/installation.html

Laravelをインストールした後に、多少のパーミッションの設定が必要です。storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能にしてください。設定しないとLaravelは正しく実行されません。Homestead仮想マシンを使用する場合は、あらかじめ設定されています。

投稿2020/11/02 09:30

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bokupiroki

2020/11/02 10:08

ありがとうございます。 Webサーバからの書き込み可能にするために、 # cd app # chown -R nginx:nginx storage と実行してみたものの、 chown: invalid user: 'nginx:nginx' とエラーが返ってきます。 (試したこと>「②nginxに書き込み権限を与える」と同じ内容です) そもそものコマンドが間違っているのでしょうか。
kyoya0819

2020/11/02 10:20

chownコマンドは「所有者・グループ」を変更するコマンドです。 今回は「アクセス権」を変更する必要があります。このコマンドはchmodコマンドです。 $ chmod -R 775 storage などでできます。(775などは権限を表す
bokupiroki

2020/11/02 10:36

chmod -R 775 storage を実行してからhttp://localhost/にアクセスすると、 「発生している問題・エラーメッセージ」に記載した内容が表示されます。 (The stream or file "/var/www/app/storage/logs/laravel-2020-11-02.log" ~~~) chmod -R 777 storageにすると解消してlaravel初期画面を表示できるのですが、 「それで本当に根本解決になっているのか」 というのが今回の質問の意図です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問