LoginSignup
34
32

More than 3 years have passed since last update.

nginxでLaravelを動かす時に困った

Last updated at Posted at 2018-01-21

概要

nignxでLaravelを動かす時にLaravelでroutingした通りに動いてくれなくて困ったので、同じ思いをしている人へメモ。
私の環境ではnginxのdockerコンテナとphp-fpmのdockerコンテナを用意して、nginxコンテナからphp-fpmコンテナへリダイレクトする方式をとっていますが、なかなかLaravelで行なっているルーティングの通りに動かすことができませんでした。そもそもnginxの使い方もあまり知っていないため、設定値を変えまくって、考察して、これで動く!ということを今回の記事の成果物としています。ベストプラクティスを知っている方は教えてください。

実際にどんなことが起きたのか

・ちゃんとルーティングしているつもりなのにnginxから「file not found」が返される
・nginxから「file not found」は返されないものの真っ白な画面が出てくる
・「localhostで接続が拒否されました。」と言われて接続すらできない
と、いろいろ苦労しました。

nginxの設定値について

まず、たぶんこの記事を読んでいる人は以下の設定値がなんなのかわからなくて、どうすれば正しい設定になるのか、ということやLaravelのルーティングのされ方についてあまりわからなくて、ダメだぁ、となっているのではないかと思います。

default.conf
root /var/www/html;
~ いろいろと略 ~
location /hoge/ {
    fastcgi_split_path_info ^(.+\.php)(\.+)$;
    fastcgi_pass php_docker:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
}

こんな風な設定をおそらく書いているものと思いますので、まず$document_rootとか$fastcgi_script_nameに何が入っているのかを見てみます。
この変数の中身を確認するためには、nginxでadd_headerというやつをくっつけてあげて、curlで確認してあげれば、何が入っているかわかります。以下を参考にしてください。

default.conf
root  /var/www/html;
~ いろいろと略 ~
location /hoge/ {
    add_header my_string 'start'; # <- これを追加
    add_header my_document_root $document_root; # <- これを追加
    add_header fastcgi_script_name $fastcgi_script_name; # <- これを追加
    add_header my_fastcgi_path_info $fastcgi_path_info; # <- これを追加
    add_header my_string_2 ‘end’; # <- これを追加

    fastcgi_split_path_info ^(.+\.php)(\.+)$;
    fastcgi_pass php_docker:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
}

そしてcurlを実行します(ポートは8888ですが自分用に変えてください)。

curl --head http://localhost:8888/hoge
もしくは
curl -I http://localhost:8888/hoge

そうすると、 add_header に記載した値が出力されます。(変数が空の場合は出力されないみたいなのと、400系のエラーが出ている場合も変数は出力されないので注意)

~ いろいろと略 ~
my_string: start
my_document_root: /var/www/html
fastcgi_script_name: /hoge
my_string_2: end

こんな値が入っているので、default.confのSCRIPT_FILENAMEの設定値は以下のように展開されることがわかります。

default.conf
fastcgi_param SCRIPT_FILENAME /var/www/html/hoge;

Laravelは、public/index.php(artisanがある場所と同階層)がエントリポイントであるためnginxがをfastcgiとしてpublic/index.phpを実行するように指定します。

そのため、私はこうしました!

default.conf
fastcgi_param SCRIPT_FILENAME /var/www/html/hoge/public/index.php;

直接指定しました!w

これで、”一応”いきますw

ちなみに、$document_rootの値はrootコマンドで上書きすることができるので、以下みたいにしても動くと思います(やっていないけど)。

default.conf
root  /var/www/html;
~ いろいろと略 ~
location /hoge/ {
    root /var/www/html/[Laravelへのパス];
    add_header my_string 'start';
    add_header my_document_root $document_root;
    add_header fastcgi_script_name $fastcgi_script_name;
    add_header my_fastcgi_path_info $fastcgi_path_info;
    add_header my_string_2 ‘end’;

    fastcgi_split_path_info ^(.+\.php)(\.+)$;
    fastcgi_pass php_docker:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php; # ここを変更
    fastcgi_param PATH_INFO $fastcgi_path_info;
}

私からはこのくらいです。

34
32
1

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
34
32