質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

5回答

3076閲覧

nginx で php を動かしたい

taro_nii_chan

総合スコア207

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

1グッド

0クリップ

投稿2017/07/13 13:54

編集2017/07/14 00:38

nginx 入門者です。
Laravel の勉強を始めていて、問題にぶつかったのでヘルプをお願いします。

症状

Laravelpublicディレクトリの中にある .php ファイルを実行させたいのですが、「〜 could not be found.」とエラーが出て表示できません。

環境

macOS Sierra バージョン10.12.5
Laravel 5.4

バージョン情報

zsh

1$ nginx -v 2nginx version: nginx/1.12.0 3 4$ php -v 5PHP 7.1.1 (cli) (built: Jan 23 2017 15:09:57) ( NTS ) 6Copyright (c) 1997-2017 The PHP Group 7Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies 8 9$ php-fpm -v 10PHP 5.6.30 (fpm-fcgi) (built: Feb 7 2017 16:19:01) 11Copyright (c) 1997-2016 The PHP Group 12Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies 13 14$ valet -v 15Laravel Valet 2.0.4

経過

元々ウェブサーバと言えば apache としか思ってなく、昨日初めてLaravelで動いてるのがnginxという別のウェブサーバなのかもしれないと思い始めた程度のビギナーです。
nginxphpを動かすためにはphp-fpmというものが必要だということも今日知りました。
設定ファイルを上手く設定すればいいのかなと思っているのですが、今の力で独力で解決するのに限界を感じ質問させていただいています。

設定ファイル

/usr/local/etc/nginx/.nginx.conf
が設定ファイルなのかも自信はないのですが、この中身は

conf

