Webサーバーを構築してみた

# 始まり

現在、githubaction で構築されているものを実際の環境にデプロイする。

## 環境

|項目|使用したもの|
|-|-|
|サーバー|AWS|
|OS |Ubuntu |
|webサーバー|nginx|

# AWSの設定

アカウントの開設は省略します
## EC2インスタンスの設定

OSは無料なので、Ubuntuを使用しました。
特に設定するものはないので、デフォルトのもので設定しました。

しかし、AWSはデフォルトでインバウンドルール（サーバーへの接続）で接続が拒否されています。
なので、接続を許可する必要があります。

### インバウンドルールの設定

設定するものは、http,https,icmp,sshです。
|プロトコル|ポート番号|許可するもの|説明|
|-|-|-|-|
|ssh|22|マイip|サーバーに接続し、設定を行う|
|http|80|0.0.0.0|webサーバーのリクエスト受付|
|https|443|0.0.0.0|httpと基本的には同じだが、暗号化されている|
|icmp||0.0.0.0|疎通確認を行うため|

sshは基本的にマイIPなどに制限したほうが安全です。

## サーバーの接続（ssh）

今回は、macで接続をします。
ターミナルで操作を行います。
公開鍵が保存されている場所（~/.sshなど）で以下コマンドを入力。
```bash
ssh -i "key" ubuntu@0.0.0.0
ssh -i "公開鍵"　ユーザー名＠ipアドレス
```

左側にユーザー@ipアドレスが表示されれば接続成功です。

## サーバー環境構築

今回は、静的サイトを立ち上げるので、高速に処理できるnginxを採用します。

### nginxのインストール

下記コマンドを入力
```bash
apt update
apt install nginx
```

### 動作確認

まず、nginxを起動します。
```bash
sudo systemctl start nginx //サービスの起動
sudo systemctl status nginx //確認
```
nginxが動作しているか確認を行います。
ブラウザでhttp://サーバーのipアドレス
で「welcome to nginx」と表示されれば接続成功です。
接続出来ない場合は、サーバーの疎通確認を行います。
ターミナルを立ち上げ下記コマンドを入力。
```bash
ping -c 5 サーバーのipアドレス
//5回接続を試します。
```
疎通確認ができれば、nginxの設定が間違っているか、httpのインバウンドルールが間違って可能性があります。
確認できない場合は、nginxが立ち上がっていないか、インバウンドルールが間違っている可能性があります。

## githubからclone

コードはgithubで管理しているので、cloneする必要があります。

### gitのインストール

まず、gitのインストールを行うために、下記コマンドを入力
```bash
apt update
apt install git
```

### 公開ディレクトリに移動

nginxは/var/www/htmlディレクトリに公開するものを配置します。デフォルトでは、htmlディレクトリがあります。

```bash
cd /var/www/html
```

### cloneを行う
レポジトリーからコードをコピーするために下記コマンドを入力

```bash
git clone https://github.com/ユーザー名/レポジトリー
```

## ドメインの設定

ドメインの取得は割愛します。
DNSサーバーはRoute53使用しました。
Aレコードに設定したいドメインを設定します。
nginx.confにドメインの設定を行います。

## nginxの設定変更

このままだと、デフォルトのままです。
なので、cloneしたものを公開するように変更します。

### 設定ファイル
実際に保存されている場所に対しリンクつけします。

設定ファイルを開くために、下記コマンドを入力。

```bash
cd /etc/nginx
vi nginx.conf
```

### nginx.confを編集

```bash
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name ドメイン名;

    root /var/www/html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ /.well-known/acme-challenge/ {
        allow all;
    }
}
```

### 構文チェック

```bash
nginx -t 
```
```bash
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
以上2個がでればOKです。

## リンクの作成

リンクには、ハードリンクとシンボリックリンクがあります。
### ハードリンクとは
コピーとは違い、ハードリンクから編集すると元のファイルも書き換わります。

ハードリンクの特徴
- ディレクトリのリンクを作成することができない
- 作成したリンクにアクセスしてファイルの編集が可能
- リンク先ファイルを削除してもアクセスできる

### シンボリックリンクとは

リンク先は、元のファイルです。
流れは、直線的になります。

- ディレクトリのリンクを作成することが可能
- リンク先ファイルを削除するとアクセスできない
- リンク元ファイルのアクセス権限が摘要される

```bash
sudo ln -s /etc/nginx/sites-available/<your_domain> /etc/nginx/sites-enabled/
```

## SSL証明書取得（https対応）

今回は、Let’s Encryptを使用しました。
ドメインを登録し、証明書を取得します。

まず、Certbot のインストールをします。
```bash
sudo apt update
sudo apt install certbot python3-certbot-nginx
```
証明書の取得
```bash
sudo certbot --nginx -d example.com　#ドメイン名
```


## 動作テスト

### ステータス確認

```bash
sudo systemctl status nginx
```
Active: がactive(running)の場合は、正常に動作しています。

### ブラウザで動作確認

アクセスする場合はipアドレスを直打ちもしくはドメインを使用します。
httpの場合
http://example.com
http://ipアドレス
httpsの場合
https://example.com
https://ipアドレス
ドメインのみ接続できない場合は、DNSの問題の可能性が高いです。
両方接続できない場合は設定が間違っている可能性が高いです。

## おわり

今回は静的サイトをデプロイしましたが、webアプリも公開することができます。
また、一つのサーバーで複数のドメインを登録できます。
AWSでは複数アプリやサイトをまとめるとコストを削減できます。