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からエラーが返ってきました。
こんな感じ↓

エラー内容は以下です。

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

これで再度アクセス!

やったぞ!!!アクセス成功!!!
お疲れました…。