ハードウェアからサーバ・アプリまでワンストップで開発

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で直接ウェブサーバ的なことをしようと思うと、こういった問題に当たってしまうようです。滅多にしないことなので、問題になる人はそんなに多くはないとは思いますけど。

最近のエントリー

Hieronymusのインボイス番号対応について

会計システム「Hieronymus」の現状

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル