Nginx、PHP、MariaDBの構築手順

# 前言
OracleCloudの無料vpsを利用してこの手順書を作りました（Oracle社に感謝します）。WordPress、NextCloudなどソフトが必須のphpとMariaDBの環境構築手順です。

# 環境
- OS Ubuntu 22.04 LTS
- **Nginx**　`80`、`443`の管理
- **PHP**　Webアプリケーションの開発を得意とするプログラミング言語
- **MariaDB**　データーベース

# 作業
## 1. OracleCloudにUbuntu OSのVPS新規
- [アカウント作成](https://signup.oraclecloud.com/)
- vps起動までの手順略

## 2. OS環境更新/ポート開放    
### 2.1 OS環境更新
- インストール可能なパッケージの「一覧」を更新する。
  
  `$ sudo apt update`

  実際のパッケージのインストール、アップグレードなどはおこなわない。)
- インストール済みのパッケージ更新をおこない、新しいバージョンにアップグレードする。
  
  `$ sudo apt-get upgrade`

  (「有効なパッケージ一覧」を元に実行されるので、 apt-get update と組み合わせて使う必要がある。)

### 2.2 ポート開放`80`、`443`の追加
- ファイアウォールであるiptablesのポートの開放状況調査
  
  `$ cat /etc/iptables/rules.v4`

  or
  
  `$ sudo iptables -nL`
  ```sh
  ubuntu@duckbooby:~$ sudo iptables -nL
  # インプット訪問はtcp22のみ、80、443開放しない
  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination         
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
  ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
  ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp spt:123
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
  REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
        
  Chain FORWARD (policy ACCEPT)
  target     prot opt source               destination         
  REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
    
  # アウトプット全部開放
  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination         
  InstanceServices  all  --  0.0.0.0/0            169.254.0.0/16  
    
  # 略...
  ```

- `80tcp`、`443tcp` の許可（開放）エントリ追加
  
  `/etc/iptables/rules.v4` を管理者権限で開き、ssh/22tcp用に既に存在しているエントリの直下へ、`80tcp`、`443tcp`の許可エントリを挿入する。
  
  `$ sudo vim /etc/iptables/rules.v4`
  
  **vim**の利用：`yy`行コピー、`p`行の下にペスト、`i`入力。`eseキー`戻る、`:wq`保存して閉じる
  
  修正したファイル：
  ```sh
  # CLOUD_IMG: This file was created/modified by the Cloud Image build process
  # iptables configuration for Oracle Cloud Infrastructure
    
  # See the Oracle-Provided Images section in the Oracle Cloud Infrastructure
  # documentation for security impact of modifying or removing these rule
    
  *filter
  :INPUT ACCEPT [0:0]
  :FORWARD ACCEPT [0:0]
  :OUTPUT ACCEPT [463:49013]
  :InstanceServices - [0:0]
  -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  -A INPUT -p icmp -j ACCEPT
  -A INPUT -i lo -j ACCEPT
  -A INPUT -p udp --sport 123 -j ACCEPT
  -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
  -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT   # ポート80を開放する
  -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT  # ポート443を開放する
  -A INPUT -j REJECT --reject-with icmp-host-prohibited
  -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  -A OUTPUT -d 169.254.0.0/16 -j InstanceServices
    
  # 略...
  ```

  保存すると、下記のコマンドでファイアウォールを再起動する
  `sudo iptables-restore < /etc/iptables/rules.v4`

## 3. 必要環境構築/初期設定（インストール）
### 3.1 Nginxのインストール
`$ sudo apt install nginx`

インストールすると`systemctl status nginx`コマンドで確認
```sh
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-12-07 04:57:42 UTC; 1 day 2h ago
       Docs: man:nginx(8)
   Main PID: 11499 (nginx)
      Tasks: 3 (limit: 1076)
     Memory: 3.5M
        CPU: 33ms
     CGroup: /system.slice/nginx.service
             ├─11499 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─11500 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >
             └─11501 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >

Dec 07 04:57:41 duckbooby systemd[1]: nginx.service: Deactivated successfully.
Dec 07 04:57:41 duckbooby systemd[1]: Stopped A high performance web server and a reverse proxy server.
Dec 07 04:57:41 duckbooby systemd[1]: Starting A high performance web server and a reverse proxy server...
Dec 07 04:57:42 duckbooby systemd[1]: Started A high performance web server and a reverse proxy server.
```

### 3.2 PHPのインストール
`$ sudo apt install php`

`sudo apt install php8.1-fpm php8.1-cli php8.1-common php8.1-mbstring php8.1-xmlrpc php8.1-soap php8.1-gd php8.1-xml php8.1-intl php8.1-mysql php8.1-cli php8.1-ldap php8.1-zip php8.1-curl php8.1-opcache php8.1-readline php8.1-xml php8.1-gd`

インストールすると`php -v`コマンドで確認
```sh
PHP 8.1.2-1ubuntu2.9 (cli) (built: Oct 19 2022 14:58:09) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.9, Copyright (c), by Zend Technologies
```

### 3.3 MariaDBのインストールと初期設定
- 3.3.1 MariaDB をインストールする
   
   `$ sudo apt install mariadb-server mariadb-client`

    - ディフォルト設定の確認
    
      `$ cat /etc/mysql/mariadb.conf.d/50-server.cnf`
      ```sh
      # 90行目 : デフォルトの文字コードを確認
      # 絵文字等 4バイト長の文字を扱う場合は [utf8mb4]
      character-set-server  = utf8mb4
      collation-server      = utf8mb4_general_ci
      ```
