ラズパイ 4 に Laravel の実行環境を作る
ラズパイ 4 で Laravel を動かしたい
機会があったので備忘録として。
モニタなし SSH で ラズパイ 4 に "Raspberry Pi OS Lite" をインストールするところから始めます。
Nginx + PHP-fpm + MariaDB の構成です。
1. Raspberry Pi Imager で OS をインストール
https://www.raspberrypi.com/software/ から Raspberry Pi Imager をダウンロード & インストール。Mac ユーザなので macOS 版を入れる。
前は Etcher でやってたけど、最近の主流はこっちなのかしら。
起動して、
Operationg System: Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit)
Storage: SDカードを選択(あ、SDカード入れておく)
右下の歯車アイコンはなんだ?(クリック)
→ "Would you like to prefill the wifi password from the system keychain?" と聞かれた。こっちの Mac の Wifi 接続設定をもっていってくれるのね。お願いしますわ → YES
→ 管理者のユーザ名とパスワードを入れて "許可"
→ Advanced options の設定画面に。あらかじめいろいろ設定できるのね。
今回はホスト名、pi ユーザのパスワードの指定をあらかじめもらってあるので、
- Image customization options: "to always use"
- ✓ Set hostname: XXX (指定名).local
- ✓ Enable SSH
- ● Use password authentication
- ✓ Set username and password
- Username: pi (default)
- Password: XXX (指定パスワード)
- ✓ Configure wifi (ここの内容は先程の keychain から入力済み)
- Wifi country: JP (よくわかんないけど、ここは日本だから)
- ✓ Set locale settings
- Timezone: Asia/Tokyo
- Keyboard layout: jp
- □ Skip first-run wizard (スキップしたいけど、言語設定を追加できないんじゃないかと思うのでチェックなしで)
→ 他の項目はそのままで "SAVE"
→ "WRITE" !!
→ (SD カードの内容を全消去しますよ。大丈夫ですか?なメッセージ) → YES
→ (変更を加えますよ) 管理者のパスワードを入れて → OK
→ (...しばし書込待ち)
→ "Write Successful"
→ (SD カードを取り出します) → CONTINUE
2. ラズパイ起動
SD カードをラズパイにセットして電源ON。
少し待ってからターミナルで SSH 接続を試みる
ssh pi@XXX.local
# fingerprintご自由に
pi@XXX.local's password: # 指定したパスワードを入力
接続完了。問題なさそう。
3. 初期設定
(あれ?スキップしないにしたはずだけど、raspi-config って勝手に上がるものじゃなかったっけ?わからないので手動で)
sudo raspi-config
→ 5 Localisation options を選択
→ L1 Locale を選択
→ ja_JP.UTF-8 UTF-8 を追加 (スペースキーで * がつきます)
→ システムデフォルトは en_GB.UTF8 にしておきます(コマンドしか使わないし、日本語はフォントとかめんどくさいし)。
→ Finish
apt update と apt upgrade
sudo apt update
sudo apt upgrade
4. Nginx インストール
1. インストール
apt list nginx
# Listing... Done
# nginx/stable,stable 1.18.0-6.1 all
デフォルトだと 1.18 がインストールされるようだ。
最新の stable は 1.20 なので、そっちを入れたい。
nginx.org の Debian 用パッケージからインストールを試みる。
コードネームなんだろう?
lsb_release -a
# No LSB modules are available.
# Distributor ID: Debian
# Description: Debian GNU/Linux 11 (bullseye)
# Release: 11
# Codename: bullseye
"bullseye" 用のやつを入れればいいのね。
echo "deb http://nginx.org/packages/debian/ bullseye nginx" >nginx.list
echo "deb-src http://nginx.org/packages/debian/ bullseye nginx" >> nginx.list
sudo mv nginx.list /etc/apt/sources.list.d
sudo apt update
apt list nginx
# :
# nginx/stable 1.20.2-1~bullseye arm64
よし、1.20 が入りそう
sudo apt install nginx
2. バージョン確認
nginx -v
# nginx version: nginx/1.20.2
3. 起動
sudo systemctl start nginx
手元の Mac のブラウザで、http://XXX.local/ にアクセス。
nginx の Welcome 画面が出れば OK。
5. PHP インストール
そのままインストールすると入るのは 7.4 だが、8.x にしたい。
1. 以下の手順で Sugy リポジトリを追加
sudo apt -y install apt-transport-https lsb-release ca-certificates curl
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update
これで 8 系の php をインストールできる。
2. php 関係の諸々インストール
sudo apt -y install php-fpm php-xml php-json php-intl php-curl php-mbstring php-mysql php-zip php-bcmath
dpkg -l | grep php
ii php-bcmath 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all Bcmath module for PHP [default]
ii php-common 2:92+0~20220117.43+debian11~1.gbpe0d14e all Common files for PHP packages
ii php-curl 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all CURL module for PHP [default]
ii php-fpm 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
ii php-intl 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all Internationalisation module for PHP [default]
ii php-json 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all JSON module for PHP [default]
ii php-mbstring 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all MBSTRING module for PHP [default]
ii php-mysql 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all MySQL module for PHP [default]
ii php-xml 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all DOM, SimpleXML, WDDX, XML, and XSL module for PHP [default]
ii php-zip 2:8.1+92+0~20220117.43+debian11~1.gbpe0d14e all Zip module for PHP [default]
ii php8.1-bcmath 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 Bcmath module for PHP
ii php8.1-cli 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 command-line interpreter for the PHP scripting language
ii php8.1-common 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 documentation, examples and common module for PHP
ii php8.1-curl 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 CURL module for PHP
ii php8.1-fpm 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 server-side, HTML-embedded scripting language (FPM-CGI binary)
ii php8.1-intl 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 Internationalisation module for PHP
ii php8.1-mbstring 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 MBSTRING module for PHP
ii php8.1-mysql 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 MySQL module for PHP
ii php8.1-opcache 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 Zend OpCache module for PHP
ii php8.1-readline 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 readline module for PHP
ii php8.1-xml 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 DOM, SimpleXML, XML, and XSL module for PHP
ii php8.1-zip 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 arm64 Zip module for PHP
8.1 がいろいろ入った。
6. MySQL (MariaDB) インストール
Raspberry Pi OS の場合は MariaDBのほうが推奨なのね。
1. インストール
sudo apt -y install mariadb-server
2. 初期設定
sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
3. Laravel 用のデータベースとユーザの作成
sudo mysql -u root
MariaDB [(none)]> CREATE DATABASE laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
MariaDB [(none)]> CREATE USER 'phper'@localhost IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON laravel.* TO 'phper'@localhost;
7. git / composer / nodejs インストール
1. git
ちょっと古いけど困るほどではないので apt で。
sudo apt -y install git
git --version
# git version 2.30.2
2. composer
公式の方法で。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
composer -V
# Composer version 2.2.7 2022-02-25 11:12:27
3. nodejs
nodesource/distributions から 16.x をもってくるのが楽そう。
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v
# v16.14.0
npm -v
# 8.3.1
8. Laravel をインストール
1. 既存プロジェクトを GitHub から clone
sudo mkdir -p /var/www
cd /var/www
sudo git clone https://~.git
Cloning into '<プロジェクト名>'...
Username for 'https://github.com': blancpanda
Password for 'https://blancpanda@github.com': (← Personal Access Token を入力)
プライベートリポジトリなので権限を持たせたパーソナルアクセストークンが必要。
以下のコマンドで15分覚えておいてもらえる。
git config --global credential.helper cache
store にすると ~/.git-credentials に平文のテキストファイルで保存される。有効期限なし。
git config --global credential.helper store
※ あとでクリアする場合
git config --global --unset credential.helper
2. Laravel のセットアップ
sudo chown -R pi:pi <プロジェクトフォルダ>
cd <プロジェクトフォルダ>
composer install
cp .env.example .env
php artisan key:generate
php artisan storage:link
chmod -R 777 storage bootstrap/cache
npm install
npm run dev
nano .env # データベース接続確認(先程作成したデータベース/ユーザで接続する)
php artisan migrate
※ root のままでは不便なので、プロジェクトフォルダの所有権を pi に変更した後作業した。
9. Nginx と PHP-fpm の設定
nginx 1.20 を上記の方法でインストールすると、nginx ユーザで実行しようとするので、/etc/nginx/nginx.conf 先頭の user を www-data に変更する。
# user nginx;
user www-data;
nginx の設定はいろいろやり方があるのだけれども、今回は conf.d 以下に<任意の名前>.conf を作成する。
Laravel の ドキュメントを参考に設定ファイルを作る。
server_name, root, fastcgi_pass 辺りを変更すればよいかと。
server {
listen 80;
listen [::]:80;
server_name XXX.local;
root /<プロジェクトルート>/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.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
nginx 再起動
sudo systemctl restart nginx
手元のブラウザから XXX.local にアクセスして Laravel が見れれば OK
apt install で全部いけたら楽なんだけど、あまりにバージョンが古いと警告がすごくて困る。結果として新しいものを入れるほうが楽かもしれない。
Discussion