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を作成し、以下のように編集します。
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;
}
}
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.comやapp2.example.comにアクセスを行うと、Nginxのデフォルトページが出てきてしまいます。
以下のコマンドを実行して、デフォルトサーバーの設定が残っているかを確認します。
sudo grep -r "default_server" /etc/nginx/
実行した際にデフォルトサーバーの設定が残っていたら、以下のコマンドでデフォルトの設定を削除します。
sudo rm /etc/nginx/sites-enabled/default
これで、公開ができました。
Discussion