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

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

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

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

Express

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

Q&A

解決済

1回答

2457閲覧

Node.jsのExpress.listen()の仕様について

mirazle

総合スコア9

Node.js

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

Express

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

0グッド

2クリップ

投稿2018/04/02 09:22

編集2018/04/02 09:23

Expressなどで.listen( 443 )をして「netstat -tanp | grep 443」とすると

tcp6 0 0 :::443 :::*

と表示されます。
これはこのサーバー上の全てのIPの443ポートを占有している状態かと思うのですが、
Expressを使ってサブドメイン毎に同じポートNOを割り振ることは出来るのでしょうか。

https://github.com/bmullan91/express-subdomain
https://github.com/wilsonpage/express-subdomain-handler

などのライブラリを試してみましたが、
Error: listen EADDRINUSE :::443とエラーになってしまい実現出来ませんでした。
そもそものNode.jsのlistenに関わる仕様の部分を調べてみましたが、
言及している箇所が見つかりませんでした。

お手数おかけしますが、どなたかご教授いただけると幸いです。

----------------------(前提)-----------------------
nginxやApacheを使ってサブドメイン毎にポートNOを割り振るのではなく、
Node.jsだけで完結するシステムを考えています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

そもそものNode.jsのlistenに関わる仕様の部分を調べてみましたが、

言及している箇所が見つかりませんでした。

expressのapp.listen()はNodeのhttpモジュールのhttp.Server.listen()と同じであり、http.Server.listen()はまた、Nodeのnetモジュールのnet.Server.listen()であるので、
以下のリンク先が「listenに関わる仕様の部分」に該当すると思います。

https://nodejs.org/api/net.html#net_server_listen

One of the most common errors raised when listening is EADDRINUSE. This happens when another server is already listening on the requested port / path / handle. One way to handle this would be to retry after a certain amount of time:

リンク先に記載がある通り、同じポート番号をlistenしようとするとエラーになってしまいます。

express-http-proxyhttp-proxyなどのリバースプロキシーをサポートするライブラリを使って、1つのポート番号へのリクエストを別のポート番号に転送してあげるなどする必要があるかと思います。

参考1 - プロキシーで
https://www.google.co.jp/amp/www.usagi1975.com/15mar161859/amp/

参考2 - バーチャルホストで
http://www.nilab.info/z3/20150503_01_nodejs_express_name_based_virtual_hosting.html

https://github.com/expressjs/vhost

投稿2018/04/02 10:30

編集2018/04/02 19:51
HayatoKamono

総合スコア2415

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

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

mirazle

2018/04/02 13:26

ご回答ありがとうございます。 > リンク先に記載がある通り、同じポート番号をlistenしようとするとエラーになってしまいます。 やはり仕様なのですね。 なる程と思い下記のようにexpress-http-proxyを実装してみたのですが、 結局443番をNodeで複数回.listen()させることになり、 やはりError: listen EADDRINUSE :::443になってしまします。 // Proxy Setting1 const proxyApp = express(); const proxyRouter = express.Router(); proxyApp.use( subdomain('client', proxyRouter) ); proxyApp.use('/', proxy('example.com:8000') ); const proxyOptions = {key: fs.readFileSync( KEY_PEM ), cert: fs.readFileSync( CERT_PEM )}; const proxyServer = https.createServer( proxyOptions, proxyApp ); proxyServer.listen( 443, () => { console.log( 'LISTEN PROXY 443' ); }); 自分としてはnpm install一発で環境構築が完結するようにしたいのですが、 やはり素直にnginxなどに任せたほうが良いのでしょうか?
mirazle

2018/04/03 13:55

教えて頂いた http://www.usagi1975.com/15mar161859/ の記事のhttpをhttpsに変更、サブドメイン毎に発行していたhttpsの証明書を Letsencryptのワイルドカード生成、プロキシサーバーに当てて解決出来ました。 私の前提知識が足らない中、ヒントを下さりありがとうございましたm_ _m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問