🔖

【AWS】EC2インスタンスにnginxをインストールして起動させるまでの手順

2023/09/17に公開

この記事の概要

AWS&インフラ初心者です。

勉強のために、EC2インスタンスを作成し、そこにnginxをインストールして起動させます。

具体的には下記を実施していきます。

  • VPC・サブネットの作成
  • EC2インスタンスの作成
  • EC2にnginxをインストール
  • ngixnのデフォルトページをブラウザから確認

構成図

EC2インスタンスとは

  • Amazon EC2で立ち上げたサーバー
  • 仮想マシン / AzureでいうVMのこと

VPC&サブネットの作成

EC2インスタンスを配置するためのVPCとサブネットを作成します。

AWSのコンソール画面からVPCのページに遷移します。

  • 作成するリソース:VPCなど
    • サブネット、ルートテーブル、インターネットゲートウェイ、VPCエンドポイントをVPCと同時に作成する方式です
  • 関連リソースの作成(各種名前は任意)
    • VPC: vpc-001
    • サブネット:public-subnet-001
    • ルートテーブル:rtb-001
    • インターネットゲートウェイ:igw-001
    • VPCエンドポイント:vpc-endpoint-001
  • IPv4 CIDRブロック:10.0.0.0/24
  • サブネットのCIDRブロック:10.0.0.0/26
  • AZの数:1
  • VPCエンドポイント:なし
    • セキュリティの向上は不要のため"なし"を選択

VPCを作成ボタンを押すと、下記のように各種リソースが作成されます。

VPCへインターネットゲートウェイをアタッチ

VPC内のリソースがインターネットと通信を行うためには、VPCにインターネットゲートウェイをアタッチする必要があります。インターネットへ通信する道を用意するイメージでしょうか。

今回はインターネットゲートウェイはVPC作成時に一緒に作成されており、そのタイミングでVPCへのアタッチも完了しています。

サブネットのルートテーブルにインターネットゲートウェイのルートを追加する

今回作成するサブネットは、インターネットからアクセス可能なパブリックサブネットとして作成します。

そのためには、サブネットのルートテーブルにインターネットゲートウェイのルートを追加する必要があります。

具体的には、0.0.0.0/0のルートのターゲットにインターネットゲートウェイを指定し、保存します。

※これもVPC作成時に一緒に実施されたかもしれません...。

10.0.0.0/24 localとは何か

基本的に、同じVPC内に所属するリソースは、相互に通信できます。

デフォルトで設定されている「10.0.0.0/24 : local」は、それを実現するための設定です。10.0.0.0/24 の範囲でIPアドレスを持つリソースは、VPC内の他のリソースとも通信できるということになります。

なお、この設定は削除したり、変更したりはできません。

サブネット間の通信制御

「同じVPC内だけど異なるサブネットからの通信は受け付けたくない」という場合はどうすれば良いでしょうか。

これは、ルートテーブルの設定ではなく、セキュリティグループによって実現します。

ルートテーブルは、トラフィックを許可&拒否するような機能や役割を持ちません。そのため、サブネット間の通信制御はセキュリティグループなど別の機能を使って実現します。

EC2インスタンスの作成

VPC,サブネットの話が長くなりました。

本題のEC2インスタンスを作成していきます。

AWSコンソールでEC2のサービスページに行きます。

  • 左メニューのインスタンスを選択
  • インスタンスを起動を選択
    • 名前
    • AMI(Amazonマシンイメージ)を選ぶ
      • ここでは、"Amazon Linux 2 Kernel 5.10 AMI 2.0.20230727.0 x86_64 HVM gp2"を選択(無料枠の対象)
    • インスタンスタイプを選択
      • t2.microを選択(無料枠の対象)
    • キーペア
      • 新しいキーペアを作成
      • キーペア名:sample-accesskey
      • キーペアのタイプ:RSA
      • プライベートキーファイル形式:.pem
    • ネットワーク設定
      • 上で作成したVPC&サブネットを指定する
        • vpc-001 / public-subnet-001
      • セキュリティグループを作成する
        • 名前:sg-001
      • 任意の場所からのSSHトラフィックを許可する
    • ストレージを設定
      • 8GiB gp2

キーペアについて

キーペアは作成時に自動的にダウンロードされています。作成後にAWSコンソールからダウンロードすることはできませんので、削除したりしないように注意です。

キーを紛失した場合は、「EC2インスタンスを作成し直す」か「SSM(AWS Systems Manager)でEC2に入って、キーを作り直す」必要があります。

EC2に紐づくVPCとサブネット

