Help us understand the problem. What is going on with this article?

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

概要

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;
}

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

mk-tool
舞浜のエンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした