LoginSignup
0
0

More than 1 year has passed since last update.

Expressで作成したウェブサーバをSystemdに登録してsystemctlで起動させる

Last updated at Posted at 2022-11-02

概要

はじめに

  • Node.jsを使用してWebアプリケーションを構築し、Unixの上でApacheと同様に常に起動させる方法について今回説明します。
  • 対象はUnixについて多少知識がある方、Expressなどでウェブサーバの作成ができる方です。
  • ShellScriptを作成して実行しますが、ShellScript内は、シェパン(#!/bin/bash)とnodejsを実行させるコマンドのみなので、構えなくても大丈夫です。

やりたいこと

  • Expressで作成したWebサーバをSystemdに登録して、systemctlを使用して常に起動させたい。

環境

対象OS

  • Debian/Ubuntu
  • RHEL/CentOS Stream
  • RHEL/Amazon Linux2

npmパッケージ

手順

1. ディレクトリ作成とファイルの作成

  • ディレクトリ作成
mkdir
$mkdir MyProject
  • ディレクトリ内に移動
cd
$cd MyProject

2. npm 初期化とパッケージのインストール

npmの初期化

npm
$npm init

Expressのインストール

npm install
$npm i express --save

3. ソースコード準備

今回は、サンプルとしてGETで/にアクセスしたらhello worldが表示される処理を作成。

MyProject/index.js
const express = require('express');
const app = express();

app.get('/',(req,res)=>{
    res.send('hello world');
});

app.listen(3000,()=>{
console.log("Server Start: Posr 3000");
});

4. ShellScriptファイル作成

ShellScriptファイルを作成

  • MyServerという実行可能ファイルを出力します。-oの後に実行可能ファイルの名前を指定できますが、ここは自由に変更可能です。
  • -oのオプションをつけない場合は、プロジェクト名(今回の場合、MyProject)で出力されます。
vi ~/MyServer
$vi ~/MyServer
/usr/bin/MyServer
#!/bin/bash
node ~/MyProject/index.js

5. ShellScriptファイルをパスの効いたディレクトリに移動

/usr/bin/にSellScriptファイルを移動

$sudo mv ~/MyServer /usr/bin/
  • パスが通っているディレクトリは、下記のコマンドで確認できます。
echo $PATH

6. Systemdの設定

/etc/systemd/system/MyServer.serviceの作成

  • /etc/systemd/system/内に新たに/etc/systemd/system/MyServer.serviceファイルを作成
$sudo vi /etc/systemd/system/MyServer.service
  • /etc/systemd/system/MyServer.service内にの設定を記述
/etc/systemd/system/MyServer.service
[Unit]
Description = MyServer

[Service]
ExecStart = /usr/bin/MyServer
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

7. systemcltのdaemon-reloadでdaemonリロード

systemctlのdaemonをリロードしてMyService.serviceファイルをUnitに認識させる

$sudo systemctl daemon-reload
  • Unitに認識できているかは下記のコマンドで確認できます。
$sudo systemctl list-unit-files --type=service | grep MyServer

8. systemctlで起動できるか確認

起動コマンドコマンド実行

$sudo systemctl start MyServer

正常に動作できているか確認

$sudo systemctl status MyServer
  • 正常に動作できている場合の表示
● MyServer.service - MyServer
     Loaded: loaded (/etc/systemd/system/MyServer.service; disabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-11-02 13:25:31 JST; 3s ago
   Main PID: 111384 (sesm)
      Tasks: 6 (limit: 9000)
     Memory: 16.7M
     CGroup: /system.slice/MyServer.service
             └─111384 /usr/bin/MyServer
11月 02 13:25:31 ubuntu-pc systemd[1]: Started MyServer.
11月 02 13:25:33 ubuntu-pc MyServer[111384]: Server Listening : Port 3000

  • 不具合の場合の表示
● MyServer.service - 
     Loaded: loaded (/etc/systemd/system/MyServer.service; disabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Wed 2022-11-02 13:24:47 JST; 1s ago
    Process: 111093 ExecStart=/usr/bin/MyServer (code=exited, status=203/EXEC)
   Main PID: 111093 (code=exited, status=203/EXEC)
  • 不具合の原因については、上記のメッセージの下に、処理のログが表示されます。
  • エラーメッセージなどが表示されるので、参考にしながら原因の解決を行なってください。

以上で完了! 補足情報

  • 以上で設定は完了になります。
  • サーバをストップさせるには下記のコマンドを使用します。
$sudo systemctl stop MyServer
  • サーバの再起動の場合は
$sudo systemctl restart MyServer
  • サーバ本体の再起動などを行なった際に自動でMyServerを起動する場合
$sudo systemctl enable MyServer
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0