Ubuntu 24.04 への Laravel11 のインストール

この備忘録は さくらのVPS で CentOS6 から Ubuntu 24.04 に移行したときの、
Ubuntu 24.04 側で何をやったかの記録。（CentOS6の時の知識とネットの知識でどうにかなんとかやる的な）
なので、色々順番がダメダメなので、もう一度くらいやれば多分いい感じになりそうだけど
もう一度やるのは面倒なのでこのままで。
あ、https 対応しなきゃ...って思い出したのでこの記事では https には対応していません。

■ この記事に出てくるヤーツのバージョン

```
Ubuntu 24.04 LTS
nginx version: nginx/1.26.1
PHP 8.3.9 (cli) (built: Jul  5 2024 12:04:09) (NTS)
MySQL Server version: 8.0.37-0ubuntu0.24.04.1 (Ubuntu)
node v18.19.1
npm 9.2.0
```

## はじめに

■ ubuntu で最初にやること

```
sudo apt-get update
（と思っていたけど、下記 nginx 手順内で apt update やるから不要だったやつ）
```

## nginx インストール

### nginx のインストール

https://nginx.org/en/linux_packages.html#Ubuntu を参考にインストールする
分からん場合は stable を指定して mainline はやらないほうがいいよ。と

手順の最期に sudo apt update あるじゃん。
apt って何？https://aws.amazon.com/jp/compare/the-difference-between-apt-and-apt-get/
なるほど分からん。多分これからは apt-get じゃなくて apt 使おうね的な感じかな
apt に対応していないパッケージもあるから注意してね、的な。

```
# 手順は URL にある通りで省略。

# サービス起動する
$ sudo systemctl start nginx
$ sudo systemctl status nginx
$ nginx -v
nginx version: nginx/1.26.1
```

こいつ自動起動してくれるかな。後回しで。

https://nginx.org/en/docs/beginners_guide.html あった。けど google chrome の翻訳動かないでやんの。。くそう

status で以下が出ていたので、/etc/nginx/ に設定ファイルがあるっぽい

```
Process: 2092 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
```

### とりあえずの index.html の置き場

/home/ubuntu/html/index.html があるとして。
/home/ は色々制約があるので 昔からの /var/www/ 配下が良さげ。

```
sudo mkdir /var/www
mv /home/ubuntu/html /var/www/
```

`sudo vim /etc/nginx/conf.d/default.conf` で location root を変更

```
location / {
    root   /var/www/html;
```

で reload する（絶対忘れる）

```
sudo systemctl reload nginx
```

見れた！

index.html 変えたい欲...

## php インストール

### php のインストール 8.3 系

コレやる。https://php.watch/articles/php-8.3-install-upgrade-on-debian-ubuntu#php83-ubuntu-quick

```
## Save existing php package list to packages.txt file
sudo dpkg -l | grep php | tee packages.txt

# Add Ondrej's PPA
sudo add-apt-repository ppa:ondrej/php # Press enter when prompted.
sudo apt update

# Install new PHP 8.3 packages
sudo apt install php8.3 php8.3-cli php8.3-{bz2,curl,mbstring,intl}

# Install FPM OR Apache module
sudo apt install php8.3-fpm

## Remove old packages
# sudo apt purge php8.2*
```

確認する

```
$ php -v
PHP 8.3.9 (cli) (built: Jul  5 2024 12:04:09) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.9, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.9, Copyright (c), by Zend Technologies
```

入った！

### composer のインストール