1user taro staff; 2worker_processes auto; 3 4events { 5 worker_connections 1024; 6} 7 8http { 9 include mime.types; 10 default_type application/octet-stream; 11 12 sendfile on; 13 keepalive_timeout 65; 14 client_max_body_size 128M; 15 16 gzip on; 17 gzip_comp_level 5; 18 gzip_min_length 256; 19 gzip_proxied any; 20 gzip_vary on; 21 22 gzip_types 23 application/atom+xml 24 application/javascript 25 application/json 26 application/rss+xml 27 application/vnd.ms-fontobject 28 application/x-font-ttf 29 application/x-web-app-manifest+json 30 application/xhtml+xml 31 application/xml 32 font/opentype 33 image/svg+xml 34 image/x-icon 35 text/css 36 text/plain 37 text/x-component; 38 39 include /Users/taro/.valet/Nginx/*; 40 include servers/*; 41 include valet/valet.conf; 42}

となっています。
Laravelをインストールしたままの状態なので、これをいじっていいのかもおっかなびっくりな状態です。
/Users/taro/.valet/Nginx/の中には1つだけファイル.keepがあり中身は空行が1行だけです。
/usr/local/etc/nginx/servers/にはファイルはなく、
/usr/local/etc/nginx/valet/の中には1つだけファイルvalet.confがあり、中身は

server { listen 80 default_server; root /; charset utf-8; location /41c270e4-5535-4daa-b23e-c269744c2f45/ { internal; alias /; try_files $uri $uri/; } location / { rewrite ^ /Users/taro/.composer/vendor/laravel/valet/server.php last; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log /Users/taro/.valet/Log/nginx-access.log; error_log /Users/taro/.valet/Log/nginx-error.log; error_page 404 /Users/taro/.composer/vendor/laravel/valet/server.php; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/Users/taro/.valet/valet.sock; fastcgi_index /Users/taro/.composer/vendor/laravel/valet/server.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /Users/taro/.composer/vendor/laravel/valet/server.php; } location ~ /\.ht { deny all; } }

です。

Laravelのトップディレクトリ(?)は~/development/laravelで、ここで

laravel new nginx_example

としてnginx_exampleアプリケーションを作成し、
http://nginx_example.dev
にアクセスすると、いつもの白地に天地中央寄せの小洒落たページが表示されます。

ここで、public
hello.html

html

1Hello, Laravel!

というファイルを作り、index.blade.php

php

1???(ここらで混乱&スタミナ切れしてきました)

としブラウザをリロードすると、
Hello, Laravel!
と表示され・・(るためにはどうしたらいいんでしょう?)

で、(ここからは推測なのですが)そのままで
hello.php

php

1<?php print("Hello, Nginx!"); ?>

というファイルを作ってindex.blade.php

php

1???(もう分かりません)

としてブラウザをリロードすると
「〜 could not be found.」
と表示され(るんじゃないかな?)

それを
Hello, Nginx!
と表示させるためにはどうしたらいいでしょう?

何だかグダグダな質問になってしまって申し訳ありません。
汲み取っていただいてお助けいただけたら幸いです。


2017.7.13(thu) 23:50 追記

ちょっと持ち直しました。
public以下のファイルを見たければ
index.blade.php
ではなく
web.php
を書き換えればいいのかなと。

という方針に変えて
web.php

php

1<?php 2Route::get('/', function () { 3 return File::get((public_path()) . '/hello.html'); 4});

に変えてみたところ、めでたく
Hello, Laravel!
と表示されました。

で、問題のphpですが、
web.php

php

1<?php 2Route::get('/', function () { 3 return File::get((public_path()) . '/hello.php'); 4});

変えてリロードしたところ何も表示されず、ソースを表示すると、
view-source:http://nginx_example.dev/

html

1<?php print("Hello, Nginx!"); ?>

と書かれていました。

このhello.phpが実行されるにはどうしたら良いでしょうか?
もう一度お知恵を拝借いたしたく、よろしくお願いします。


2017.7.14(fri) 9:38 追記

web.phpを書き換えました。

php

1Route::get('hello', function() { 2 require(public_path('hello.php')); 3});

を追加。
publicの直下にhello.phpというファイルを作り、中身を

php

1<?php 2print("Hello, Nginx!"); 3?>

としました。ブラウザをリロードするとめでたく
Hello, Nginx!
と表示させることが出来ました。

publicの中のphpファイルの実行はこれでOKだと思うのですが、
public/jsの中にjavascriptをはき出す.phpを作りたいというのがそもそものやりたい事だったのですが、勝手な解釈で問題を端折ってしまったことをお詫びいたします。


追加質問になってしまって申し訳ありません。
上記、
public/jsの中にjavascriptをはき出す.phpを作りたい」の件です。

web.php

php

1Route::get('test', function() { 2 require(public_path('test.html')); 3});

を追加しました。

public/js/alert.jsというファイルを

javascript

1alert("OK!");

と作り、public直下にtest.html

html

1<!DOCTYPE html> 2<html> 3<head> 4 <title></title> 5</head> 6<body> 7 <h1>test</h1> 8 <script src="./js/alert.js"></script> 9</body> 10</html>

を置いて
http://nginx_example.dev/test
にアクセスすると、
OK!
と意図通りアラートが出ました。

次に拡張子を変えてpublic/js/alert.phpというファイルを

javascript

1alert("Got it!");

と作り、test.html
<script src="./js/alert.js"></script>

<script src="./js/alert.php"></script>
と書き換えて同じく
http://nginx_example.dev/test
にアクセスすると、アラートは出てこず、ただtestと表示されるだけです。
何とかGot it!を表示させたいのですが方法はありますでしょうか?

ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

追加質問のjavascriptを吐き出すphpに関して、
Laravelのルータを間にかましてjsファイルを出力する意図として、
出力するJavascriptコードのContent-typeをJavascript用にするとうまくいくと思います。

サンプル

route.php

#htmlファイル Route::get('test', function () { return view("test"); }); #jsファイル Route::get('js/alert.js', function () { return response(File::get(public_path("js/alert.php"))) ->header('Content-Type', 'text/javascript'); });

public/js/alert.js

alert("Got it!");

resource/views/test.blade.php

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script type="text/javascript" src="{{ asset('js/alert.js') }}"></script> </head> <body> <p>html</p> </body> </html>

またLaravelを間にかませるのならば、bladeを使って、javascriptコードにLaravelから値を埋め込む事も簡単です。

サンプル

route.php

Route::get('js/alert_ex.js', function () { return response(view("js.alert",["message"=>"テストです"])->render()) ->header('Content-Type', 'text/javascript'); });

resource/views/js/alert.blade.php

alert("{{$message}}");

resource/views/test.blade.php

asset('js/alert.js')を asset('js/alert_ex.js')に変更

投稿2017/07/14 04:30

編集2017/07/14 04:32
aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_nii_chan

2017/07/14 06:47

素晴らしいです。完璧です。 実際に動いたのが感動的でした。 (ここまでずっと苦労して来てノイローゼ気味だったので。) 知らなかった ・response(File::get(〜略〜))->header('Content-Type', 'text/javascript'); ・〜.blade.php中の{{ asset('js/alert.js') }} ・view("js.alert",["message"=>"テストです"])->render() など、勉強材料もたくさんいただきました。 わがままな追加質問にも嫌な顔をされず対応していただけたことにも感謝しています。 ありがとうございました。 蛇足ですが、 alert.js、alert_ex.jsを拡張子を.phpに変えても、 web.phpのRoute::getを対応して書き換えれば同じように動くことも確認済みです。
aro10

2017/07/14 07:03

laravelを勉強する時は、こちらのIDEヘルパーをLaravelに導入した後に、 [laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper) ``` php artisan ide-helper:generate php artisan ide-helper:meta ``` を実行して、ide補完用のファイルを作成したあとにPHPStrom等で開発を行うと、 ファザードなどの定義ジャンプもできるようになるのでわかり易いと思います。
taro_nii_chan

2017/07/14 13:21

すみません、締め切った後で申し訳ないのですが、 ひとつ大前提を忘れていました。 alert.php (alert.js) は中身がPHPで書かれてることが前提でした。 なので、 public/js/alert.js はやはり public/js/alert.php であって欲しく、 中身も ```javascript alert("Got it!"); ``` ではなく、 ```php <?php print("alert('Got it!');"); ``` であって欲しいのです。 この形で php を実行させる(ここで言うとアラートを表示させる)にはどうしたらいいでしょうか?
guest

0

ちなみにpubllicフォルダのtest.phpを実行したい場合のサンプルです

Route::get('test', function () { require(public_path("test.php")); });

投稿2017/07/13 15:50

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_nii_chan

2017/07/14 00:30

ありがとうございます。 お陰でブラウザに「Hello, Nginx!」と表示することが出来ました。 詳しくは、質問への追記でお伝えします。 (markdown方式のほうが読みやすいと思ったので)
guest

0

既に存在するプログラムの利用などなんらかの事情で、public/js/alert.php内は、print出力をしなければならない場合のサンプルです。

route.php

Route::get('js/alert.php', function () { ob_start(); require(public_path("js/alert.php")); $jsCode = ob_get_contents(); ob_end_clean(); return response($jsCode) ->header('Content-Type', 'text/javascript'); });

resource/views/js/alert.php

<?php print("alert('Got it!');");

投稿2017/07/14 14:02

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_nii_chan

2017/07/14 14:22

重ね重ねありがとうございます。 お察しの通り、LaravelにmaxiGosという碁盤を表示するjavascriptツールを持ち込みたいという背景があります。 問題の切り分けのために部分化してるつもりでしたが難しいですね。 明日は都合がつかないのでそれ移行に実行できるかどうか試してみようと思います。
guest

0

コメントへの回答のサンプルです

すみません、締め切った後で申し訳ないのですが、
ひとつ大前提を忘れていました。

alert.php (alert.js) は中身がPHPで書かれてることが前提でした。
なので、
public/js/alert.js はやはり public/js/alert.php であって欲しく、
中身も

javascript

1alert("Got it!");

ではなく、

php

1<?php 2print("alert('Got it!');");

であって欲しいのです。

この形で php を実行させる(ここで言うとアラートを表示させる)にはどうしたらいいでしょうか?

route.php

Route::get('js/alert.php', function () { return response(require(public_path("js/alert.php"))) ->header('Content-Type', 'text/javascript'); });

resource/views/js/alert.php

<?php return <<<JS alert("Got it!"); JS;

投稿2017/07/14 13:48

編集2017/07/14 13:53
aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

WebサーバーのプリティURLの設定など開発環境構築はなかなか苦労する箇所のため、Macを利用との事で、Valetの利用は如何でしょうか?
すぐに開発確認できる環境を構築できます(nginxとローカルDNSサーバーの設定を自動でしてくれて、php-fpmもいりません)。
Laravel 5.4 Laravel Valet
Laravel Valetをつかってみた。

簡単な手順としては、

  1. インストールガイドに従ってHomebrewでphp71をインストール
  2. composer global require laravel/valet でvaletをインストール
  3. valet installコマンドで、valetの各所設定とnginxやDnsMasq等の関連ライブラリをインストールされる
  4. 既にあるLaravelプロジェクトでvalet linkコマンドを叩いてValetに登録する

(Valet linksで登録している一覧が見れます)
5. Laravelプロジェクトのディレクトリ名.devでブラウザのURLバーを叩くと、Laravelのルータ設定のrootが見れる
※エラーになる場合は既存のnginxを削除や、~/.valetを削除などを試してみてください

またはVagrantとVirtualBoxを利用するHomestedもMacの環境を汚さずにLaravelに適した開発環境を構築でき、プログラムに集中できます
Laravel 5.4 Laravel Homested

その後、route.phpの設定でLaravel管理外のphp外部ファイルをrequireする等の試行錯誤すればスムーズかと思います

投稿2017/07/13 15:44

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aro10

2017/07/13 15:57

記載内容の詳細を確認すると、Valetは既に利用しているみたいですね Valetでインストールすれば、Homebrewで入れたphp71だけでphp-fpmはいらず、特別な設定が必要でなければnginxの設定もいじらなくても良いかと思います。
taro_nii_chan

2017/07/14 00:42

こういう生の情報が、ググってるだけでは中々見つからず(あるいは信じられず)、とてもありがたいのです。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問