EC2インスタンスを作成するとき、何も設定しないと、デフォルトのVPCやサブネットが紐づきます。

ただし、デフォルトのVPCは実際の運用ではあまり使いません。デフォルトのVPCを使ってしまうと、そのネットワーク領域に何のリソースが配置されるか分からなくなってしまうため、実際の運用では基本NGと考えた方が良いです。この辺りは詳しい人に聞きました。ちゃんと役割を明確にしたVPCやサブネットを作成するのがベターということですね。

今回は学習用なのでそこまで気にしなくても良いかもしれませんが、実際の運用に倣って、上で作成したVPCとサブネットを指定しています。

EC2インスタンスにSSH接続する

以下の手順でEC2インスタンスにSSH接続します。

  • AWSコンソールで作成したEC2インスタンスの詳細画面に遷移します
  • 接続 → SSHクライアント
  • EC2インスタンス作成時にダウンロードしたキーがある階層で下記を実行します
    • EC2のDNS名などは実際の環境に合わせて実施してください
$ chmod 400 sample-accesskey.pem
$ ssh -i "sample-accesskey.pem" ec2-user@ec2-**-**-**-***.ap-northeast-1.compute.amazonaws.com

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-**-**-**-***.ap-northeast-1.compute.amazonaws.com' (ED25519) to the list of known hosts.
Last login: Sun Aug  6 08:27:38 2023 from 133-32-134-161.east.xps.vectant.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
2 package(s) needed for security, out of 2 available
Run "sudo yum update" to apply all updates.

EC2インスタンスに接続できました。

[ec2-user@ip- ~]$

"sudo yum update"を実行します。

[ec2-user@ip- ~]$ sudo yum update

EC2インスタンスにnginxをインストールして起動させる

そもそもnginxとは

オープンソースのWebサーバ用のソフトウェアです。

特徴として、

  • 処理性能重視
  • 高い並行処理性能
  • メモリ消費量を抑えやすい

などがあります。

インストール手順

yumだとインストールできないため、amazon-linux-extrasを使います。

[ec2-user@ip- ~]$ which amazon-linux-extras
/usr/bin/amazon-linux-extras

nginxをインストールします。

[ec2-user@ip- ~]$ sudo amazon-linux-extras install nginx1
Installing nginx
...
...

総ダウンロード容量: 2.4 M
インストール容量: 6.7 M
Is this ok [y/d/N]: y
...
...
完了しました!

インストールできたか確認します。

[ec2-user@ip- ~]$ nginx -v
nginx version: nginx/1.22.1

nginxを起動する

【補足】systemctlコマンド

CentOSやRedhat7系から利用できる、systemdをコントロールするコマンドです。

ちなみに、systemdは、Unix系のコンピュータのシステムを起動するときにカーネルによって最初に起動されるプログラムのことです。

$ systemctl status サービス名 / systemctl start サービス名

のような感じで使います。

起動手順

起動コマンドを打ちます。

[ec2-user@ip- ~]$ sudo systemctl start nginx

起動したかを確認します。

[ec2-user@ip- ~]$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2023-08-08 05:07:28 UTC; 52s ago
  Process: 2096 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 2091 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 2090 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 2098 (nginx)
   CGroup: /system.slice/nginx.service
           ├─2098 nginx: master process /usr/sbin/nginx
           └─2099 nginx: worker process

ブラウザから接続を確認する

http://[EC2のドメイン]にアクセスします。

すると、「このサイトにアクセスできません」の画面が表示されました。

セキュリティグループを確認したところ、80,443のポートは共に開いており、問題なさそうです。

AWSで80ポートを開いてるのに【このサイトにアクセスできません】が出るで同じような現象が紹介されていたので、参考に進めました。

まず、80番ポートが開かれているか確認します。

ちなみに、netstatコマンドはネットワーク関連の情報を確認するときのコマンドです。

$ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN 

開かれていないようです。

nginxの設定をリロードし、nginxを再起動します。

[ec2-user@ip- ~]$ sudo nginx -s reload
nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)

[ec2-user@ip- ~]$ sudo service nginx stop

[ec2-user@ip- ~]$ sudo nginx -t

[ec2-user@ip- ~]$ sudo service nginx start

[ec2-user@ip- ~]$ systemctl status nginx

再度、ポートを確認すると、80番ポートが開かれました。

-- 80ポートが開いた!
[ec2-user@ip- ~]$ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN    

再度、http://[EC2のドメイン] にアクセスすると、nginxのデフォルトページが表示されました。

nginxを停止する

[ec2-user@ip- ~]$ sudo nginx -s stop
[ec2-user@ip- ~]$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

Discussion