🗂

ラズパイ 4 に Laravel の実行環境を作る

2022/03/13に公開約12,100字

ラズパイ 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 に変更する。

/etc/nginx/nginx.conf
# user nginx;
user www-data;

nginx の設定はいろいろやり方があるのだけれども、今回は conf.d 以下に<任意の名前>.conf を作成する。
Laravel の ドキュメントを参考に設定ファイルを作る。
server_name, root, fastcgi_pass 辺りを変更すればよいかと。

/etc/nginx/conf.d/<任意の名前>.conf
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

ログインするとコメントできます