Ubuntu 18.04にNginx、PHP 7.4、MySQL 5.7をインストールする

## 目的
ローカル環境で開発していたLaravelのプロジェクトをVPSに乗せるための準備です。

## OSバージョン
```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

## Nginxのインストール

```
$ sudo apt update
$ sudo apt install nginx
```

インストールが完了して、ブラウザ上からホスト名でアクセスすると以下のページが表示されると思います。

![nginx画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278489/d2e259a7-0227-c9c2-9884-c3104a0ab710.png)

## セキュリティ設定
### ufwによるファイアウォール設定
Ubuntu 18.04ではファイアウォールパッケージとして`ufw`(Uncomplicated Firewall)がインストールされています。  
SSH(22)とHTTP(80)、HTTPS(443)のNginxへの接続を許可します。

```
$ sudo ufw allow 'Nginx HTTP'
$ sudo ufw allow 'Nginx HTTPS'
$ sudo ufw enable
```

`ufw`コマンドに関しては下記の記事が大変参考になりました。
`ufw`コマンドの使い方 https://qiita.com/hana_shin/items/a630871dce209cff04f3

### fail2banでアクセス制限設定
`ufw`と一緒にサーバへの攻撃をモニターして、保護してくれる`fail2ban`も導入します。
こちらはインストールして、サービスを起動するだけでOKです。

```
$ sudo apt install fail2ban
$ sudo service fail2ban start
```

## Nginxの設定
### nginx.conf
Nginxの設定ファイルである`nginx.conf`を修正します。

```
$ sudo vim /etc/nginx/nginx.conf
```

- `user`をwww-dataからsshのログインユーザに変更します
- `server_token`のコメントアウトを外します
- 必要があれば`client_max_body_size`を追加します  
これはnginxがPOSTの最大サイズを設定するための項目です(デフォルトは1MB)

### fastcgi_params
NginxでPHPを動かすためには`fastcgi_params`も修正します。
`fastcgi_params`を開いて、末尾に下記を追加します。

```
$ sudo vim /etc/nginx/fastcgi_params
↓追加します
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
↑追加します
```

追加したら構文チェックのために下記を実行します
問題なければNginxを再起動します

```
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo service nginx restart
```

## PHP 7.4 のインストール
Ubuntu18.04でPHP 7.4をインストールするには`ondrej/php`レポジトリを追加する必要があります

```
$ sudo apt install software-properties-common
$ sudo add-apt-repository ppa:ondrej/php
```

追加できたら一度リポジトリ一覧を更新し、モジュールと一緒にPHP 7.4をインストールします

```
$ sudo apt update
$ sudo apt install php7.4-fpm php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-opcache php7.4-soap php7.4-zip unzip -y
```
php 7.4およびモジュールが正しくインストールされているか下記コマンドで確認します

```
$ php -v
$ php-fpm7.4 -v
$ php -m
```

www.confを開いて、userとgroupを`www-data`からsshのログインユーザに変更します

```
$ sudo vim /etc/php/7.4/fpm/pool.d/www.conf
user = username 
group = username 
listen.owner = username 
listen.group = username
```

変更できたらphp-fpmの構文チェック、再起動を行います

```
$ sudo php-fpm7.4 -t
$ sudo service php7.4-fpm restart
```

## NginxでPHPを実行する
### sites-available/default
`sites-available/default`を開いて、下記のように修正します。

indexにindex.phpを追加します

```
index index.php index.html index.htm index.nginx-debian.html;
```

location ~ \.php$ {の記述があれば閉じ括弧も含めてコメントアウトを外します
なければ追加してください

```
location ~ \.php$ {
}
```

括弧内に#	fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;のような記述があれば以下のように書き換えてコメントアウトを外します

```
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
```

最後に括弧内に`include fastcgi_params;`を追加します

設定例

```
index index.php index.html index.htm index.nginx-debian.html;

...略...

location ~ \.php$ {
       include snippets/fastcgi-php.conf;

       # With php-fpm (or other unix sockets):
       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       # With php-cgi (or other tcp sockets):
#      fastcgi_pass 127.0.0.1:9000;
       include fastcgi_params;
}

```

/var/www/htmlに`index.php`を作成します。

``` php
<?php
phpinfo();
```

ここまでできたらnginxを再起動させてブラウザ上からホスト名でアクセスします。

```
$ sudo nginx -t
$ sudo service nginx restart
```

![phpinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278489/be0dcf27-f705-c594-389e-374bbe1ed969.png)

親の顔より見た(？)画面が表示されましたね！

## MySQL 5.7 のインストール
aptコマンドでインストールします。

```
$ sudo apt install mysql-server
```

次のコマンドでMySQLのセキュリティ設定を行います。

```
$ sudo mysql_secure_installation
```

設定方法は下記URLが参考になります。
https://weblabo.oscasierra.net/mysql-57-init-setup/

rootパスワードが設定できたらDBとユーザを作成します。
※'DATABASE_NAME'、'YOUR_NAME'、'YOUR_PASSWORD'には任意の値を適宜書き換えてください

```
$ mysql -u root -p
mysql> CREATE DATABASE 'DATABASE_NAME';
mysql> CREATE USER 'YOUR_NAME'@'localhost' IDENTIFIED BY 'YOUR_PASSWORD';
mysql> GRANT ALL PRIVILEGES ON DATABASE_NAME.* TO 'your_name'@'localhost';
```

作成できたら 設定したユーザとパスワードでMySQLサーバにアクセスできるか確認しましょう。

```
mysql> exit;
$ mysql -u 'YOUR_NAME' -p
```

最後に、index.phpを以下のように変更し、PHPでMySQL接続確認を行います。

``` php
<?php
    define('DB_HOST', 'localhost');
    define('DB_USER', 'YOUR_NAME');
    define('DB_PASSWORD', 'YOUR_PASSWORD');
    define('DB_NAME', 'DATABASE_NAME');

    // エラー表示設定:通知系以外全て表示    
    error_reporting(E_ALL & ~E_NOTICE);

    try {
        $dbh = new PDO('mysql:'.DB_NAME.';'.DB_HOST, DB_USER, DB_PASSWORD);
        print('接続しました。');
    }
    catch(PDOException $e){
        print('ERROR:'.$e->getMessage());
        exit;
    }

```

以下の画面が表示されたら、ミドルウェアのセットアップ完了です。お疲れ様でした:clap:

![接続確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278489/2cd0a1ad-ae64-2d76-03f6-dd9911a64fdc.png)

参考ページ:
https://www.cloudbooklet.com/install-php-7-4-on-ubuntu/
https://stackoverflow.com/questions/25591040/nginx-serves-php-files-as-downloads-instead-of-executing-them
https://teratail.com/questions/137445