Edited at

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


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