OS起動時にPM2でPort 80でNodeサーバーを起動する

LinuxではWell-known portでListenするのにroot権限が必要で、一般ユーザーでは例えばNode.jsでサーバーを80番ポートで起動したりすることはできない。とはいえroot権限があれば実行できるので、手動で起動するときはsudo node app.js とかsudo pm2 start app.js とかやってしまうのだけど、OS起動時にPM2によって80番ポートでNode.jsサーバーを自動起動しようとするとひと手間要る。

調べてみると、authbind というツールを使って特定のWell-known portを一般ユーザーでもListenできるようにすることができるみたい。

pm2.keymetrics.io

(以下の手順はUbuntu 20.04 64bit, Node.js 14.15.5, npm 6.14.11 な環境で実行)

authbind はUbuntuだと apt install で導入できる。

sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown %user% /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80

%user% のところはユーザー名を指定する。例えばubuntu とか。
あとはsystemd で自動起動の設定をすればOK。いろいろ端折るがこんな感じでやればよい。

/etc/systemd/system/sampleapp.service

[Unit]
Description=Sample App

[Service]
Type=forking
User=ubuntu
ExecStart=/usr/bin/authbind --deep pm2 start /PATH/TO/app.js
Restart=always

[Install]
WantedBy=multi-user.target
sudo systemctl enable sampleapp.service 

本番環境ではNginxとかApacheを前段に置くことが多いのであまりこういうことはしないと思うが、ちょっとした開発物を共有したりデモするときには使える小技かも?