はじめに
Node.jsで作成したアプリケーションを、AWS EC2でデプロイしました。
ポート3000番ではデプロイできたものの、80番でデプロイすることができず色々と調べたので、
調べた内容や、解決方法について記します。
実行環境
- AWS EC2 (Amazon Linux2 AMI)
- Apache 2.4.46
- Node.js 12.19.0
やりたかったこと
URLのポート番号表記を省略して、短いURLにしたかった。
http://hogehoge:3000/
→ http://hogehoge
https://www.google.com:443/ に接続したとき、
自動的にhttps://www.google.com/ にリダイレクトされることは知っていたので、*1
この応用で、3000ではなく80番ポートでデプロイすれば、
http:[パブリックIPv4アドレス]:3000/
→ http:[パブリックIPv4アドレス]
のようにポート番号の表記が省略され、URLを短くできると考えました。
*1
ホスト名のあとには、ポート番号が続くことになっていますが、たいてい省略されます。省略されている場合、スキームのプロトコルのウェルノウンポートになります。HTTPならTCPポート番号80番にアクセスします。ポート番号を指定する場合は、「:」のあとにポート番号を指定します。
URL ~Webサイト(Webページ)のアドレス~
引用に対する補足:443番もHTTPSとして、HTTP 同様にふるまいます。
困ったこと & エラー文
以下の画像のようなインバウンドルールにおいて、Node.jsで作成したアプリケーションを
ポート番号3000でnode app.js
すると、以下URLでWeb上に公開できました。
http:[パブリックIPv4アドレス]:3000/
一方で、ソースコードで指定したポート番号を3000から80番に変えると、
node app.js
の実行時に、以下のエラー文が返ってきました。
Error: listen EACCES: permission denied 0.0.0.0:80
解決方法
下記を参照して管理者権限で実行してみましたが、私の場合では別のエラーが発生しました。
$ sudo node app.js
sudo: node: command not found
サーバー立ち上げ時に小さいポート番号を指定すると、このエラーが発生します。
一般的には、管理者権限を持っていない場合では、1024番以下のポート番号にてサーバーをlistenすることはできないとのことですので、
sudo node app.js
と、管理者権限で実行するようにしましょう。
「listen EACCES 0.0.0.0:443」というエラーが出るとき
このエラーは、さらに別の記事を参照して解決を図りました。
下で引用した記事内では、おおまかに分けて3つの解決策が提示されていましたが、
私はその中でwhichコマンドを利用し、問題を解決しました。
$ sudo `which node` app.js
whichは指定したコマンドのパスを表示するコマンドで、Linuxでは$()で囲うとそのコマンドの出力結果をコマンドとして使えるという機能があるらしい。
sudo nodeでcommand not foundが表示される件
sudoを付けずにnodeを実行するときちんと実行されるのに何故なんだ・・?
と思って調べてみたら、どうやら原因は「sudo付きでコマンド実行すると環境変数であるPATHがスーパーユーザーのものに変わるから」だった。
sudo nodeでcommand not foundが表示される件