PHP
nginx
CentOS
Laravel
php-fpm

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 //設定ファイルの名前は好きなように(プロジェクト名にするのが無難かも)

設定ファイルは、デフォルトのままでは動きませんので、書き換えます。

自分の場合は、以下のような感じです。


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.

エラーや…と思い、エラーログを確認。


error.log

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からエラーが返ってきました。

こんな感じ↓

スクリーンショット 2019-02-27 0.00.20.png

エラー内容は以下です。

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でした

これで解決だ!!

と思いきやまた別のエラー。。。

こんな感じ↓

スクリーンショット 2019-02-27 0.07.16.png

エラー内容は以下

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でした

これで再度アクセス!

スクリーンショット 2019-02-27 0.13.16.png

やったぞ!!!アクセス成功!!!

お疲れました…。