🔖

UbuntuサーバーでNginxを使用してnodejsアプリケーションを複数公開しよう

に公開

はじめに

expressjsを使用して作成した複数のアプリケーションをVPSに載せて公開する際の手順の備忘録です。

開発環境

サーバー

  • X-Server VPS
  • OS : Ubuntu24.04

Nodejs

  • nodejs : V20.19.5
  • express : V5.1.0

Nginxのインストール

まず初めに以下のコマンドでNginxをインストールします。

sudo apt install nginx

(Nodejs未インストールの場合)Nodejsのインストール

以下のコマンドでNodejsをインストールします。

sudo apt install -y curl
curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs -y

pm2のインストール

pm2とは、アプリケーションの管理を行えるプロセスマネージャーです。アプリケーションの起動や監視等が行え、本番環境に強いです。
以下のコマンドでグローバルにインストールします。

npm install -g pm2

pm2を使用してアプリケーションを永続化する

では、実際にpm2を使用してアプリケーションを立ち上げます。

pm2 start [PATH]

で立ち上げることができます。
起動中のアプリケーション一覧を見る場合には

pm2 list

を実行すると閲覧が可能です。
なお、pm2 start index.jsというようにして複数のアプリケーションを立ち上げると、同一のアプリケーション名で複数のアプリケーションが立ち上がる可能性があり、起動後の管理が複雑になってしまうことが考えられます。
これは、末尾に--name [APP NAME]を付けることで、この問題を防ぐことができます。

pm2 start [PATH] --name [APP NAME]

また、アプリケーション内でポートを指定していない場合は、アプリケーションを編集してポートを明示しておくと良いでしょう。
アプリケーションの立ち上げが完了したら、curlで起動しているかを確認してみます。
起動していない場合、何らかのエラーでアプリケーションが停止している可能性があります。
pm2 listでアプリケーションのstatusを確認してみましょう。

ufwを使用したファイアウォールの設定

ファイアウォールなしの公開は危険ですので、ufwを使用してファイアウォールを設定します。
まず、以下のコマンドでufwが有効か否かを確認します。

sudo ufw status

このコマンドを実行後、Status: activeとなっていればufwが有効であることを示し、Status: inactiveとなっていればufwが起動していないことを示しています。

ファイアウォールを有効にする

では、ufwを有効にしていきます。
有効にするには、以下のコマンドを実行します。

sudo ufw enable

これを実行することでファイアウォールが有効になります。

デフォルトでは拒否に設定する

では、SSH以外の方法(サーバーの管理画面から直接アクセスするなど)でサーバーに接続した状態で、ファイアウォールの設定を進めていきます。
まずは、サーバーへのアクセスをこちらが許可したところ以外はデフォルトで拒否するように設定していきます。
以下のコマンドで設定できます。

sudo ufw default deny

SSH用ポートを解放

次に、SSHで使用する22番ポート(もし変更している場合には適宜番号は読み替えてください)の解放を行います。
SSHではTCPプロトコルが使用されるため、TCPプロトコルでのみ許可するように設定を行います。
以下のコマンドで解放可能です。

sudo ufw allow 22/tcp

解放後はufwをリロードします。

sudo ufw reload

このコマンドを実行し、22番ポートを解放した後はSSH接続が可能になります。

Web公開用ポートを解放

Webを公開する際には80番ポート(http)と443番ポート(https)を使用します。
これらのポートもTCPプロトコルでのみ許可するようにしていきましょう。

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

解放したらufwをリロードしましょう。

sudo ufw reload

Nginxを使用して公開する

pm2を使用して公開したいアプリケーションを全て起動できたら、いよいよNginxで公開を行います。
ここでは、取得済みのドメインexample.comにサブドメインapp1,app2を追加して公開するという事にします。
なお、app1はlocalhost:3000、app2はlocalhost:3001で起動していると仮定します。

Nginxの起動

以下のコマンドで、Nginxが使用可能か確認して、起動します。

sudo systemctl enable nginx
sudo systemctl start nginx

リバースプロキシの設定

/etc/nginx/sites-available/app1.example.com/etc/nginx/sites-available/app2.example.comを作成し、以下のように編集します。

app1.example.com
server{
    listen 80;
    server_name app1.example.com;
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
app2.example.com
server{
    listen 80;
    server_name app2.example.com;
    location / {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

なお、location / {location/の間には必ず半角スペースが必要になります。忘れないようにしてください。
編集出来たら、以下のコマンドでサイトを使用可能にします。

sudo ln -s /etc/nginx/sites-available/app1.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/app2.example.com /etc/nginx/sites-enabled/

実行が完了したら、以下のコマンドでファイルに誤りがないかを確認して、Nginxを再起動します。

sudo nginx -t
sudo systemctl reload nginx

DNSの設定

利用中のDNSサービスにアクセスし、Aレコードに以下の内容を追加します。(IPアドレスはサーバーのグローバルアドレスにしてください)

Name IP
app1 123.45.67.89
app2 123.45.67.89

HTTPS化

以下のコマンドでcertbotをインストールし、SSL証明書を取得します。

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d app1.example.com -d app2.example.com

SSL証明書の自動更新

以下のコマンドで自動でSSL証明書の更新を行えるようになります。

sudo systemctl enable --now certbot.timer

設定ができているか確認するには、以下のコマンドを実行します。

sudo systemctl list-timers | grep certbot

もし手動で強制的に更新したい場合は以下のコマンドを実行します。

sudo certbot renew --dry-run

Defaultページの削除

現時点でapp1.example.comapp2.example.comにアクセスを行うと、Nginxのデフォルトページが出てきてしまいます。
以下のコマンドを実行して、デフォルトサーバーの設定が残っているかを確認します。

sudo grep -r "default_server" /etc/nginx/

実行した際にデフォルトサーバーの設定が残っていたら、以下のコマンドでデフォルトの設定を削除します。

sudo rm /etc/nginx/sites-enabled/default

これで、公開ができました。

Discussion