min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

RasbperryPi3 に Laravel環境の構築(nginx→MariaDB→PHP-FPM→php8.0系インストール+nginxポートベースの名前解決)

ハピタス登録で1,000円分になるURL

 

Pi3でLaravelに触れる

これ

blog.capilano-fw.com

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への接続も試しておく。

よしよし。

 

MariaDBMySQL)のインストール

なんかよくわからんエラー(タイムアウト)が出たが、インストール自体はできてるっぽい。

 

権限の設定

必ず 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 composer-setup.php

$ 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に

接続させればいいわけだ。

ja.linux-console.net

 

ポート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のインストールそのものが失敗しているのか、判断つかんなぁ。

 

このへん参考にして対処。

egatech.net

 

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自体はうまくインストールされたのか?



 

 

 

 

その買うを、もっとハッピーに。|ハピタス