[nuxt.js] Amazon Linux2 への Nuxt.js の導入と systemd でのデーモン化

# インストール

## Node.js のインストール

```bash
$ curl --silent --location https://rpm.nodesource.com/setup_14.x | sudo bash -
$ sudo yum install nodejs
$ node --version
v14.19.0
$ npm --version
6.14.16
```

## vue-cli のインストール

```bash
$ sudo npm install -g @vue/cli
$ vue --version
@vue/cli 4.5.15
```

## Nuxt.js アプリケーションの作成

```bash
$ pwd
/home/ec2-user
$ npx create-nuxt-app my-project
```

## Nuxt.js アプリケーションの build と動作確認

```bash
$ pwd
/home/ec2-user/my-project
$ npm run build
$ npm run start

> my-project@1.0.0 start /home/ec2-user/my-project
> nuxt start


   ╭───────────────────────────────────────╮
   │                                       │
   │   Nuxt @ v2.15.2                      │
   │                                       │
   │   ▸ Environment: production           │
   │   ▸ Rendering:   server-side          │
   │   ▸ Target:      static               │
   │                                       │
   │   Listening: http://localhost:3000/   │
   │                                       │
   ╰───────────────────────────────────────╯

ℹ Serving static application from dist/                    
```

```bash
$ curl -i http://localhost:3000/
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Thu, 09 Dec 2021 04:12:21 GMT
ETag: W/"227ef-17d9d646088"
Content-Type: text/html; charset=UTF-8
Content-Length: 141295
Vary: Accept-Encoding
Date: Wed, 09 Feb 2022 00:34:50 GMT
Connection: keep-alive
Keep-Alive: timeout=5

<!doctype html>
<html data-n-head-ssr>
  <head>
 :
```

# systemd でのデーモン化

以下のファイルを `/etc/systemd/system/nuxt.service` として作成

```conf:/etc/systemd/system/nuxt.service
[Unit]
Description=nuxt app # アプリケーションの説明(任意)
After=syslog.target network.target
 
[Service]
Type=simple
ExecStart=/usr/bin/npm run start
WorkingDirectory=/home/ec2-user/my-project
KillMode=process
Restart=always
User=ec2-user
Group=ec2-user

[Install]
WantedBy=multi-user.target
```

上記のファイルの内容を修正した場合は daemon-reload すること

```bash
$ sudo systemctl daemon-reload
```

## 起動、終了、再起動

`systemctl` コマンドで実施する

```bash:起動
$ sudo systemctl start nuxt.service
```

```bash:終了
$ sudo systemctl stop nuxt.service
```

```bash:再起動
$ sudo systemctl restart nuxt.service
```

```bash:自動起動登録
$ sudo systemctl enable nuxt.service
```

## 稼働状況の確認

動作しているかの確認は `systemctl status` で

```bash:状況確認
$ sudo systemctl status nuxt.service
● nuxt.service - nuxt app
   Loaded: loaded (/etc/systemd/system/nuxt.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2022-02-09 09:44:07 JST; 8s ago
 Main PID: 16440 (npm)
   CGroup: /system.slice/nuxt.service
           ├─16440 npm
           └─16451 node /home/ec2-user/my-project/node_modules/.bin/nuxt start
 :
```

ログは `journalctl` で確認可能

```bash
$ sudo journalctl -u nuxt.service
-- Logs begin at 金 2021-09-24 18:13:40 JST, end at 水 2022-02-09 09:47:07 JST. --
 2月 08 14:20:09 ip-0-0-0-0.ap-northeast-1.compute.internal systemd[1]: Started nuxt app.
 2月 08 14:20:09 ip-0-0-0-0.ap-northeast-1.compute.internal systemd[1]: nuxt.service: main process exited, code=exited, status=1/FAILURE
 2月 08 14:20:09 ip-0-0-0-0.ap-northeast-1.compute.internal systemd[1]: Unit nuxt.service entered failed state.
 2月 08 14:20:09 ip-0-0-0-0.ap-northeast-1.compute.internal systemd[1]: nuxt.service failed.
 2月 08 14:20:09 ip-0-0-0-0.ap-northeast-1.compute.internal systemd[1]: nuxt.service holdoff time over, scheduling restart.
 2月 08 14:20:09 ip-0-0-0-0.ap-northeast-1.compute.internal systemd[1]: Stopped nuxt app.
 2月 08 14:20:09 ip-0-0-0-0.ap-northeast-1.compute.internal systemd[1]: Started nuxt app.
 :
 ```

# 参考にした記事
[AmazonLinux2へNuxt.js導入手順](https://qiita.com/deehii/items/58e6da680f322fce10ff)
[centos7で標準のsystemdを使いnode.js製サーバーをデーモン化する](https://qiita.com/you21979@github/items/588bddb59378ce7303a2)