質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

2回答

2443閲覧

nodeにおけるWebサーバとAPIサーバの同居方法

gassigasigasi

総合スコア1

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2021/09/05 07:26

初投稿失礼します。(用語の使い方も間違っていたらご指摘いただけると幸いです)

前提・実現したいこと

1つのEC2インスタンス上に、クライアントサイドレンダリングなwebアプリを構築しようとしています。
クライアントはvue.jsで作成されており、node.js上で動くExpressで作成されたREST APIを叩いてデータのやり取りをします。

困っていること

機能が小さく負荷も大きくない想定のため、WebサーバとAPIサーバを同一のマシン(EC2)で動かそうとしています。このとき、サーバの立て方が複数考えられるのですが、以下の中に推奨されるor避けるべきものはありますでしょうか。
①一つのExpress上、同じポート内に、webサーバもAPIサーバも同居させる(/hogeでweb、/api/piyoでAPIとして機能)
②一つのExpress上、複数のサーバインスタンスを作り、それぞれ異なるポートを割り当てる
③それぞれ別アプリとして、nodeを複数立ち上げる
④どれだけ小さかろうと①〜③は邪道なので、EC2インスタンスを分けた方がいい

うまく説明できているかわかりませんが、ご意見をよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

AWSを活用する形で、「HTMLやJavaScriptなどの静的アセットはS3から配信して、EC2サーバはAPIに専念する」ような形も考えられます。

投稿2021/09/05 08:38

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gassigasigasi

2021/09/06 07:53

ご回答いただきありがとうございます。 S3を使用するは完全に盲点でした…選択肢の一つとして検討してみようと思いました。
guest

0

ベストアンサー

①はありですが、②と③は無駄な感じがしますね
動的処理を要さないWEBページの為にexpressと別建ててnodeを使うメリットがありません、SSLの事など考えれば無駄手間です
サーバーインスタンスは同一で良いと思いますが、ノンブロッキングなWEBサーバーでリクエストを全て受けてAPIへのリクエストのみproxyさせれば良いと思います
つまり①~④のどれでもありません

ただしnodejs以外の知識が皆無だがnodejsさえ使えるならsslに限らずWEBサーバーで必要な要件を満たした処理を作れるのなら②や③でもいいかもしれません、新たに学習しないで済むというのがメリットでしょう

①は邪道では無いし、④が王道という事もありません
好きにすれば良いです
そのシステムが事業目的だとしてシステムに当てられる資本金が十分にあり、金に物言わせて利用者を拡大する手段が有るのなら将来を見越した構成で作ると言うのもありですけど、そうでないなら質問者にとって一番簡単で一番金の掛からない方法を選択するのがベストです

投稿2021/09/05 08:01

hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gassigasigasi

2021/09/06 07:50

ご回答いただきありがとうございます。 今までの少ない経験の中では④のイメージ(それもAPIサーバ側はSpringのみ)が強く、それゆえ①の「同一のポートでWebサーバとしての機能とAPIサーバとしての機能が解放されている状態」というのが一般的に行われることなのかがわかっておりませんでした。 ご教示いただいた > ノンブロッキングなWEBサーバーでリクエストを全て受けてAPIへのリクエストのみproxyさせれば良いと思います をみると、むしろ外部向けに公開されているポートとしては揃っていて問題ないということだと理解しました(CORSあたりが関係あるのかなと推測しています、内容は勉強中ですが…)
hentaiman

2021/09/06 10:07

javaの事は分かりませんが、④にして片方静的片方動的にすると負荷が違い過ぎてインスタンスが勿体ないかなって気もしますね 静的なものをショボインスタンスにして動的なものを贅沢インスタンスにする考えもあるのかもしれませんが ELB配下に複数台置いて同一インスタンス内で静的動的どちらも処理(ただの負荷分散)しているものもありますし、システム的なベスト構成よりもまずは費用を安くしそれなりに動く状態でヨシとしているのかもしれません ※システムが大当たりすれば当然もっとまともな構成にするでしょう > 、むしろ外部向けに公開されているポートとしては揃っていて問題ない 揃っているというかAPI的なものは公開しません WEBサーバーがURL見てAPI用のURLなら内部ネットワークのIP使ってAPIサーバーにproxyするという事です
gassigasigasi

2021/09/06 10:56

詳細なご回答ありがとうございます。本当に色々な構成がありうるのですね… ご教示いただいた構成をきちんと理解できておらず恥ずかしい限りです… 私の理解では * nginxなどで80番ポートにvueで作った静的ファイルを公開 * nodeでAPIサーバを3000番ポートで起動 * http://xxxxx/apiにきたものはhttp://localhost:3000/apiにproxy (?) ← proxyを正しく理解できていない気がするのですが、実質的に前者のURLでAPIとして機能すると解釈しました。この意味で外から見ればAPIは80番ポートで公開されているようなものと思いこのような表現になりました。 おそらく初歩的な勘違いがある気がするのですが、上記解釈で間違いがあればご指摘いただけると幸いです。(これ以上は本題とずれるということであれば、一旦この質問は閉めさせていただきます)
hentaiman

2021/09/06 11:05 編集

> この意味で外から見ればAPIは80番ポートで公開されているようなもの そういう意味ならほとんど合ってますが、3000公開しちゃってはダメですね > * nodeでAPIサーバを3000番ポートで起動 これをlistenする時にlocalhost限定にする proxyではlocalhostの3000に飛ばす 構成は色々ですね、金次第 金次第なので、仕事で使うシステムならもうちょっと利用者人数(アクセス数や負荷)や見込める利益などを計算してから構成考える方が良いと思います
gassigasigasi

2021/09/06 11:21

ありがとうございます。今までクライアントのjavascriptから直接APIサーバ(別ポート)を叩いているものしか知らなかったので、proxyするとは思いもよりませんでした。 構成についても、今後経験をつんで感覚を得ていきたいと思います。 この度はご丁寧かつ迅速な回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問