サーバ構築をした話

## はじめに
これは株式会社ハートビーツ様のインターンシップで経験した内容を自分の環境で立て直してwordpressを実際に使うことができるようになるまで設定を行ったものである。今回作成するサーバはLAMP環境を構築する。
[株式会社ハートビーツ様](https://heartbeats.jp/)


## 自己紹介(2023年6月現在)
- 2021年4月に大学入学し、初めてプログラミングを学ぶ
- プログラミング経歴
  - C言語(2021年4月~2022年6月)
    - 主に学校の授業で使用
    - ubuntu、gcc、Atmel Studio、VScode
      - 基本文法から組み込みの基礎まで
      - AtCoderのBまでは安定的に解ける
  - Python(2021年10月~現在)
    - 主に学校の授業で使用
    - VScode、python、anaconda jupiter、Raspberry Pi, tensorfrow
      - 基本文法から機械学習の基礎、データ解析基礎、センサシステムの作成
  - Java(2022年5月~現在)
    - 独学で趣味の範囲で使用
      - 基本文法からMavan、Gradleまで経験あり
        - MinecraftのMod作成を行った
      - 現在はSpring Bootに挑戦中
- Linuxに関しては全く触ったことがなくubuntuで触れたcdやviのみ使える  

## 早速作業をしよう
### 今回準備するもの
- AWSアカウント
- Teraterm(windows)
### 今回利用するもの
- AWS EC2(無料利用枠で最低限は動きます)
- PHP
- MySQL
- Apache
- WordPress

## 目次
[1.Linux編](#linux設定編)
[2.Apache編](#apache設定編)
[3.PHP編](#php設定編)
[4.MySQL編](#mysql設定編)
[5.WordPress編](#wordpress設定編)
[6.これを通して学んだこと](#学んだこと編)
[7.上手く動作しないとき](#上手く動作しないとき編)

### Linux設定編
1. AWSマネジメントコンソールからインスタンスを作成、起動する
1. Linuxの初期設定を変更する

では、やっていこう

#### AWSマネジメントコンソールからインスタンスを作成、起動する
各自のAWSマネジメントコンソールにログインする
リージョンを東京にする
マネジメントコンソール上側「コンピューティング」から「EC2」を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473187/07560938-d244-70c8-249c-f27ecd3ebe9b.png)

「インスタンスを起動」を選ぶと下記のようなページに遷移する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473187/138a8332-38f2-5d5f-8215-34b65cb1c9a8.png)

##### インスタンスを作成の設定について
###### 自分が実際に設定したもの
1. 名前とタグ
    - サーバの内容を含めた方が良い
        - 今回はwebサーバなので「web」を含める
        - Alma Linuxからもじって「albus-webdb01」と設定
        
1. AMI
    - AWS MarketplaceからAlma Linux OS 8.7を選択
        - インターンシップではalma Linuxを基にしたイメージを設定したため
    ::: note warn
    注意点
    Linuxディストリビューションによってはコマンドが少し異なるものがあります。
    この記事はRedHat系Alma Linuxで行います。
    その他RedHat系はCent OS、Fedoraがあります。
    違う場合は読み替えて実行してください。
1. インスタンスタイプ
    - t2.micro
        - 無料枠で一番性能が高い
1. キーペア
    - キーペア名は任意
    - キーペアタイプはED25519を選択
    - Teratarmでは「.pem」を選ぶ
    - キーペアを作成をクリック
1. ネットワーク設定
    - VPC デフォルト
    - サブネット　デフォルト
    - パブリックIPの自動割り当て　デフォルト
    - ファイアウォール
        - セキュリティグループを作成する
        - セキュリティグループ名：任意
        - 説明：任意
        - インバウンドセキュリティグループのルール
            - タイプ ssh
            - ソースタイプ　任意の場所
            - 説明　任意
1. ストレージを設定
    - 10GiB gp3
    ::: note warn
    注意点
    メモリが少なすぎるとMySQLの起動中、処理が遅くなる可能性がある
1. その他はそのままで「インスタンスを起動」をクリック
1. もしサービスなどを本格的に行う場合はAuto Scalingなどでアクセス数やインスタンス稼働率に応じてインスタンスを増減させる仕組みを組み込むべきですが、今回は趣旨と異なるため行いません。

#### Linuxの初期設定を行う
まずはTeratermなどで接続する
1. 自動切断の設定
```
$ sudo vi /etc/ssh/sshd_config
#change
ClientAliveInterval 60
ClientAliveCountMax 30
#

$ sudo systemctl restart sshd
```
タイムゾーンの設定
```
$ sudo timedatectl set-timezone Asia/Tokyo

$ date
Thu Jun  8 14:47:24 JST 2023
```
ホスト名の設定

```
$ hostnamectl set-hostname albus-webdb01

$ hostname
albus-webdb01
```
SE Linuxの設定
```
$ getenforce
Enable

$ sudo vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```

再起動しないと反映されないため一旦別コマンドで無効化
```
$ sudo setenforce 0

$ getenforce
Permissive
```

### Linux設定終了！！

### Apache設定編
1. Apacheのインストール、設定
1. テストページの作成、表示

#### Apacheのインストール、起動
```
$ sudo yum install httpd -y
```
インストールが完了する
```
$ sudo systemctl start httpd

$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/httpd.service.d
           mqphp-fpm.conf
   Active: active (running) since Thu 2023-06-08 14:42:41 JST; 28min ago
```

ステータスを確認してActive:activeになっていれば完了
ブラウザでパブリックIPアドレスを入力するとテストページが表示される

次回から自動起動にする設定
```
$ sudo systemctl enabled httpd
```

#### テストページを作成し、テストページを表示する
```
$ sudo vi /var/www/html/index.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テストページ</title>
</head>
<body>
テスト
</body>
</html>

```
保存後にブラウザにインスタンスのパブリックIPアドレスを入力することで以下のようなページが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473187/f9754464-9882-374c-547f-2c19e735fa97.png)


### Apache設定終了！！


### PHP設定編
1. PHPのインストール
1. ApacheとPHPを連結させる

#### PHPのインストール
システムパッケージを更新する
```
$ sudo dnf upgrade --refresh -y
```

PHPのリポジトリをインストールする
```
$ sudo dnf install \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm \
https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-9.noarch.rpm
```

PHPのバージョンを確認する
```
$ dnf module list php

AlmaLinux 8 - BaseOS 3.0 MB/s | 3.0 MB 00:01
AlmaLinux 8 - AppStream 7.3 MB/s | 10 MB 00:01
AlmaLinux 8 - Extras 24 kB/s | 18 kB 00:00
AlmaLinux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
php 7.4 common [d], devel, minimal PHP scripting language
php 8.0 common [d], devel, minimal PHP scripting language
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
```

今回はPHP8.0を使うため対象バージョンを有効化する
```
$ sudo dnf module enable php:8.0 -y
```

インストールする
```
$ sudo dnf install php -y
```

PHPのバージョン確認
```
$ php -v
PHP 8.0.27 (cli) (built: Jan  3 2023 16:17:26) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.27, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.27, Copyright (c), by Zend Technologies
```

Apacheの設定ファイルにPHPをデフォルトで表示させる設定をする
```
vi /etc/apache2/sites-enabled/000-default.conf
#以下を追記
DirectoryIndex index.php index.html index.htm
```

#### ApacheとPHPを連結させる
PHPを起動＆自動起動設定をする
```
$ sudo systemctl start php-fpm
$ sudo systemctl enable php-fpm
```

ここがつまった！！
ここブラウザでパブリックIPアドレスを入れるとPHPのテストページがされるはずなのに動かない、、

そもそも！連結させるさせるためのファイルは入ったのか？？
```
$ sudo rpm -qc php-fpm
#↓インストールしたもの
#/etc/httpd/conf.d/php.conf ←これ！！
#/etc/logrotate.d/php-fpm
#/etc/nginx/conf.d/php-fpm.conf
#/etc/nginx/default.d/php.conf
#/etc/php-fpm.conf
```
いるなぁ、、、

原因：Apacheの再起動しないと設定が判明されない！！
```
$ sudo systemctl restart httpd
```

連結できた！！
初期設定ではDocumentrootが/var/www/htmlになっているのでその配下にphp/phpinfo.phpを作成する
```
cd /var/www/html
mkdir php
```

テストページの作成
```
vi phpinfo.php

<?php phpinfo.php?>
```
ブラウザでパブリックIPアドレス/php/phpinfo.phpでアクセスするとバージョンや導入したライブラリなどが表示される。

### PHP設定終了！！

### MySQL設定編
1. MySQLのインストール
1. 初期設定

#### MySQLのインストール
rootユーザーのパスワードを設定する
```
passwd
```

ここで驚愕の事実を知る
下記コマンドでrootユーザーへの変更が出来る
```
$ sudo su -
```

PHPのインストールされているものの確認
```
# dnf list installed | grep php

php.x86_64 8.0.20-2.module_el8.7.0+3286+6cee236e
@appstream
php-cli.x86_64 8.0.20-2.module_el8.7.0+3286+6cee236e
@appstream
php-common.x86_64 8.0.20-2.module_el8.7.0+3286+6cee236e
@appstream
php-fpm.x86_64 8.0.20-2.module_el8.7.0+3286+6cee236e
@appstream
php-mbstring.x86_64 8.0.20-2.module_el8.7.0+3286+6cee236e
@appstream
php-opcache.x86_64 8.0.20-2.module_el8.7.0+3286+6cee236e
@appstream
php-pdo.x86_64 8.0.20-2.module_el8.7.0+3286+6cee236e
@appstream
php-xml.x86_64 8.0.20-2.module_el8.7.0+3286+6cee236e
@appstream
```

MySQLのインストール
```
# dnf install mysql-server php-mysqlnd
```
なんでも「sudo」処理は危ないので一旦rootユーザーから抜ける
```
# exit
```

MySQLの起動、確認、自動起動設定をする
```
$ sudo systemctl start mysqld
$ sudo systemctl status mysqld
#active
$ sudo systemctl enable mysqld
```

MySQLの初期設定をする
参考サイト：[MySQLの初期設定(Ingenious)](https://www.ingenious.jp/articles/howto/linux/almalinux-wordpress-setup/#toc19)
```
$ sudo mysql_secure_installation
```

MySQLへの設定確認
```
$ sudo mysql -u root -p

Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.0.30 Source distribution
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

### MySQL設定終了！！

### WordPress設定編
1. WordPressのインストール
1. MySQLとの接続

#### WordPressのインストール

一旦rootユーザーに切り替える
```
$ sudo su -
```
Documentルートに移動してそこにインストールする
```
# cd /var/www/html
```

WordPressのインストール
```
# wget https://ja.wordpress.org/latest-ja.tar.gz
-bash: wget: command not found
```
wgetがない！？のでcurlを使うことに、、

```
# curl -O https://ja.wordpress.org/latest-ja.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 24.0M 100 24.0M 0 0 7024k 0 0:00:03 0:00:03 --:--:-- 7024k
```

zipファイルの解凍をする
```
# unzip latest-ja.zip
-bash: unzip: command not found
```
unzipも入ってない！？のでunzipをインストールすることに、、
```
# yum install unzip -y
```

#### MySQLとの接続

MySQLにWordPress用のデータベースとユーザ作成する

MySQLにログイン
```
# mysql -u root -p
```

データベースの作成とユーザへの権限割り振り
```
mysql> CREATE DATABASE sample;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE USER 'testuser'@'localhost' IDENTIFIED BY '****';
mysql> GRANT ALL PRIVILEGES ON sample.* TO testuser@localhost;
mysql> FLUSH PRIVILEGES;
mysql> exit
```

rootユーザから抜ける
```
# exit
```

wordpressのディレクトリに移動
先にバックアップファイルを作成する
今は/var/www/htmlにいるはずなので配下のディレクトリに移動する
```
cd ./wordpress
$ sudo cp wp-config-sample.php wp-config.php
$ ls
index.php wp-blog-header.php wp-cron.php wp-mail.php
license.txt wp-comments-post.php wp-includes wp-settings.php
readme.html wp-config.php wp-links-opml.php wp-signup.php
wp-activate.php wp-config-sample.php wp-load.php wp-trackback.php
wp-admin wp-content wp-login.php xmlrpc.php
```

configファイルを書き換える
先ほど作成したMySQLユーザの情報を書き込む
```
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'sample' );
/** Database username */
define( 'DB_USER', 'testUser' );
/** Database password */
define( 'DB_PASSWORD', '******' );
/** Database hostname */
define( 'DB_HOST', 'localhost' );
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0);
```
ここまでできたら確認！！
http://パブリックIPアドレス/wordpress/wp-admin/install.phpでアクセス！！
インストール画面に飛ぶことができたら完了！！

### WordPress設定終了！！

WordPressで画像データを扱うためにはphp-gdというライブラリが必要になるためインストールしておく。
[参考サイト：よろず屋ありみちのブログ](https://aw1.jp/web/centos8-1%E3%81%ABgd%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)

## サーバ構築完了！！！

## しかし、ここで落とし穴があることに気がつく

 EC2インスタンスのパブリックIPアドレスが変わったらwordpressの記事見れない！！！！

次回：原因を突き止めて解決方法を試してみた。


### 学んだこと編
現代ではクラウドとして簡単に個人用サーバを立てられるようになったが、今回の実習を通してサーバがどのように出来上がっているのか、Linux、Apache、PHP、MySQLがどのように動いているのかを学んだ。学校で使ったことのあるコマンド「wgetやunzip」が入っていなくて素朴なLinuxでのCLI操作について慣れることも出来た。以下はリクエストを受け取ってからブラウザへ表示するまでのサーバ内部での処理を図にしてまとめた画像を掲載する。なお、今回はウェアサーバ内部についての記事のためHTMLリクエストやレンダリングについては省略する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473187/d77b3bab-6bc3-8e0a-1945-ec57bff6983f.png)


### 上手く動作しないとき編
ここでは上でまとめたものの作業中につまずいた問題について記載する

Apacheのテストページが表示されない！！
原因：DocumentRootの設定が間違ってる！！
確認方法
```
$ sudo vi /etc/httpd/conf/httpd.conf

DocumentRoot "/var/www/html"
```
ここのDocumentRootの部分がページを表示する際にコンピュータが辿るディレクトリの道で今設定の場合、/var/www/htmlディレクトリ配下のhogehoge.htmlなどが表示対象になる。

WordPressのインストールページに飛べない！！
原因：MySQLのユーザ作成のときにホスト名の設定を間違えた！！
間違えた箇所：mysql> CREATE USER 'testuser'@'localhost' IDENTIFIED BY '****';
ここのlocalhostの部分をhostnamectlで設定した名前を入れてしまったことが原因で起きた
推測：hostnamectlはPC（Linux上）の名前が変わるだけでMySQLで認識するのは別サーバか、このサーバなのかの差だからlocalhostになるのではないかなぁ、、


##### と、いうことで！今回はサーバ構築をした話でした！