参考サイト：https://getcomposer.org/download/

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { 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 # 確認
```

### nodejs のインストール

どのバージョンが入るか分からんけどとりま入れる。

```
$ sudo apt install nodejs npm

$ node -v
v18.19.1
$ npm -v
9.2.0
```

ん。18.19 なら良いか


### Laravel に必要な php 拡張ライブラリを入れる

参考: https://qiita.com/honeytrap15/items/c614b49c2702b82efa9c#laravel%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B

```
sudo apt install php-dom php-curl php-mbstring
sudo apt install unzip
```

は？ `E: Package 'php-dom' has no installation candidate` ってエラー出たけど？？
ちゃんと確認しなきゃダメか？
まぁいいや、エラーのときは別途。

この 参考の qiita 順番が少し前後してる。まぁええか。わかるようにやろ。

## Laravel デプロイ

### Laravel 配置

```
$ cd /var/www/
$ git clone git@github.com:takemitsu/RecordingAnniversaries8.git
fatal: could not create work tree dir 'ra8': Permission denied
```

sudo で clone はしたくないので /var/www のオーナーを nginx にして nginx にユーザを切り替えて実行する

まずは そのユーザがいるかを確認

```
$ cat /etc/passwd | grep nginx
nginx:x:999:988:nginx user:/nonexistent:/usr/sbin/nologin
$ cat /etc/group | grep nginx
nginx:x:988:
$ cat /etc/group | grep www
www-data:x:33:
```

ユーザ切り替え

```
$ sudo su nginx
This account is currently not available.
```

はい。無理でした！

仕方がないので /home/ubuntu で git clone して /var/www に入れるようにしよう。

```
cd ~/
git clone git@github.com:takemitsu/RecordingAnniversaries8.git ra8
# pubkeyとかは別途で設定済み。で移動する
sudo mv ra8 /var/www
```

オーナーとパーミッション変更

```
# オーナーを nginx に
sudo chown -R nginx:nginx /var/www/ra8
# Laravelのディレクトリパーミッション変更のやつ 
# nginxオーナーにしたから不要か？php-fpmが実行なのか？良く分からんけど
sudo chmod -R 777 storage
sudo chmod -R 777 bootstrap/cache
```

■ 動作まで

```
$ composer update
Your requirements could not be resolved to an installable set of packages.

# 足りねぇって言われたので足す
$ sudo apt install php8.3-xml
$ sudo apt install php8.3-dom

$ composer update
file_put_contents(./composer.lock): Failed to open stream: Permission denied
# はい。めんどくせぇ

$ composer install
/var/www/ra8/vendor does not exist and could not be created:
# ですよね、知ってます。準備してから持ってこれば良かったな。

# ちょっとめんどいけど、root で作って ユーザ変更する感じにする。
$ sudo su
# composer install
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? No!
# そうだね。ダメだね。

# ユーザ変えよ。
# cd /var/www/
# chown ubuntu:ubuntu -R ra8
# exit

$ composer install
# できた。mv のときに permission おかしくなったんかな？まぁいいや。
$ php artisan serve

   INFO  Server running on [http://127.0.0.1:8000].

  Press Ctrl+C to stop the server
```

動いたっぽい。


## nginx での Laravel の設定

■ nginx の設定

公式 https://laravel.com/docs/11.x/deployment#nginx を確認しながらいい感じにやってく。

```
$ sudo vim /etc/nginx/conf.d/ra.conf
# 設定省略
$ sudo systemctl reload nginx
```

ログ確認したら php-fpm から permission denid でてる。

```
*202 connect() to unix:/var/run/php/php8.3-fpm.sock failed (13: Permission denied)
```

php-fpm の設定確認して変更する。ググったら listenのowner/group変更すれば良さげ

```
sudo vim /etc/php/8.3/fpm/pool.d/www.conf
# before
listen.owner = www-data
listen.group = www-data
# after
listen.owner = nginx
listen.group = nginx
```

次に `/run/php/php8.3-fpm.sock` のオーナーを nginx にしてみる

```
sudo chown nginx:nginx /run/php/php8.3-fpm.sock
```

nginx の設定も php-fpm 側の sock の記述に合わせる

```
# before
/var/run/php/php8.3-fpm.sock
# after
/run/php/php8.3-fpm.sock
```

それぞれ再起動する

```
sudo systemctl reload nginx
sudo systemctl reload php8.3-fpm
```

ページリロードしたら 500 エラーでた。nginx の error.log にはエラーがないので laravel 側のログを確認する

```
$ tail -f -n 1000 storage/logs/laravel.log
No application encryption key has been specified.
```

はい。 .env やってなかったので .env 作ります。

```
$ cp .env.example .env
$ vim .env
# 設定省略
```

ページリロード！
はい。mysql と mysql のドライバ足りないって。

## mysql インストール

### mysql のインストール

とりまバージョン知らんけど入れてみる。

```
sudo apt install mysql-server
sudo mysql_secure_installation
sudo mysql
```

### mysql ユーザの作成

データベース名やらユーザ名やらパスワードはもちろん .env に合わせて適宜変更してね。

```
mysql> create database ra8;
mysql> create user 'ra_user' IDENTIFIED BY 'password'
mysql> flush privileges ;
# 既存ユーザのパスワードを変更する場合
mysql> -- set password for ra_user@localhost = 'password'
mysql> -- flush privileges;
mysql> grant all on ra8.* to ra_user;
mysql> flush privileges ;
mysql> show grants for 'ra_user';
mysql> exit
# 入れるかテスト
$ mysql -u ra_user -p ra8
mysql> exit
```

### データ流し込み

mysqldumpしたデータが有る場合。
なお、データは local から scp で転送した。

```
$ mysql -u ra_user -p ra8 < mysqldump_ra_20240708.sql
```

### php-mysql ライブラリインスト

```
sudo apt install php8.3-mysql
```

## その他 Laravel 関連

### フロントの準備

以下メッセージが出たので フロントをどうにかする

```
Vite manifest not found at: /var/www/ra8/public/build/manifest.json
```

npm run build すればいいはず。(react/ssr..だったはずの場合。うろ覚え。)

```
npm install
npm run build
```

はい、大丈夫そう。


### Laravel のキャッシュ系をターンとやる

キャッシュ系はこれだけじゃないけど今回のに必要そうなやつだけ

```
$ php artisan optimize
$ php artisan config:cache
$ php artisan route:cache
```


## なんか直した時やること

以下から適当にやればいいはず。

```
$ git pull

# php 側の場合
# composer 追加した
$ composer install
# migrate書いた
$ php artisan migrate
# とりあえず。
$ php artisan optimize
# config 直した時
$ php artisan config:cache
# route 追加したとき
$ php artisan route:cache
# JS(React)側の場合
$ npm run build
```

おわり！