ogochan
Napierを動くようにしようと思って、80も443も開いてないインスタンスに置きました。
いくつか不備があったのでそれは修正中です。
と言うのは良いとして、表題のようなことになってしまいました。
通常、何かウェブアプリを作った時は、直接サービスで使うポート(80とか443とか)を開かないで、ロードバランサやプロキシで受けて、それを適当なポートにマッピングします。
その方が後からいろいろいじりたい時に楽だったりしますし、スケールさせたい時に都合が良いからです。
とは言え、Napierはプロキシなので、自分で直接port 80や443を開きたいと考えました。変にロードバランサやプロキシを通すと、あれやこれやで面倒臭いことになるからです。
UNIX系OSを使っている人にとっては、一般ユーザがwell-known portを開こうとするとEACCESSになるというのは常識です。
そんなことは言われなくてもわかっているので、
$ sudo npm run server
とするわけです。
そうやってブラウザからアクセスしてみると、
ERR_CONNECTION_REFUSED
とか出るわけです。
最初はAWSのセキュリティ設定がおかしいのかと思って調べてみるのですが、別に間違いがあるわけではありません。
そこでよく起動ログを見ていると、ポート80を開こうとしているところで、EACCESSになっています。
おかしいなーと思ってポートを8000にしてみると、普通に動いてしまいます。
つまり、rootで動かしてもポート80は開けないわけです。
適当にググってみても、
「一般ユーザだから良くないんだ。rootにしてみろよ。そんなもの常識だろ」
みたいなのしか見つかりません。いやいや、こっちそんな素人じゃねーしとか思いながら探してもそんなのばかりですし、「Node.jsでウェブサーバを作る」的なエントリも当たり前のように「80を開けばポート番号指定しなくても開けるんだよ」みたいなことしか書いてありません。丁寧なところでも「一般ユーザはダメだからrootにしないと動かせないけど、rootで動かすといろいろ危ないから」みたいな話が書いてあるだけです。
調べているうちに、「多分これは環境とかUbuntuとかそーゆーのは関係ない」ということに気がつきました。つまり、Node.js固有の現象らしいのです。
それで検索キーに「node.js」を加えてググっていたら、
Macos Big Sur port 80 permission denied with root
というのを見つけました。まさに私が当たった問題で悩んでいる人がいたようです。
対策としては、
$ sudo chown root .
とするだけです。こうしておくと、root権限でNode.jsが動くので、well known portも開けるわけです。もちろん、root権限で動いてしまうので、そういったことは対策が必要ですが。
これはどうも、比較的最近(npmの6から7の間あたり)セキュリティ絡みの修正が入って、Node.jsをrootで動かそうとすると起動したディレクトリのオーナにsudoされてから動くようになったらしいです。まぁ、一種のsuexecですね。セキュリティ的には妥当と言えば妥当な修正だと思います。
とは言え、ググってもなかなかその辺の情報は出て来ないですね。「みんなわかってるよね」的にスルーされているか、古い情報でドヤってるかどちらかのエントリばかり見つかります。
まぁそんなグチは良いとして、Node.jsで直接ウェブサーバ的なことをしようと思うと、こういった問題に当たってしまうようです。滅多にしないことなので、問題になる人はそんなに多くはないとは思いますけど。