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

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

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

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Node.js

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

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

Q&A

解決済

2回答

3101閲覧

Node.js : apache リバースプロキシーをパスを使って実現したい

yiwsk

総合スコア39

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Node.js

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

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

0グッド

0クリップ

投稿2021/08/18 00:08

##背景
Node.jsのサーバーをport:3000で立ち上げています。
https://mydomain.com:3000
で正しく閲覧できています。

これをwebセキュリティーの厳しい環境で閲覧しようとすると、port:3000が許可されていないようで、閲覧できません。

そこで、https://officekaizen.tech/doku.php/node.js/apache%E3%81%A7https%E5%8C%96
を参考にして、サブドメインを取得して、https://app.mydomain.com
で閲覧できるようにしました。

ところが、今度は、app.mydomain.comがフィルタリングでブロックされてしまいます。

##実現したいこと
そこで、https://app.mydomain.com ではなく、https://mydomain.com/apphttps://mydomain.com:3000 が閲覧できるようにしたいのです。

##やってみたこと

apacheのssl.confを次のように書き換えてみました。

<VirtualHost *:443> <略> ServerName mydomain.com:443 ProxyPass /app https://mydomain.com:3000/ ←追加 ProxyPassReverse /app https://mydomain.com:3000/ ←追加 SSLProxyEngine On ←追加 <略> </VirtualHost>

##現状
すると、確かに、https://mydomain.com:3000/ のページは開くのですが、外部スクリプトファイルや外部スプレッドシートファイルを読み込んでくれないみたいです。

サブドメインではなく、パスを使って、リバースプロキシーを正しく実現する方法を教えて下さい。

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

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

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

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

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

maisumakun

2021/08/18 00:16

> 今度は、app.mydomain.comがフィルタリングでブロックされてしまいます。 何によるフィルタリングなのですか?
hentaiman

2021/08/18 00:21

ポートを変えたいだけなら3000を80とかに変えればいいのに
yiwsk

2021/08/18 00:32 編集

i-Filter というWebフィルタリングでドメインが未登録ということで、アクセスを拒否されます。 教育系なので、制限が厳しいのです。 app.mydomain.comを登録してもらえばいいのですが、組織が大きくて、やっかいなので、できれば自前で解決したいのです。 port80は、apacheが使っているので、Node.jsでは使えません。
yiwsk

2021/08/18 00:58

説明不足ですみません。 i-Filterは、ドメインをチェックしていて、子どもに見せられないようなWebページをブロックします。 mydomain.comは、i-Filterで、適格なドメインとして認められています。 しかし、取得したばかりの サブドメインの app.mydomain.comは、評価がなく、ブロックされてしまいます。 ですから、サブドメインの app.mydomain.com ではなく、mydomain.com/app あれば、アクセス可能です。
guest

回答2

0

自己解決

こんどこそ、解決しました!!と思ったのですが...

/socket.io もリバースプロキシーの対象にしなければならないので、

ProxyPass /socket.io https://mydomain.com:3000/socket.io ProxyPassReverse /socket.io https://mydomain.com:3000/socket.io

をssl.confに追加したら、動きました!!

と思ったら、新たな問題を発見!!

developer toolのコンソールに
websocket.js:88 WebSocket connection to 'wss://mydomain.com/socket.io/?EIO=4&transport=websocket&sid=josGyc2SfIYphA1IAAAe' failed:
というエラーが記録されています。

動くには動いているのですが、websocketがリバースプロキシーの対象になっていないため、エラーを起こしています。

色々と調べて、結局 ssl.confに

RewriteEngine on RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule /(.*) wss://mydomain.com:3000/$1 [P,L]

を追記したところ、エラーが消えました。

多分、これで、解決だと思います。
難しいです。

投稿2021/08/18 06:21

編集2021/08/20 09:20
yiwsk

総合スコア39

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

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

0

##解決した!と思ったのですが……

ProxyPass /app https://mydomain.com:3000/ ProxyPassReverse /app https://mydomain.com:3000/

の /app を/app/ としたら、一応正しく表示されました。
しかし、新たな問題が発生しました。

  1. 「GET https://mydomain.com/socket.io/socket.io.js net::ERR_ABORTED 404 (Not Found)」になりました。色々と検索して、試行錯誤してみましたがダメ。最後の手段として、むりやり、/socket.io フォルダを作り、そこにsocket.io.js を置いてみました。そうすると、エラーは出なくなって、解決!と思ったのですが、
  2. サーバーとクライアントの io.emit、 socket.on のイベントのやりとりができなくなった。

というわけで、動いていません。どちらの現象も、https://mydomain.com:3000 でも、https://app.mydomain.com でも発生しません。やはり、リバースプロキシーが適切にできていません。

投稿2021/08/18 01:02

編集2021/08/18 05:10
yiwsk

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問