【AWS初心者向け】EC2インスタンスにNginxをインストールして動かすまでの手順

AWS EC2インスタンスにNginxをインストールして、Webサーバーを立ち上げる手順を初心者向けに解説します。EC2を触り始めたばかりの方でも迷わずにセットアップできるよう、実際のコマンドとその出力結果、発生した問題と解決策を含めて説明します。

## 前提条件

- AWS EC2インスタンスが起動済み（Amazon Linux 2を使用）
- SSHで接続できる状態
- 基本的なLinuxコマンドの知識

## 1. Nginxのインストール

まずはNginxをインストールしてみましょう。Amazon Linux 2では以下のようにインストールできます。

```bash
# DNFコマンドを試みるが、Amazon Linux 2では使えない
[ec2-user@ip-xx-xx-xx-xxx ~]$ sudo dnf install nginx
sudo: dnf: command not found
```

Amazon Linux 2では、`dnf`ではなく`yum`または`amazon-linux-extras`を使用します。今回は`amazon-linux-extras`を使用してインストールしてみます。

```bash
# 権限なしで実行してみる
[ec2-user@ip-xx-xx-xx-xxx ~]$ amazon-linux-extras install nginx1
You lack permissions to write to system configuration.  /etc/yum.repos.d/amzn2-extras.repo

# sudoを付けて再実行
[ec2-user@ip-xx-xx-xx-xxx ~]$ sudo amazon-linux-extras install nginx1
Installing nginx
```

**Point**: Amazon Linux 2では、多くのパッケージは`amazon-linux-extras`コマンドでインストールします。システム設定を変更するコマンドは`sudo`を付けて実行する必要があります。

## 2. Nginxの起動と状態確認

インストールが完了したら、Nginxを起動して状態を確認しましょう。

```bash
# サービスの状態確認（まだ起動していない）
[ec2-user@ip-xx-xx-xx-xxx ~]$ systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

# サービスの起動
[ec2-user@ip-xx-xx-xx-xxx ~]$ sudo systemctl start nginx.service 
```

起動したら、実際にポート80で待ち受けているか確認します。

```bash
# ポート80を使用しているプロセスの確認
[ec2-user@ip-xx-xx-xx-xxx ~]$ sudo lsof -i:80
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   3399  root    6u  IPv4  21920      0t0  TCP *:http (LISTEN)
nginx   3399  root    7u  IPv6  21921      0t0  TCP *:http (LISTEN)
nginx   3400 nginx    6u  IPv4  21920      0t0  TCP *:http (LISTEN)
nginx   3400 nginx    7u  IPv6  21921      0t0  TCP *:http (LISTEN)
```

この出力から、Nginxが正常に起動していることが確認できます。
- Nginxは通常、rootユーザーで実行されるマスタープロセスと、nginxユーザーで実行されるワーカープロセスで動作しています
- IPv4とIPv6の両方でポート80（http）をリッスンしています

## 3. 自動起動の設定

サーバーを再起動してもNginxが自動的に起動するように設定します。

```bash
[ec2-user@ip-xx-xx-xx-xxx ~]$ sudo systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
```

これにより、システム起動時にNginxが自動的に起動するようになります。

## 4. EC2セキュリティグループの設定

ここで重要なポイントです。Nginxが起動していても、EC2のセキュリティグループでポート80への接続を許可していないとウェブページにアクセスできません。

以下の手順でセキュリティグループを設定します：

1. AWSマネジメントコンソールで、該当するEC2インスタンスを選択
2. 「セキュリティ」タブをクリック
3. セキュリティグループをクリック
4. 「インバウンドルールの編集」をクリック
5. 「ルールの追加」をクリック
6. 以下の設定を行う:
   - タイプ: HTTP
   - ソース: マイIP（開発中・テスト中）または0.0.0.0/0（公開時）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461603/686fda27-8394-409b-a992-0882df49816f.png)


**Point**: セキュリティの観点から、開発中はソースを「マイIP」のみに制限し、本番公開時に必要に応じて「0.0.0.0/0」（すべてのIPアドレス）に開放するのがベストプラクティスです。

## 5. 動作確認

ブラウザでEC2インスタンスのパブリックIPアドレスにアクセスします。
`http://あなたのEC2のパブリックIP/`

正常に設定できていれば、以下のようなNginxのデフォルトページが表示されます。

```
Welcome to nginx!
...
```

**注意**: 最初はアクセスできなくても、セキュリティグループの設定変更後、少し時間をおいて再度アクセスすると表示されることがあります。設定の反映には多少時間がかかる場合があります。

## トラブルシューティング

### 1. Nginxが起動しない場合
```bash
sudo systemctl status nginx.service
```
エラーメッセージを確認し、必要に応じて以下のログを調査します。
```bash
sudo tail -f /var/log/nginx/error.log
```

### 2. ブラウザでアクセスできない場合
- セキュリティグループの設定を確認
- ファイアウォールの状態確認
```bash
sudo iptables -L
```
- ポート80が使用可能か確認
```bash
sudo lsof -i:80
```

### 3. Welcome to Nginx! が表示されない場合
デフォルトのindex.htmlが存在するか確認します。
```bash
ls -l /usr/share/nginx/html/
```

## 次のステップ

Nginxが正常に動作することを確認できたら、以下のような作業に進むことができます：

1. 自分のウェブコンテンツのデプロイ
2. Nginxの設定カスタマイズ
3. SSL/HTTPS設定
4. ドメイン名の設定とDNS構成

## まとめ

この記事では、EC2インスタンス（Amazon Linux 2）にNginxをインストールし、動作確認するまでの基本的な手順を解説しました。EC2初心者でも迷わずにWebサーバーを立ち上げられるよう、コマンドの実行結果や、発生しうる問題と解決策を含めました。

これでウェブアプリケーションの公開に向けた第一歩を踏み出すことができます。引き続き、自分のウェブサイトをデプロイして楽しんでください！

---