nginxでlaravelを動かす際にいろいろ詰んだ話
環境
- macOS 10.12.6
- MacBook pro 2016
- VirtualBox 5.2.18
- CentOS 7.6-1810
- PHP 7.0.33
- Laravel Framework 5.5.45
- nginx 1.14.2
前提
nginx, PHP, PHP-FPM(設定済), composer をインストール済み
今回の手順
1.laravelプロジェクトの新規作成
2.nginxの設定ファイルを新規作成
3.nginxの再起動 ←ちょっと詰まった
4.ブラウザ確認 ←結構詰まった
laravelプロジェクトの新規作成
プロジェクトを作りたい場所で、コマンド一発叩きます。
自分は、/home/username/www/
の配下に作りました。
# cd ~/www/
# composer create-project --prefer-dist laravel/laravel projectname
nginxの設定ファイルを新規作成
nginxの設定ファイルは/etc/nginx/conf.d/
配下に作ります。
デフォルトでは、default.conf
がいるので、こいつをコピーして作りましょう。
# cd /etc/nginx/conf.d/
# cp default.conf laravel.conf //設定ファイルの名前は好きなように(プロジェクト名にするのが無難かも)
設定ファイルは、デフォルトのままでは動きませんので、書き換えます。
自分の場合は、以下のような感じです。
server {
listen 5000; //ポート番号はお好みで
server_name localhost;
root /home/username/www/projectname/public/; //先ほどlaravelプロジェクトを作成した場所に設定します。publicに関しては以下で説明
index index.php index.html index.htm;
#charset koi8-r;
access_log /var/log/nginx/projectname/access.log main; //アクセスログの出力先を指定
error_log /var/log/nginx/projectname/error.log warn;//エラーログの出力先を指定
location / {
try_files $uri $uri/ /index.php?$query_string;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/index.php; //ここの$document_rootは、ファイルの上の方で設定したrootが代入されています。
fastcgi_max_temp_file_size 0;
fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
コメントにも記載したが、root
で指定したものが$document_root
に代入される。
デフォルトでは、location ~ \.php$ {}
内にroot
が宣言されているが、ここでrootを宣言すると、上のroot
を上書きしてしまうみたいなので気を付けましょう。
このroot
を、/home/username/www/projectname/public/
としているが、laravelで設定したルーティングを使用するためには、projectname/public/index.php
を最初に見に行かせればいいので、このような設定になっている。
nginx用のログディレクトリ作成
今回は、ログの出力場所を/var/log/nginx/projectname/
配下にしたので、ディレクトリをしっかり作成しておく。
# cd /var/log/nginx/
# mkdir projectname
これでログの置き場所はできた。
ポート開放
あとは、ファイアーウォールの壁に変更したポートの穴を開けてあげなければ外部からのアクセスができないので、ポート開放をしてあげます。
# firewall-cmd --add-port=開けたいポート番号/tcp --zone=public --permanent
# firewall-cmd --reload //反映
nginxの再起動
まずは、普通に再起動。
# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
エラーや…と思い、エラーログを確認。
2019/02/24 13:24:50 [error] 4690#4690: *1 "/home/username/www/projectname/public/index.php" is forbidden (13: Permission denied), client: ***.***.***.***, server: localhost, request: "GET / HTTP/1.1", host: "host-name:5000"
パーミッション!?と思いsudo
で実行してもダメ。
詰んだ…と思ったけど、以下の手順で解決できました!
SELinuxというクセもの
SELinuxという標準の制御機能があるらしく、そいつの制御に引っかかって弾かれていたみたいです…(そんなの今回のこのエラーだけじゃわからんよ…)
SELinuxの状態は以下で確認できます。
# getenforce
enforcing
・enforcing SELinux有効でありアクセス制御が有効となる
・permissive アクセス制御は無効だが警告メッセージを表示する
・disabled SELinux無効
こちらより
なので、今回はSELinuxをpermissive
にしなくてはなりませんね。
変更のやり方はこうです
# setenforce 0 //permissiveに変更
# setenforce 1 //enforcingに変更
これで、無事にnginxの再起動ができました!(めでたしめでたし。。。ではなかった)
ブラウザ確認
あとは、ブラウザ確認だ!ということで、先ほど設定して開放もしたポートにアクセス。
すると、laravelにアクセスできてはいるものの、laravelからエラーが返ってきました。
こんな感じ↓
エラー内容は以下です。
The stream or file "/home/username/www/projectname/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied
こいつは、projectname/storage/logs/
を開けないため起きているみたいです。
laravelに最初にアクセスするとき、このprojectname/storage/logs/
配下にlaravel.log
というアプリケーションログファイルを新規で作成しようとするのですが、書き込み権限がないためにエラーが出ているみたいですね。
※ちなみに、最初のアクセス時だけこのエラーが出るので、一回このエラーを解消してしまえば、後にパーミッションを元に戻してもエラーは起こりません。
チャチャっとパーミッションの変更。
# cd storage/
# chmod 777 logs //元は775でした
これで解決だ!!
と思いきやまた別のエラー。。。
file_put_contents(/home/username/www/projectname/storage/framework/views/ddedc3f39a1683fbdb7b78fe94e93c581d280345.php): failed to open stream: Permission denied
同じく、projectname/storage/framework/views/
配下がいじれないぞと言われていますね。
同じようにパーミッション変更!
# cd storage/framework/
# chmod 777 views //元は775でした
やったぞ!!!アクセス成功!!!
お疲れました…。
Author And Source
この問題について(nginxでlaravelを動かす際にいろいろ詰んだ話), 我々は、より多くの情報をここで見つけました https://qiita.com/nooboolean/items/7deeb9bd9823a8b92e09著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .