Ubuntu 20.04 LTS でミニマムな Laravel 7.x 開発環境構築

# 方針

- ミニマムインストールの Ubuntu 20.04 LTS (Server install image) を利用
- Apache利用のシンプルな構成
- 必要十分・必要最小限
- 初期確認環境を想定
- PHPのバージョンを `7.3` 固定にする
- ただし、本番でのDocker稼働も視野 (ベースOSへdebian系の採否はともかくとして…)
- LAN内想定でFWも使用しない

# OSインストール要件

- インストールウィザードにしたがった最小限の設定
    - ネットワーク
    - ユーザ・サーバ名
- パーティション分割やLVMは利用しない
- OpenSSH server はインストールしておく
- その他追加パッケージのインストールはなし

# OS基本設定と最新化

上記まで初期インストールが完了したら、対象サーバへSSHして構築していきます。

- タイムゾーンの設定

```
# timedatectl set-timezone Asia/Tokyo        // 日本を指定
# date        // 時刻確認
```

- ufwの無効化

```
# systemctl status ufw        // サービス確認
# systemctl stop ufw          // サービス停止
# systemctl disable ufw       // サービス自動起動無効
```

- zip / unzipのインストール  
**Composer利用時に git / zip / unzip が必要になる**ため。(gitは最初から入っています)

```
# apt install zip unzip
```

- 現状のパッケージの最新化

```
# apt upgrade
```

# 開発用ユーザとアプリ用ディレクトリを準備

今は初期環境構築をしているのでrootで操作していますが、実際に開発を進めるときは権限を絞った専用ユーザで行うようにします。
また、ドキュメントルートも開発用ユーザが管理できるようにします。

```
# useradd -s /bin/bash -m appdev         // appdevというユーザを追加
# passwd appdev                     // appdevにログインパスワードを設定
# mkdir /application                // アプリケーションのドキュメントルート
# chown appdev: /application        // ドキュメントルートのオーナーはappdev
```

# Apache のインストール

```
# apt install apache2           // インストール
```

```
# dpkg -l | grep apache2        // バージョン確認
```

# Laravel 7.x のインストール要件確認

https://readouble.com/laravel/7.x/ja/installation.html
上を参照すると、以下のように記載されています。

- PHP >= 7.2.5
- BCMath PHP拡張
- Ctype PHP拡張
- Fileinfo PHP拡張
- JSON PHP拡張
- Mbstring PHP拡張
- OpenSSL PHP拡張
- PDO PHP拡張
- Tokenizer PHP拡張
- XML PHP拡張

本稿の方針に合わせ、これらを満たすようにインストールを進めます。

# PHP 7.3 と必要パッケージのインストール

PHPのバージョンを `7.3` にFIXして構築していきます。

ここでは追加リポジトリとして、 PPA を導入したうえでPHPのバージョンをFIXさせます。
もし本番環境なら一般的に望ましくない方法ですが、ここでは一旦これで良いでしょう。

```
# apt install software-properties-common    // リポジトリ追加のために必要
# apt-add-repository ppa:ondrej/php         // ppaを追加する

Press [ENTER] to continue or Ctrl-c to cancel adding it.
  // このように表示されたら [Enter] 押下

# apt update                                // 追加したリポジトリの適用
```

- PHP 7.3 本体のインストール

```
# apt install php7.3
```

インストール時の出力が参考になります。
依存パッケージとして、一部の必要パッケージは入るようです。

以下、一部抜粋…

```
The following additional packages will be installed:
  libapache2-mod-php7.3 php-common php7.3-cli php7.3-common php7.3-json
  php7.3-opcache php7.3-readline
Suggested packages:
  php-pear
```


完了したら状況確認します。

```
# php --version        // インストールバージョン確認
PHP 7.3.17-1+ubuntu20.04.1+deb.sury.org+1 (cli) (built: Apr 28 2020 14:49:03) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.17, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.17-1+ubuntu20.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies

# php -m        // インストールモジュール確認 (足りないものを確認)
[PHP Modules]
calendar
Core
ctype
date
exif
fileinfo
filter
ftp
gettext
hash
iconv
json
libxml
openssl
pcntl
pcre
PDO
Phar
posix
readline
Reflection
session
shmop
sockets
sodium
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
Zend OPcache
zlib

[Zend Modules]
Zend OPcache
```

以下の3つの拡張モジュールがありません。

- BCMath PHP拡張
- Mbstring PHP拡張
- XML PHP拡張

インストールを進めます。

```
# apt install php7.3-bcmath php7.3-mbstring php7.3-xml
```

**ここでモジュールバージョンを指定しないと、最新版が入ってしまうので気をつける必要があります。**
(2020年5月現在では 7.4。)


- php-mysql のインストール  
DB接続のために php-mysql をインストールします。

```
# apt install php7.3-mysql
```

**これも 7.3 の指定が必要です。**

- php-pear のインストール  
PECLを使う可能性が高いのでインストールします。

```
# apt install php-pear
```

# Composer のインストール

Laravelは PHP Composer からインストールします。
composer コマンドを使えるようにします。

```
# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer
```

# Laravel 7.x をインストール

ここからは開発用ユーザ (appdev) へスイッチして作業します。

```
$ composer -V
Composer version 1.10.6 2020-05-06 10:28:10
```

まず、上のように composer の動作を確認、Laravel 7.x のインストールへ進めます。

```
$ cd /application
$ composer create-project --prefer-dist laravel/laravel testapp "7.*"
```

ファイル構造ができたことを確認します。

```
$ ls -l testapp/
total 276
drwxrwxr-x  6 appdev appdev   4096 Apr 15 20:46 app
-rwxr-xr-x  1 appdev appdev   1686 Apr 15 20:46 artisan
drwxrwxr-x  3 appdev appdev   4096 Apr 15 20:46 bootstrap
-rw-rw-r--  1 appdev appdev   1586 Apr 15 20:46 composer.json
-rw-rw-r--  1 appdev appdev 207573 May  8 21:16 composer.lock
drwxrwxr-x  2 appdev appdev   4096 Apr 15 20:46 config
drwxrwxr-x  5 appdev appdev   4096 Apr 15 20:46 database
-rw-rw-r--  1 appdev appdev   1013 Apr 15 20:46 package.json
-rw-rw-r--  1 appdev appdev   1197 Apr 15 20:46 phpunit.xml
drwxrwxr-x  2 appdev appdev   4096 Apr 15 20:46 public
-rw-rw-r--  1 appdev appdev   4497 Apr 15 20:46 README.md
drwxrwxr-x  6 appdev appdev   4096 Apr 15 20:46 resources
drwxrwxr-x  2 appdev appdev   4096 Apr 15 20:46 routes
-rw-rw-r--  1 appdev appdev    563 Apr 15 20:46 server.php
drwxrwxr-x  5 appdev appdev   4096 Apr 15 20:46 storage
drwxrwxr-x  4 appdev appdev   4096 Apr 15 20:46 tests
drwxrwxr-x 44 appdev appdev   4096 May  8 21:16 vendor
-rw-rw-r--  1 appdev appdev    538 Apr 15 20:46 webpack.mix.js
```

# Apacheの設定

ここからはサーバの初期設定に戻るので、再度rootで作業します。

作るサイトのドメインは、 `dev.testapp.jp` とします。

- rewrite モジュールの有効化  
rewriteを有効化しないと正常なURLパス表示ができません。例えば、 `/hello` というルートを切った時に、 `http://dev.testapp.jp/index.php/hello` のような**不自然なパス指定を不要にする**ため必要です。

```
# apachectl -M           // 読み込まれているモジュールの確認
# a2enmod rewrite        // rewriteモジュールの有効化
Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl restart apache2
# systemctl restart apache2        // Apache再起動して適用
```

https://readouble.com/laravel/7.x/ja/installation.html#web-server-configuration

- ログディレクトリの作成  
ログについても、開発用ユーザが自分で確認できるように専用ディレクトリに吐くようにします。

```
# mkdir -p /application-log/testapp
# chown -R root:adm /application-log        // apache標準のログ閲覧権限に揃える
```

- ltsvのCustomLogフォーマットを追記

```/etc/apache2/apache2.conf
LogFormat "host:%h\tident:%l\tuser:%u\ttime:%t\treq:%r\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tua:%{User-Agent}i" ltsv
```

- コンフィグの配置

```/etc/apache2/sites-available/testapp.conf
<VirtualHost *:80>
  ServerName dev.testapp.jp
  DocumentRoot /application/testapp/public

  ErrorLog /application-log/testapp/error.log
  CustomLog /application-log/testapp/access.log ltsv

  <Directory /application/testapp/public>
    AllowOverride All
    Options Includes FollowSymLinks
    Require all granted
  </Directory>
</VirtualHost>
```

- コンフィグの有効化

```
# a2ensite testapp
```

- apacheコンフィグテスト

```
# apachectl -t
```

- apacheのリロード

```
# systemctl reload apache2
```

- ドキュメントルートのディレクトリ設定  
`storage` 下と `bootstrap/cache` ディレクトリをWEBサーバから書き込み可能にしないとLaravelからエラーが出ます。  
また、 `php artisan` を実行するために appdev ユーザの書込み権限も必要です。

```
# usermod -aG www-data appdev        // apache の www-data グループに appdev ユーザを所属
# chown -R www-data:www-data /application/testapp/storage /application/testapp/bootstrap/cache
# chmod -R 775 /application/testapp/storage /application/testapp/bootstrap/cache
```

# 動作確認

ここまででサービスは見えるようになっているはずですので、表示確認しましょう。

`dev.testapp.jp` はDNSが外部公開されていないので、確認するPCへ "hosts" を設定します。
今回構築したサーバのIPアドレスは、 172.16.0.50 でその場合の設定例は以下です。

```
# hostsに追記
172.16.0.50 dev.testapp.jp
```

プラウザからLaravelの初期画面が表示されることを確認します。
<img width="1039" alt="ubuntu_20_04_laravel.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631706/61fcd309-07df-70aa-ff76-a625dac3cdfd.png">

基本的なところは、これで問題ないと考えます。

Fin ❤︎