- 3.3.2 MariaDB を起動/自動起動有効する
  
  `$ sudo systemctl start mariadb`

  `$ sudo systemctl enable mariadb`

    - systemctlコマンドの運用（参照）
        <table>
            <thead>
                <tr>
                    <th>操作</th>
                    <th>コマンド</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>
                        サービス起動</td>
                    <td>systemctl start <b>${Unit}</b>
                    </td>
                </tr>
                <tr>
                    <td>
                        サービス停止</td>
                    <td>systemctl stop <b>${Unit}</b>
                    </td>
                </tr>
                <tr>
                    <td>
                        サービス再起動</td>
                    <td>systemctl restart <b>${Unit}</b>
                    </td>
                </tr>
                <tr>
                    <td>
                        サービスリロード</td>
                    <td>
                        systemctl reload <b>${Unit}</b>
                    </td>
                </tr>
                <tr>
                    <td>
                        サービスステータス表示</td>
                    <td>
                        systemctl status <b>${Unit}</b>
                    </td>
                </tr>
                <tr>
                    <td>
                        サービス自動起動有効</td>
                    <td>
                        systemctl enable <b>${Unit}</b>
                    </td>
                </tr>
                <tr>
                    <td>
                        サービス自動起動無効</td>
                    <td>
                        systemctl disable <b>${Unit}</b>
                    </td>
                </tr>
                <tr>
                    <td>
                        サービス自動起動設定確認</td>
                    <td>
                        systemctl is-enabled <b>${Unit}</b>
                    </td>
                </tr>
            </tbody>
        </table>


- 3.3.3 MariaDB の初期設定
  - MariaDB用のポート`3306`の状況確認（不必要）
  
    `$ ss -lntp |grep 3306`
    ```shell
    LISTEN 0      80         127.0.0.1:3306      0.0.0.0:*     
    ```
  - 初期設定

    `$ sudo mariadb-secure-installation`

    スクリプトを実行すると、各処理を実行するかどうか訊ねられます。 (#コマンド文字 は直前の文を翻訳したもので、実際には出力されません)
    ```python
    '''ここから

    ubuntu@duckbooby:~$ sudo mariadb-secure-installation

    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
          SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
    '''#翻訳文
    注意: 実運用環境のすべての MariaDB サーバにおいて、当スクリプトのすべて
         の処理を実行することが推奨されます！ 各手順をよくお読みください！
    '''
    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.
    '''#翻訳文
    MariaDBにログインしてそれを安全にするには、root ユーザの現在のパスワードが
    必要です。MariaDB をインストールした直後で root パスワードをまだセットして
    いない場合、パスワードは空白であるため、そのまま Enter キーを押して
    ください。
    '''
    
    Enter current password for root (enter for none): 
    OK, successfully used password, moving on...
    '''#翻訳文
    root の現在のパスワードを入力してください (未設定なら Enter)
    完了、パスワード認証に成功しました、処理を続行しています...
    '''

    Setting the root password or using the unix_socket ensures that nobody
    can log into the MariaDB root user without the proper authorisation.
    '''#翻訳文
    root パスワードを設定することで、適切な認証なしでは MariaDB の rootユーザ
    にログインできなくなります。
    '''

    You already have your root account protected, so you can safely answer 'n'.
    #すでに root パスワードがセットされているので、「n」と回答しても安全です。

    Switch to unix_socket authentication [Y/n] n
     ... skipping.
    '''#翻訳文
     ... スキップ。
    '''

    You already have your root account protected, so you can safely answer 'n'.
    '''#翻訳文
    すでに root パスワードがセットされているので、「n」と回答しても安全です。
    '''

    Change the root password? [Y/n] y
    '''#翻訳文
    root パスワードを変更しますか？
    '''
    New password: 
    Re-enter new password: 
    Password updated successfully!
    Reloading privilege tables..
     ... Success!
    '''#翻訳文
    新しいパスワード：root(仮)
    パスワード確認：root（仮）
    パスワードが正常に更新されました!
    特権テーブルをリロードしています..
     ... 成功しました！
    '''

    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.
    '''#翻訳文
    既定で、MariaDB のインストール作業においては匿名ユーザを利用することができ、
    ユーザアカウントの作成なしで誰でもログインすることができます。これは
    インストールを若干スムーズに行うために存在し、テストのみで利用することが
    想定されています。これらは、実運用環境に移行する前に削除する必要があります。
    '''

    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.
    '''#翻訳文
    通常、root ログインは「localhost」からの接続のみで許可されるべきです。それ
    により、ネットワークから root パスワードを推測できないようになります。
    '''

    Disallow root login remotely? [Y/n] n
     ... skipping.
    '''#翻訳文
     リモートからの root ログインを禁止しますか？
     ... スキップ。
    '''

    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.
    '''#翻訳文
     既定で、MariaDBには、だれでもアクセス可能な「test」という名前の
     データベースが付属しています。これもテストのみで利用されることが想定されて
     おり、実運用環境に移行する前に削除する必要があります。
    '''

    Remove test database and access to it? [Y/n] y
     - Dropping test database...
     ... Success!
     - Removing privileges on test database...
     ... Success!
     '''#翻訳文
     test データベースとそのデータベースへのアクセスを削除しますか？
     - test データベースを削除しています...
     ... 成功しました！
     - test データベースに対する権限を削除しています...
     ... 成功しました！
    '''

    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.
    '''#翻訳文
    完了しました！ 以上のすべての処理を実行していれば、安全に MariaDB を
    インストールできているはずです。
    '''

    Thanks for using MariaDB!
    '''#翻訳文
    MariaDB のご利用ありがとうございます！
    '''
    
    ここまで'''
    ```

環境構築までの手順は以上です。

お疲れ様でした。