ハピタス登録で1,000円分になるURL
Pi3でLaravelに触れる
これ
RaspberryPi3 に Laravel入れてphpのフレームワーク触ってみたい
まずはnginxインストール
$ sudo apt-get -y install nginx
nginxへの接続テスト
Pi3(wireguard VPN の向こういてIPアドレス10.100.0.10)への接続は 中継機であるPi4からsshのポート転送でできるようにしてあるので
手元のmacOSから中継用Pi4にssh接続した状態でmacOSブラウザからhttp://localhost:4006 すれば、http://10.100.0.10:80 に転送される。
よし。
一応中継用Pi4にVNCしてそのブラウザから今回のPi3のnginxへの接続も試しておく。
よしよし。
MariaDB(MySQL)のインストール
なんかよくわからんエラー(タイムアウト)が出たが、インストール自体はできてるっぽい。
権限の設定
必ず sudo -s して操作する。
$ sudo -s
# mariadb
# grant all privileges on *.* to root@'localhost' identified by 'password';
最後の commit; は不要かもしれんけど一応。
PHP-FPM をインストール
php7.0系でインストールされちゃうけどLaravelの最新と互換性難ありらしいのでphp8.0系にUpdateする。
php8.0系にupdateする手順
$ sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
$ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
$ sudo apt update
$ sudo apt install php8.0-common php8.0-cli php8.0-fpm
インストール完了。
phpのバージョン確認
$ php -v
なんかうまくいってるっぽいぞ。
Laravelに必要なPHPモジュールをインストール
$ sudo apt install php8.0-bcmath php8.0-mbstring php8.0-xml php8.0-mysql
末尾のNOTICEだと「PHP 8.0 FPMはデフォルトでは有効になっていないので、Apacheで使う場合は a2enmod proxy_fcgi setenvifとかインストールせよ」みたいなこと書いてるけど今回はnginx使うから関係ないと思われる(Apacheも一応インストールしてるんだが…ま、あとで考えよう)。
nginx の設定ファイルを変更
$ sudo -s
# sudo vim /etc/nginx/sites-available/default
末尾に追記。
コピペ用
# laravel-dev.test
server {
listen 80;
server_name laravel-dev.test;
root /var/www/html/laravel-dev/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
# sudo systemctl restart nginx.service
エラーだな。serverの記述が被ってるからな気がする。
一応ジャーナル見てみるか。
# journalctl -xe
ぜんぜん原因わからん。ほんとjournalctlとかsystemctlとか使えん。昔の仕組みのほうがずっと良かった。
もっかいnginxの設定見直す。
$ sudo -s
# sudo vim /etc/nginx/sites-available/default
93行目をコメントアウトするの忘れてた。これがエラーの原因だった。
nginxを再起動。
# sudo systemctl restart nginx.service
よし。
Pi3の/etc/hosts に追記
これなぁ。うちでも設定いるのかな。
いま設定してるうちのPi3は遠隔地にあって、そこにsshで設定を入れにかかってる状況だから、つまりは外部からPi3にアクセスするわけだけど、そのときにPi3の/etc/hostsに(Pi3に通信を向けるための)/etc/hostsの設定が要るのかは微妙。ま、入れとくか。
$ sudo vim /etc/hosts
再びnginx接続テスト
composerインストール前にnginxへの接続を再度試しておく。
よし。
composer入れる
この記述のままに進める。
ホームディレクトリで作業しろ、とあるから今回はDesktopで作業するか。
$ cd /home/pi/Desktop/
$ pwd
本家サイトにあるこの4行のコマンドそのまま打てばいいらしいな。
Composer本家サイトの4つのコマンド
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php -r "unlink('composer-setup.php');"
PATHを通す
というか/usr/binにリネームしつつ移動する。composer.pharというのが実行バイナリで、こいつを/usr/bin/に入れてやればいいらしい。
$ sudo mv composer.phar /usr/bin/composer
どれ、動くかな?
$ composer
よし。
npmとnodejs(バージョン12)が必要らしい
まじか。すでにnodejs入れちゃってるぞ。確か録画予約ソフト(Chinachu)の動作に必須だったはずだが…
入ってるか確かめてみる。
$ node -v
$ npm -v
あれ?入ってない?気のせいか。
$ curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
エラーが出てるのは違うアプリ(speedtest-cli)のだから無視して進める。
$ sudo apt install nodejs
うまくいったっぽいぞ。バージョンを確認する。
$ node -v
$ npm -v
あれ、npm入ってないや。知らん。後回しにする。
GUIツールphpMyAdmin代替(adminer)をインストール
直接インストールが必要らしい。
$ sudo mkdir /usr/share/adminer
$ sudo wget "http://www.adminer.org/latest.php" -O /usr/share/adminer/latest.php
$ sudo ln -s /usr/share/adminer/latest.php /usr/share/adminer/adminer.php
ショートカットを切ったっぽい。
nginxの設定にadminerを追加
$ sudo vim /etc/nginx/sites-available/default
コピペ用
# Adminer
server {
listen 80;
server_name adminer.test;
root /usr/share/adminer;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
$ sudo systemctl restart nginx
またもPi3の/etc/hostsに追記
要るんかいなこれ。ま、入れとくか。
$ sudo vim /etc/hosts
9行目追記した。
ブラウザからadminerへ接続してみる
手元のmacOSから接続。
エラー。やっぱそうよな。Pi3の/etc/hostsは自分の中での名前解決だけしかしないんだから。
Pi3にVNCして自分のブラウザ(Chromium)で試してみると…
しっかりadminerが起動している。それにしてもPi3でChromium動かすだけでほぼ固まる。昨今のブラウザどんだけ重いんだ…load average 8.81とかだし…(Mirakurunも動かしてるからか?)
これに外部(Pi3じゃない端末)から接続するためには名前解決方法をサーバ名ベースじゃなくてポートベースにすれば良さそう。
nginxの名前解決をポートベースで行う
現在のnginx設定はこう。
$ sudo cat /etc/nginx/sites-available/default | grep -B 3 server_name;
LaravelもAdminerもどちらもlistenポート80を使って、アクセスするときの名前server_nameによってどちらに接続するかを振り分けている(サーバ名ベースの名前解決)。
これをポートベースの名前解決にすればいい。つまり
ポート8090にアクセスされたらLaravelに
ポート8091にアクセスされたらAdminerに
接続させればいいわけだ。
ポート8090で接続されたらLaravelに導く
たぶんこれでいけるだろう。
$ sudo vim /etc/nginx/sites-available/default
93行目(コメントどおり)Laravelのサーバ設定で
95行目を listen 8090 に変更する。
96行目はコメントアウトしてみた。
ポート8091で接続されたらAdminerに導く
同様にadminerのserver設定のほうも変更。
126行目(コメントどおり)Adminerのサーバ設定で
128行目を listen 8091 に変更する。
129行目はコメントアウトしてみた。
nginxを再起動して設定を反映する。
$ sudo systemctl restart nginx
Adminerに接続
Pi3のブラウザから http://localhost:8091/adminer.php
よし。
中継用Pi4 のブラウザから http://pi3のIPアドレス:8091/adminer.php
こちらもよし。
手元のmacOSでも試す。中継機Pi4(192.168.3.190)によるsshポート転送でPi3に繋がっている。
$ alias | grep mysshL
$ mysshLL
127.0.0.1:4008:10.100.0.10:8091 なので
手元のmacOSのブラウザから http://pi3に転送されるlocalhostのポート/adminer.php
よっしゃああ!
これでPi3のadminer.phpに手元macOSのブラウザから接続できるようになった。
Adminerへのログイン
記事に戻って設定を進める。さっき設定したユーザ名とパスワードでadminer.phpにログインする。
ユーザ名:root パスワード:password
データベースを作成
laravel-dev
utf8mb4_unicode_ci
うまくいったようだ。
Laravelをインストール
$ cd /home/pi/Desktop
$ (sudoは付けずに)mkdir php-dev
$ cd php-dev
$ composer create-project laravel/laravel laravel-dev
うまくインストールされたのか?されたんだろう。
Laravelをインストールしたフォルダの権限設定
$ cd /home/pi/Desktop/php-dev/laravel-dev/
$ sudo chmod 777 storage/ -R
$ sudo chmod 777 bootstrap/cache/ -R
LaravelへのPATHを通す
$ cd /var/www/
$ sudo mv html/ html_original
$ sudo ln -s /home/pi/Desktop/php-dev html
Laravelへのアクセス
Pi3のブラウザから http://localhost:8090/
エラー…だと…?
htmlというショートカットの所有者がrootになってるのが原因じゃないかなーと想像。通常権限のpiでショートカットを作り直してみよう。
$ sudo unlink html
$(sudoを付けずに)ln -s /home/pi/Desktop/php-dev html
ダメかいな…
そもそもHTTP ERROR 500ってなんだっけ。
フォルダのパーミッションが原因なのか、composerによるLaravelのインストールそのものが失敗しているのか、判断つかんなぁ。
このへん参考にして対処。
Laravelのログを見る
これを試す。
$ ls /home/pi/Desktop/laravel-dev/storage/logs/
エラーログファイルらしきものが見当たらない。storageフォルダに書き込み権限がなくてログを吐けていない?かと疑ったが、storageにはchmod 777 -R 済みだからそれはなかろう。
vendorディレクトリがない
これが原因じゃないかなーって感じがしてる。
たしかにvendorなんてフォルダはできてないもんな。
$ ls | grep vendor
Laravelをインストールしたフォルダにcdしてから composer install すればいいっぽい。
$ cd /home/pi/Desktop/laravel-dev/
$ composer install
なーんかcomposerの動きがおかしくてちゃんと更新できてない(必要なライブラリをインストールできてない)気がする。
いや本当はこんな感じで -Installing ... が続くはず。
うまくいってないな。
エラーメッセージにある「Alternatively,...」の指示に従ってみるか。
$ composer install --ignore-platform-req=ext-curl
これは…うまくいっている予感。
さっきのエラーはphpバイナリが呼び出す版のcurlがうまく入ってなくてダウンロードがうまくいってないからか。そんなcurlはあとで入れるとして先に(curl無視オプションを発動して)インストールだけ進めるのがスジだろうに。ポライトすぎるのよLaravelさん。
こりゃまだしばらくかかるな。
ちょっと早いけど昼飯作って腹ごしらえするか。
Laravelインストール完了
お。エラーメッセージが変わった。こんどはAPP KEYが無いときてる。
てことはLaravel自体はうまくインストールされたのか?