Amazon Linux 2023 + Next.js で Hello World を表示させる

EC2 Amazon Linux 2023 にて Next.js をインストールして、
ブラウザに hello world を表示させるまでのメモ。

環境

  • AWS
  • EC2 Amazon Linux 2023
  • Nginx 1.24.0
  • Node.js 22.9.0(18.17 以上必要)
  • 作業ユーザーは ec2-user
  • 管理者は root

Node.js のインストール

Next.js のインストール

No / Yes は自身の環境に合わせる。
project name は適当に app にしておく。

$ /path/to/your-product
$ npx create-next-app@latest
What is your project named? app
Would you like to use TypeScript? No / Yes
Would you like to use ESLint? No / Yes
Would you like to use Tailwind CSS? No / Yes
Would you like to use `src/` directory? No / Yes
Would you like to use App Router? (recommended) No / Yes
Would you like to customize the default import alias (@/*)? No / Yes
What import alias would you like configured? @/*

PM2

PM2 とは

Advanced, production process manager for Node.JS

とのこと。
JS フレームワークを常駐化するための便利なパッケージ。
プロセス管理ツール。

PM2 のインストール

$ npm install -g pm2

Next.js ビルド& PM2 で常駐化

/path/to/your-product/app/ecosystem.config.js

プロダクト毎にポート番号(デフォルトは3000)を分ける時は、
pm2 の設定ファイルを用意する。

必要最低限の設定内容。

module.exports = {
  apps: [{
    script: 'node_modules/.bin/next',
    args: 'start',
    env_production: {
        name: "your-product",
        NODE_ENV: "production",
        PORT: 3000,
    },
    env_staging: {
        name: "your-product-staging",
        NODE_ENV: "staging",
        PORT: 3001,
    }
  }]
}

ビルド&常駐化

$ cd /path/to/your-product/app

# ビルド
$ npm run build

# 常駐化
# /path/to/your-product/app 上で pm2 コマンドを叩く
#$ pm2 start npm --name your-product -- start

# Production(ポート番号3000)
$ pm2 start ecosystem.config.js --env production

# Staging(ポート番号3001)
$ pm2 start ecosystem.config.js --env staging

プロセスの再起動

$ pm2 reload your-product

プロセスの停止

$ pm2 stop your-product

管理しているプロセスの削除

$ pm2 delete your-product

# 全削除
$ pm2 kill

管理しているプロセスの確認

$ pm2 list
# もしくは
$ pm2 ls

Nginx の設定

/etc/nginx/conf.d/your-product.conf

必要最低限の設定。

upstream your_product {
   server localhost:3000;
}

server {
    listen       80;
    listen  [::]:80;
    # server_name  your.prod.com;
    server_name  localhost;


    proxy_redirect                          off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://your_product/;
    }

    index index.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    	root   /usr/share/nginx/html;
    }


    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
    	deny  all;
    }
}

確認

該当サーバーの IP アドレスにアクセスすると、 hello world が表示されている。と思う。