以前から作成していたwebアプリを実際に使えるようにしたいと思い、サーバーに上げてみました。思い込みと、ネットの情報に振り回され、とほほという感じです。
今回仮公開したアプリは個人用のAPIサーバーであり、今のところ公開予定はありません。以前から興味のあったjavascript(node.js)に触れてみたいと思って作っただけの試作品です。
作業をしてみて、次の項目が大きな課題でした。
- dockerコンテナ間の連携
- リバースプロキシの設定
- サブディレクトリに配置したアプリのパス解決
Dockerコンテナ間の連携
今回の目的の一つは、webアプリをDockerコンテナとしてデプロイすることでした。ホームページ配信用webサーバーからwebアプリにアクセスするためには、リバースプロキシの設定が必要です。ところが、今回はwebサーバーとwebアプリが別のコンテナになっているので、リバースプロキシはwebアプリコンテナの動的なIPアドレスを知ることができません。最初このことを忘れていて、無駄に苦労してしまいました。
解決法としては、nginxの設定の中でresolver
にDockerのEmbeddedDNSサーバーである127.0.0.11
を指定することで、ホスト名(コンテナ名)からIPアドレスを引けるようにすることでした。
後から気が付いたのですが、Dockerのネットワークはもっと詳細な設定ができるようなので、全てのコンテナに静的なIPアドレスを付与してもよかったかもしれません。
リバースプロキシの設定
これは、webの情報に踊らされた形となりました。有名なQ&Aサイトのstackoverflowの中ですら、答えが何種類もあり、何が正しいのかよく分かりません。ただ、nginxのドキュメントは意外と丁寧です。リバースプロキシする際に、正規表現を使ってrewrite
したりする必要が無いことも書いてありました。
サブディレクトリに配置したアプリのパス解決
リバースプロキシの設定ができ、ようやくwebアプリが表示できる・・・と思った矢先に登場した問題でした。サブディレクトリにwebアプリを配置すると、webアプリがルートディレクトリにあるものとして書かれたパスが無効になります。webアプリが返すレスポンスヘッダはnginxのproxy_redirect
等で書き換えられるものの、レンダリングしたHTMLファイルの中の文字列は自力で対処しなければなりません。このことは完全に盲点でした。express.jsでこれを回避することはできるのだろうか?
まだまだ未解決の課題がありますが、今日はこのくらいにしておきます。