35
31

More than 5 years have passed since last update.

nginxでlaravelを動かす際にいろいろ詰んだ話

Last updated at Posted at 2019-02-26

環境

  • 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

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

35
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
31